Plugin Directory

Changeset 3397480


Ignore:
Timestamp:
11/17/2025 06:14:03 PM (5 months ago)
Author:
constantcontact
Message:

release version 2.14.2

Location:
constant-contact-forms
Files:
797 added
6 edited

Legend:

Unmodified
Added
Removed
  • constant-contact-forms/trunk/assets/js/ctct-plugin-frontend.js

    r3389849 r3397480  
    3030/***/ (function() {
    3131
    32 eval("{/**\n * Front-end form validation.\n *\n * @since 1.0.0\n */\n\nwindow.CTCTSupport = {};\n(function (window, app) {\n  /**\n   * @constructor\n   *\n   * @author Constant Contact\n   * @since 1.0.0\n   */\n  app.init = function () {\n    app.cache();\n    app.bindEvents();\n  };\n\n  /**\n   * Cache DOM elements.\n   *\n   * @author Constant Contact\n   * @since 1.0.0\n   */\n  app.cache = function () {\n    app.cache = {\n      forms: []\n    };\n    var wrapper = document.querySelectorAll('.ctct-form-wrapper');\n    if (wrapper.length) {\n      wrapper.forEach(function (formWrapper) {\n        var found = formWrapper.querySelector('form');\n        if (found) {\n          app.cache.forms.push(found);\n        }\n      });\n    }\n    app.cache.forms.forEach(function (form, index) {\n      app.cache.forms[index].honeypot = form.querySelector('.ctct_usage_field');\n      app.cache.forms[index].submitButton = form.querySelector('input[type=submit]');\n      app.cache.forms[index].recaptcha = form.querySelector('.g-recaptcha');\n    });\n    app.timeout = null;\n  };\n\n  /**\n   * Remove the ctct-invalid class from elements that have it.\n   *\n   * @author Constant Contact\n   * @since 1.0.0\n   */\n  app.setAllInputsValid = function () {\n    app.cache.forms.forEach(function (form) {\n      var invalid = form.querySelectorAll('.ctct-invalid');\n      Array.from(invalid).forEach(function (field) {\n        field.classList.remove('ctct-invalid');\n      });\n    });\n  };\n\n  /**\n   * Adds .ctct-invalid HTML class to inputs whose values are invalid.\n   *\n   * @author Constant Contact\n   * @since 1.0.0\n   *\n   * @param {object} error AJAX response error object.\n   */\n  app.processError = function (error) {\n    // If we have an id property set.\n    if ('undefined' !== typeof error.id) {\n      var invalid = document.querySelectorAll('#' + error.id);\n      Array.from(invalid).forEach(function (theInvalid) {\n        theInvalid.classList.add('ctct-invalid');\n      });\n    }\n  };\n\n  /**\n   * Check the value of the hidden honeypot field; disable form submission button if anything in it.\n   *\n   * @author Constant Contact\n   * @since 1.0.0\n   *\n   * @param {object} event The change or keyup event triggering this callback.\n   * @param {object} honeyPot The object for the actual input field being checked.\n   * @param {object} submitButton The object for the submit button in the same form as the honeypot field.\n   */\n  app.checkHoneypot = function (event, honeyPot, submitButton) {\n    // If there is text in the honeypot, disable the submit button.\n\n    // Leaving this disabling in place because it should not be getting used by screen readers in the first place, and I feel it's going to help more than hurt to keep.\n    if (0 < honeyPot.value.length) {\n      submitButton.setAttribute('disabled', 'disabled');\n    } else {\n      submitButton.removeAttribute('disabled');\n    }\n  };\n\n  /**\n   * Ensures that we should use AJAX to process the specified form, and that all required fields are not empty.\n   *\n   * @author Constant Contact\n   * @since 1.0.0\n   *\n   * @param {object} form object for the form being validated.\n   * @return {boolean} False if AJAX processing is disabled for this form or if a required field is empty.\n   */\n  app.validateSubmission = function (form) {\n    if ('on' !== form.getAttribute('data-doajax')) {\n      return false;\n    }\n    var fields = form.querySelectorAll('[required]');\n    Array.from(fields).forEach(function (field) {\n      if (false === field.checkValidity()) {\n        return false;\n      }\n    });\n    return true;\n  };\n\n  /**\n   * Prepends form with a message that fades out in 5 seconds.\n   *\n   * @author Constant Contact\n   * @since 1.0.0\n   *\n   * @param {object} form object for the form a message is being displayed for.\n   * @param {string} message The message content.\n   * @param {string} classes Optional. HTML classes to add to the message wrapper.\n   * @param {string} role Role attribute for accessibility.\n   */\n  app.showMessage = function (form, message) {\n    var classes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n    var role = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'log';\n    var wrapper = form.parentElement;\n    if (wrapper.querySelector('p.ctct-message')) {\n      wrapper.querySelector('p.ctct-message').remove();\n    }\n    var message_tag = document.createElement('p');\n    message_tag.setAttribute('class', 'ctct-message ' + classes);\n    message_tag.setAttribute('role', role);\n    message_tag.innerHTML = message;\n    var dismiss_btn = document.createElement('button');\n    dismiss_btn.setAttribute('class', 'button button-secondary ctct-dismiss ctct-dismiss-ajax-notice');\n    dismiss_btn.setAttribute('aria-label', 'Dismiss notification');\n    dismiss_btn.innerHTML = '&#10005;';\n    message_tag.prepend(dismiss_btn);\n    form.parentElement.prepend(message_tag);\n    wrapper.querySelector('.ctct-dismiss-ajax-notice').addEventListener('click', function () {\n      this.parentElement.remove();\n    });\n  };\n\n  /**\n   * Submits the actual form via AJAX.\n   *\n   * @author Constant Contact\n   * @since 1.0.0\n   *\n   * @param {object} form object for the form being submitted.\n   */\n  app.submitForm = function (form) {\n    var data = new FormData();\n    var formData = new FormData(form);\n    var formParams = new URLSearchParams(formData);\n    data.append('action', 'ctct_process_form');\n    data.append('data', formParams);\n    var options = {\n      method: 'POST',\n      body: data\n    };\n    fetch(window.ajaxurl, options).then(function (response) {\n      return response.json();\n    }).then(function (response) {\n      if ('undefined' === typeof response.status) {\n        return false;\n      }\n      if ('success' !== response.status) {\n        if ('undefined' !== typeof response.errors) {\n          app.setAllInputsValid();\n          response.errors.forEach(app.processError);\n        } else {\n          app.showMessage(form, response.message, 'ctct-error', 'alert');\n        }\n        return false;\n      }\n      form.style.display = 'none';\n      // If we're here, the submission was a success; show message and reset form fields.\n      app.showMessage(form, response.message, 'ctct-success', 'status');\n      form.reset();\n    });\n  };\n\n  /**\n   * Handle the form submission.\n   *\n   * @author Constant Contact\n   * @since 1.0.0\n   *\n   * @param {object} event The submit event.\n   * @param {object} form object for the current form being handled.\n   * @return {boolean} False if unable to validate the form.\n   */\n  app.handleSubmission = function (event, form) {\n    if (!app.validateSubmission(form)) {\n      return false;\n    }\n    clearTimeout(app.timeout);\n    if (form.checkValidity()) {\n      app.timeout = setTimeout(app.submitForm, 500, form);\n    }\n  };\n\n  /**\n   * Set up event bindings and callbacks.\n   *\n   * @author Constant Contact\n   * @since 1.0.0\n   */\n  app.bindEvents = function () {\n    app.cache.forms.forEach(function (form) {\n      var thesubmit = form.querySelector('[type=submit]');\n      thesubmit.addEventListener('click', function (event) {\n        var doingajax = form.getAttribute('data-doajax');\n        if (doingajax && 'on' === doingajax) {\n          event.preventDefault();\n          app.handlerecaptcha(form);\n        }\n        if (form.classList.contains('ctct-submitted')) {\n          return;\n        }\n        form.classList.add('ctct-submitted');\n        app.handleSubmission(event, form);\n        form.classList.remove('ctct-submitted');\n      });\n      form.honeypot.addEventListener('change', function (event) {\n        app.checkHoneypot(event, form.honeypot, form.submitButton);\n      });\n      form.honeypot.addEventListener('keyup', function (event) {\n        app.checkHoneypot(event, form.honeypot, form.submitButton);\n      });\n    });\n  };\n\n  /**\n   * Custom handling within our validation file, for cases of reCAPTCHA v3 + AJAX submit.\n   *\n   * @param form Form being submitted.\n   */\n  app.handlerecaptcha = function (form) {\n    if ('undefined' === typeof recaptchav3.site_key) {\n      return;\n    }\n    grecaptcha.ready(function () {\n      try {\n        grecaptcha.execute(recaptchav3.site_key, {\n          action: 'constantcontactsubmit'\n        }).then(function (token) {\n          var recaptchaResponse = document.createElement('input');\n          recaptchaResponse.setAttribute('type', 'hidden');\n          recaptchaResponse.setAttribute('name', 'g-recaptcha-response');\n          recaptchaResponse.setAttribute('value', token);\n          form.append(recaptchaResponse.cloneNode(true));\n        });\n      } catch (error) {\n        console.log(error);\n      }\n    });\n  };\n  app.init();\n})(window, window.CTCTSupport);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9hc3NldHMvanMvY3RjdC1wbHVnaW4tZnJvbnRlbmQvdmFsaWRhdGlvbi5qcyIsIm5hbWVzIjpbIndpbmRvdyIsIkNUQ1RTdXBwb3J0IiwiYXBwIiwiaW5pdCIsImNhY2hlIiwiYmluZEV2ZW50cyIsImZvcm1zIiwid3JhcHBlciIsImRvY3VtZW50IiwicXVlcnlTZWxlY3RvckFsbCIsImxlbmd0aCIsImZvckVhY2giLCJmb3JtV3JhcHBlciIsImZvdW5kIiwicXVlcnlTZWxlY3RvciIsInB1c2giLCJmb3JtIiwiaW5kZXgiLCJob25leXBvdCIsInN1Ym1pdEJ1dHRvbiIsInJlY2FwdGNoYSIsInRpbWVvdXQiLCJzZXRBbGxJbnB1dHNWYWxpZCIsImludmFsaWQiLCJBcnJheSIsImZyb20iLCJmaWVsZCIsImNsYXNzTGlzdCIsInJlbW92ZSIsInByb2Nlc3NFcnJvciIsImVycm9yIiwiaWQiLCJ0aGVJbnZhbGlkIiwiYWRkIiwiY2hlY2tIb25leXBvdCIsImV2ZW50IiwiaG9uZXlQb3QiLCJ2YWx1ZSIsInNldEF0dHJpYnV0ZSIsInJlbW92ZUF0dHJpYnV0ZSIsInZhbGlkYXRlU3VibWlzc2lvbiIsImdldEF0dHJpYnV0ZSIsImZpZWxkcyIsImNoZWNrVmFsaWRpdHkiLCJzaG93TWVzc2FnZSIsIm1lc3NhZ2UiLCJjbGFzc2VzIiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwicm9sZSIsInBhcmVudEVsZW1lbnQiLCJtZXNzYWdlX3RhZyIsImNyZWF0ZUVsZW1lbnQiLCJpbm5lckhUTUwiLCJkaXNtaXNzX2J0biIsInByZXBlbmQiLCJhZGRFdmVudExpc3RlbmVyIiwic3VibWl0Rm9ybSIsImRhdGEiLCJGb3JtRGF0YSIsImZvcm1EYXRhIiwiZm9ybVBhcmFtcyIsIlVSTFNlYXJjaFBhcmFtcyIsImFwcGVuZCIsIm9wdGlvbnMiLCJtZXRob2QiLCJib2R5IiwiZmV0Y2giLCJhamF4dXJsIiwidGhlbiIsInJlc3BvbnNlIiwianNvbiIsInN0YXR1cyIsImVycm9ycyIsInN0eWxlIiwiZGlzcGxheSIsInJlc2V0IiwiaGFuZGxlU3VibWlzc2lvbiIsImNsZWFyVGltZW91dCIsInNldFRpbWVvdXQiLCJ0aGVzdWJtaXQiLCJkb2luZ2FqYXgiLCJwcmV2ZW50RGVmYXVsdCIsImhhbmRsZXJlY2FwdGNoYSIsImNvbnRhaW5zIiwicmVjYXB0Y2hhdjMiLCJzaXRlX2tleSIsImdyZWNhcHRjaGEiLCJyZWFkeSIsImV4ZWN1dGUiLCJhY3Rpb24iLCJ0b2tlbiIsInJlY2FwdGNoYVJlc3BvbnNlIiwiY2xvbmVOb2RlIiwiY29uc29sZSIsImxvZyJdLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29uc3RhbnQtY29udGFjdC1mb3Jtcy8uL2Fzc2V0cy9qcy9jdGN0LXBsdWdpbi1mcm9udGVuZC92YWxpZGF0aW9uLmpzPzMzOTkiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGcm9udC1lbmQgZm9ybSB2YWxpZGF0aW9uLlxuICpcbiAqIEBzaW5jZSAxLjAuMFxuICovXG5cbiB3aW5kb3cuQ1RDVFN1cHBvcnQgPSB7fTtcblxuKCBmdW5jdGlvbiggd2luZG93LCBhcHAgKSB7XG5cblx0LyoqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKlxuXHQgKiBAYXV0aG9yIENvbnN0YW50IENvbnRhY3Rcblx0ICogQHNpbmNlIDEuMC4wXG5cdCAqL1xuXHRhcHAuaW5pdCA9ICgpID0+IHtcblx0XHRhcHAuY2FjaGUoKTtcblx0XHRhcHAuYmluZEV2ZW50cygpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBDYWNoZSBET00gZWxlbWVudHMuXG5cdCAqXG5cdCAqIEBhdXRob3IgQ29uc3RhbnQgQ29udGFjdFxuXHQgKiBAc2luY2UgMS4wLjBcblx0ICovXG5cdGFwcC5jYWNoZSA9ICgpID0+IHtcblxuXHRcdGFwcC5jYWNoZSA9IHtcblx0XHRcdGZvcm1zOiBbXVxuXHRcdH07XG5cblx0XHRsZXQgd3JhcHBlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jdGN0LWZvcm0td3JhcHBlcicpO1xuXHRcdGlmICh3cmFwcGVyLmxlbmd0aCkge1xuXHRcdFx0d3JhcHBlci5mb3JFYWNoKChmb3JtV3JhcHBlcikgPT4ge1xuXHRcdFx0XHRsZXQgZm91bmQgPSBmb3JtV3JhcHBlci5xdWVyeVNlbGVjdG9yKCdmb3JtJyk7XG5cdFx0XHRcdGlmIChmb3VuZCkge1xuXHRcdFx0XHRcdGFwcC5jYWNoZS5mb3Jtcy5wdXNoKGZvdW5kKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0YXBwLmNhY2hlLmZvcm1zLmZvckVhY2goKGZvcm0sIGluZGV4KSA9PiB7XG5cdFx0XHRhcHAuY2FjaGUuZm9ybXNbaW5kZXhdLmhvbmV5cG90ID0gZm9ybS5xdWVyeVNlbGVjdG9yKCcuY3RjdF91c2FnZV9maWVsZCcpO1xuXHRcdFx0YXBwLmNhY2hlLmZvcm1zW2luZGV4XS5zdWJtaXRCdXR0b24gPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W3R5cGU9c3VibWl0XScpO1xuXHRcdFx0YXBwLmNhY2hlLmZvcm1zW2luZGV4XS5yZWNhcHRjaGEgPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoJy5nLXJlY2FwdGNoYScpO1xuXHRcdH0pO1xuXG5cdFx0YXBwLnRpbWVvdXQgPSBudWxsO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBSZW1vdmUgdGhlIGN0Y3QtaW52YWxpZCBjbGFzcyBmcm9tIGVsZW1lbnRzIHRoYXQgaGF2ZSBpdC5cblx0ICpcblx0ICogQGF1dGhvciBDb25zdGFudCBDb250YWN0XG5cdCAqIEBzaW5jZSAxLjAuMFxuXHQgKi9cblx0YXBwLnNldEFsbElucHV0c1ZhbGlkID0gKCkgPT4ge1xuXHRcdGFwcC5jYWNoZS5mb3Jtcy5mb3JFYWNoKChmb3JtKSA9PiB7XG5cdFx0XHRsZXQgaW52YWxpZCA9IGZvcm0ucXVlcnlTZWxlY3RvckFsbCgnLmN0Y3QtaW52YWxpZCcpO1xuXHRcdFx0QXJyYXkuZnJvbShpbnZhbGlkKS5mb3JFYWNoKChmaWVsZCkgPT4ge1xuXHRcdFx0XHRmaWVsZC5jbGFzc0xpc3QucmVtb3ZlKCdjdGN0LWludmFsaWQnKTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBBZGRzIC5jdGN0LWludmFsaWQgSFRNTCBjbGFzcyB0byBpbnB1dHMgd2hvc2UgdmFsdWVzIGFyZSBpbnZhbGlkLlxuXHQgKlxuXHQgKiBAYXV0aG9yIENvbnN0YW50IENvbnRhY3Rcblx0ICogQHNpbmNlIDEuMC4wXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBlcnJvciBBSkFYIHJlc3BvbnNlIGVycm9yIG9iamVjdC5cblx0ICovXG5cdGFwcC5wcm9jZXNzRXJyb3IgPSAoIGVycm9yICkgPT4ge1xuXG5cdFx0Ly8gSWYgd2UgaGF2ZSBhbiBpZCBwcm9wZXJ0eSBzZXQuXG5cdFx0aWYgKCAndW5kZWZpbmVkJyAhPT0gdHlwZW9mKCBlcnJvci5pZCApICkge1xuXHRcdFx0bGV0IGludmFsaWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjJyArIGVycm9yLmlkKTtcblx0XHRcdEFycmF5LmZyb20oaW52YWxpZCkuZm9yRWFjaCgodGhlSW52YWxpZCkgPT4ge1xuXHRcdFx0XHR0aGVJbnZhbGlkLmNsYXNzTGlzdC5hZGQoJ2N0Y3QtaW52YWxpZCcpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBDaGVjayB0aGUgdmFsdWUgb2YgdGhlIGhpZGRlbiBob25leXBvdCBmaWVsZDsgZGlzYWJsZSBmb3JtIHN1Ym1pc3Npb24gYnV0dG9uIGlmIGFueXRoaW5nIGluIGl0LlxuXHQgKlxuXHQgKiBAYXV0aG9yIENvbnN0YW50IENvbnRhY3Rcblx0ICogQHNpbmNlIDEuMC4wXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBUaGUgY2hhbmdlIG9yIGtleXVwIGV2ZW50IHRyaWdnZXJpbmcgdGhpcyBjYWxsYmFjay5cblx0ICogQHBhcmFtIHtvYmplY3R9IGhvbmV5UG90IFRoZSBvYmplY3QgZm9yIHRoZSBhY3R1YWwgaW5wdXQgZmllbGQgYmVpbmcgY2hlY2tlZC5cblx0ICogQHBhcmFtIHtvYmplY3R9IHN1Ym1pdEJ1dHRvbiBUaGUgb2JqZWN0IGZvciB0aGUgc3VibWl0IGJ1dHRvbiBpbiB0aGUgc2FtZSBmb3JtIGFzIHRoZSBob25leXBvdCBmaWVsZC5cblx0ICovXG5cdGFwcC5jaGVja0hvbmV5cG90ID0gKCBldmVudCwgaG9uZXlQb3QsIHN1Ym1pdEJ1dHRvbiApID0+IHtcblx0XHQvLyBJZiB0aGVyZSBpcyB0ZXh0IGluIHRoZSBob25leXBvdCwgZGlzYWJsZSB0aGUgc3VibWl0IGJ1dHRvbi5cblxuXHRcdC8vIExlYXZpbmcgdGhpcyBkaXNhYmxpbmcgaW4gcGxhY2UgYmVjYXVzZSBpdCBzaG91bGQgbm90IGJlIGdldHRpbmcgdXNlZCBieSBzY3JlZW4gcmVhZGVycyBpbiB0aGUgZmlyc3QgcGxhY2UsIGFuZCBJIGZlZWwgaXQncyBnb2luZyB0byBoZWxwIG1vcmUgdGhhbiBodXJ0IHRvIGtlZXAuXG5cdFx0aWYgKCAwIDwgaG9uZXlQb3QudmFsdWUubGVuZ3RoICkge1xuXHRcdFx0c3VibWl0QnV0dG9uLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCdkaXNhYmxlZCcpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzdWJtaXRCdXR0b24ucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogRW5zdXJlcyB0aGF0IHdlIHNob3VsZCB1c2UgQUpBWCB0byBwcm9jZXNzIHRoZSBzcGVjaWZpZWQgZm9ybSwgYW5kIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgbm90IGVtcHR5LlxuXHQgKlxuXHQgKiBAYXV0aG9yIENvbnN0YW50IENvbnRhY3Rcblx0ICogQHNpbmNlIDEuMC4wXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBmb3JtIG9iamVjdCBmb3IgdGhlIGZvcm0gYmVpbmcgdmFsaWRhdGVkLlxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBGYWxzZSBpZiBBSkFYIHByb2Nlc3NpbmcgaXMgZGlzYWJsZWQgZm9yIHRoaXMgZm9ybSBvciBpZiBhIHJlcXVpcmVkIGZpZWxkIGlzIGVtcHR5LlxuXHQgKi9cblx0YXBwLnZhbGlkYXRlU3VibWlzc2lvbiA9ICggZm9ybSApID0+IHtcblx0XHRpZiAoICdvbicgIT09IGZvcm0uZ2V0QXR0cmlidXRlKCAnZGF0YS1kb2FqYXgnICkgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0bGV0IGZpZWxkcyA9IGZvcm0ucXVlcnlTZWxlY3RvckFsbCgnW3JlcXVpcmVkXScpO1xuXHRcdEFycmF5LmZyb20oZmllbGRzKS5mb3JFYWNoKChmaWVsZCkgPT4ge1xuXHRcdFx0aWYgKGZhbHNlID09PSBmaWVsZC5jaGVja1ZhbGlkaXR5KCkpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH07XG5cblx0LyoqXG5cdCAqIFByZXBlbmRzIGZvcm0gd2l0aCBhIG1lc3NhZ2UgdGhhdCBmYWRlcyBvdXQgaW4gNSBzZWNvbmRzLlxuXHQgKlxuXHQgKiBAYXV0aG9yIENvbnN0YW50IENvbnRhY3Rcblx0ICogQHNpbmNlIDEuMC4wXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBmb3JtIG9iamVjdCBmb3IgdGhlIGZvcm0gYSBtZXNzYWdlIGlzIGJlaW5nIGRpc3BsYXllZCBmb3IuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIGNvbnRlbnQuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc2VzIE9wdGlvbmFsLiBIVE1MIGNsYXNzZXMgdG8gYWRkIHRvIHRoZSBtZXNzYWdlIHdyYXBwZXIuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSByb2xlIFJvbGUgYXR0cmlidXRlIGZvciBhY2Nlc3NpYmlsaXR5LlxuXHQgKi9cblx0YXBwLnNob3dNZXNzYWdlID0gKCBmb3JtLCBtZXNzYWdlLCBjbGFzc2VzID0gJycsIHJvbGUgPSAnbG9nJyApID0+IHtcblxuXHRcdGNvbnN0IHdyYXBwZXIgPSBmb3JtLnBhcmVudEVsZW1lbnQ7XG5cblx0XHRpZiAoIHdyYXBwZXIucXVlcnlTZWxlY3RvcigncC5jdGN0LW1lc3NhZ2UnKSApIHtcblx0XHRcdHdyYXBwZXIucXVlcnlTZWxlY3RvcigncC5jdGN0LW1lc3NhZ2UnKS5yZW1vdmUoKTtcblx0XHR9XG5cblx0XHRsZXQgbWVzc2FnZV90YWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XG5cdFx0bWVzc2FnZV90YWcuc2V0QXR0cmlidXRlKCdjbGFzcycsICdjdGN0LW1lc3NhZ2UgJyArIGNsYXNzZXMpO1xuXHRcdG1lc3NhZ2VfdGFnLnNldEF0dHJpYnV0ZSgncm9sZScsIHJvbGUpO1xuXHRcdG1lc3NhZ2VfdGFnLmlubmVySFRNTCA9IG1lc3NhZ2U7XG5cblx0XHRsZXQgZGlzbWlzc19idG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcblx0XHRkaXNtaXNzX2J0bi5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ2J1dHRvbiBidXR0b24tc2Vjb25kYXJ5IGN0Y3QtZGlzbWlzcyBjdGN0LWRpc21pc3MtYWpheC1ub3RpY2UnKTtcblx0XHRkaXNtaXNzX2J0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnRGlzbWlzcyBub3RpZmljYXRpb24nKTtcblx0XHRkaXNtaXNzX2J0bi5pbm5lckhUTUwgPSAnJiMxMDAwNTsnO1xuXG5cdFx0bWVzc2FnZV90YWcucHJlcGVuZChkaXNtaXNzX2J0bik7XG5cblx0XHRmb3JtLnBhcmVudEVsZW1lbnQucHJlcGVuZChtZXNzYWdlX3RhZyk7XG5cblx0XHR3cmFwcGVyLnF1ZXJ5U2VsZWN0b3IoICcuY3RjdC1kaXNtaXNzLWFqYXgtbm90aWNlJyApLmFkZEV2ZW50TGlzdGVuZXIoXG5cdFx0XHQnY2xpY2snLFxuXHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHRoaXMucGFyZW50RWxlbWVudC5yZW1vdmUoKTtcblx0XHRcdH1cblx0XHQpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBTdWJtaXRzIHRoZSBhY3R1YWwgZm9ybSB2aWEgQUpBWC5cblx0ICpcblx0ICogQGF1dGhvciBDb25zdGFudCBDb250YWN0XG5cdCAqIEBzaW5jZSAxLjAuMFxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gZm9ybSBvYmplY3QgZm9yIHRoZSBmb3JtIGJlaW5nIHN1Ym1pdHRlZC5cblx0ICovXG5cdGFwcC5zdWJtaXRGb3JtID0gKCBmb3JtICkgPT4ge1xuXHRcdGNvbnN0IGRhdGEgPSBuZXcgRm9ybURhdGEoKTtcblx0XHRjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShmb3JtKTtcblx0XHRjb25zdCBmb3JtUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhmb3JtRGF0YSk7XG5cblx0XHRkYXRhLmFwcGVuZCgnYWN0aW9uJywgJ2N0Y3RfcHJvY2Vzc19mb3JtJyk7XG5cdFx0ZGF0YS5hcHBlbmQoJ2RhdGEnLCBmb3JtUGFyYW1zKTtcblxuXHRcdGxldCBvcHRpb25zID0ge1xuXHRcdFx0bWV0aG9kOiAnUE9TVCcsXG5cdFx0XHRib2R5OiBkYXRhXG5cdFx0fTtcblxuXHRcdGZldGNoKFxuXHRcdFx0d2luZG93LmFqYXh1cmwsXG5cdFx0XHRvcHRpb25zXG5cdFx0KVxuXHRcdC50aGVuKChyZXNwb25zZSk9PnJlc3BvbnNlLmpzb24oKSlcblx0XHQudGhlbigocmVzcG9uc2UpPT57XG5cblx0XHRcdGlmICggJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiByZXNwb25zZS5zdGF0dXMgKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCAnc3VjY2VzcycgIT09IHJlc3BvbnNlLnN0YXR1cyApIHtcblx0XHRcdFx0aWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgKHJlc3BvbnNlLmVycm9ycykpIHtcblx0XHRcdFx0XHRhcHAuc2V0QWxsSW5wdXRzVmFsaWQoKTtcblx0XHRcdFx0XHRyZXNwb25zZS5lcnJvcnMuZm9yRWFjaChhcHAucHJvY2Vzc0Vycm9yKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhcHAuc2hvd01lc3NhZ2UoZm9ybSwgcmVzcG9uc2UubWVzc2FnZSwgJ2N0Y3QtZXJyb3InLCAnYWxlcnQnKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0Zm9ybS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXHRcdFx0Ly8gSWYgd2UncmUgaGVyZSwgdGhlIHN1Ym1pc3Npb24gd2FzIGEgc3VjY2Vzczsgc2hvdyBtZXNzYWdlIGFuZCByZXNldCBmb3JtIGZpZWxkcy5cblx0XHRcdGFwcC5zaG93TWVzc2FnZShmb3JtLCByZXNwb25zZS5tZXNzYWdlLCAnY3RjdC1zdWNjZXNzJywgJ3N0YXR1cycpO1xuXHRcdFx0Zm9ybS5yZXNldCgpO1xuXHRcdH0pO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBIYW5kbGUgdGhlIGZvcm0gc3VibWlzc2lvbi5cblx0ICpcblx0ICogQGF1dGhvciBDb25zdGFudCBDb250YWN0XG5cdCAqIEBzaW5jZSAxLjAuMFxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgVGhlIHN1Ym1pdCBldmVudC5cblx0ICogQHBhcmFtIHtvYmplY3R9IGZvcm0gb2JqZWN0IGZvciB0aGUgY3VycmVudCBmb3JtIGJlaW5nIGhhbmRsZWQuXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IEZhbHNlIGlmIHVuYWJsZSB0byB2YWxpZGF0ZSB0aGUgZm9ybS5cblx0ICovXG5cdGFwcC5oYW5kbGVTdWJtaXNzaW9uID0gKCBldmVudCwgZm9ybSApID0+IHtcblxuXHRcdGlmICggISBhcHAudmFsaWRhdGVTdWJtaXNzaW9uKCBmb3JtICkgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Y2xlYXJUaW1lb3V0KCBhcHAudGltZW91dCApO1xuXG5cdFx0aWYgKGZvcm0uY2hlY2tWYWxpZGl0eSgpKSB7XG5cdFx0XHRhcHAudGltZW91dCA9IHNldFRpbWVvdXQoYXBwLnN1Ym1pdEZvcm0sIDUwMCwgZm9ybSk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBTZXQgdXAgZXZlbnQgYmluZGluZ3MgYW5kIGNhbGxiYWNrcy5cblx0ICpcblx0ICogQGF1dGhvciBDb25zdGFudCBDb250YWN0XG5cdCAqIEBzaW5jZSAxLjAuMFxuXHQgKi9cblx0YXBwLmJpbmRFdmVudHMgPSAoKSA9PiB7XG5cdFx0YXBwLmNhY2hlLmZvcm1zLmZvckVhY2goKGZvcm0pID0+IHtcblx0XHRcdGxldCB0aGVzdWJtaXQgPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoJ1t0eXBlPXN1Ym1pdF0nKTtcblx0XHRcdHRoZXN1Ym1pdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuXHRcdFx0XHRsZXQgZG9pbmdhamF4ID0gZm9ybS5nZXRBdHRyaWJ1dGUoICdkYXRhLWRvYWpheCcgKTtcblx0XHRcdFx0aWYgKCBkb2luZ2FqYXggJiYgJ29uJyA9PT0gZG9pbmdhamF4ICkge1xuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRcdFx0XHRhcHAuaGFuZGxlcmVjYXB0Y2hhKGZvcm0pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBmb3JtLmNsYXNzTGlzdC5jb250YWlucyggJ2N0Y3Qtc3VibWl0dGVkJyApICkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRmb3JtLmNsYXNzTGlzdC5hZGQoICdjdGN0LXN1Ym1pdHRlZCcgKTtcblx0XHRcdFx0YXBwLmhhbmRsZVN1Ym1pc3Npb24oIGV2ZW50LCBmb3JtICk7XG5cdFx0XHRcdGZvcm0uY2xhc3NMaXN0LnJlbW92ZSggJ2N0Y3Qtc3VibWl0dGVkJyApO1xuXHRcdFx0fSk7XG5cblx0XHRcdGZvcm0uaG9uZXlwb3QuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGV2ZW50KSA9PiB7XG5cdFx0XHRcdGFwcC5jaGVja0hvbmV5cG90KFxuXHRcdFx0XHRcdGV2ZW50LFxuXHRcdFx0XHRcdGZvcm0uaG9uZXlwb3QsXG5cdFx0XHRcdFx0Zm9ybS5zdWJtaXRCdXR0b25cblx0XHRcdFx0KTtcblx0XHRcdH0pO1xuXG5cdFx0XHRmb3JtLmhvbmV5cG90LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKGV2ZW50KSA9PiB7XG5cdFx0XHRcdGFwcC5jaGVja0hvbmV5cG90KFxuXHRcdFx0XHRcdGV2ZW50LFxuXHRcdFx0XHRcdGZvcm0uaG9uZXlwb3QsXG5cdFx0XHRcdFx0Zm9ybS5zdWJtaXRCdXR0b25cblx0XHRcdFx0KTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBDdXN0b20gaGFuZGxpbmcgd2l0aGluIG91ciB2YWxpZGF0aW9uIGZpbGUsIGZvciBjYXNlcyBvZiByZUNBUFRDSEEgdjMgKyBBSkFYIHN1Ym1pdC5cblx0ICpcblx0ICogQHBhcmFtIGZvcm0gRm9ybSBiZWluZyBzdWJtaXR0ZWQuXG5cdCAqL1xuXHRhcHAuaGFuZGxlcmVjYXB0Y2hhID0gKGZvcm0pID0+IHtcblx0XHRpZiAoJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiAocmVjYXB0Y2hhdjMuc2l0ZV9rZXkpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Z3JlY2FwdGNoYS5yZWFkeShmdW5jdGlvbiAoKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRncmVjYXB0Y2hhLmV4ZWN1dGUocmVjYXB0Y2hhdjMuc2l0ZV9rZXksIHthY3Rpb246ICdjb25zdGFudGNvbnRhY3RzdWJtaXQnfSkudGhlbihmdW5jdGlvbiAodG9rZW4pIHtcblx0XHRcdFx0XHRsZXQgcmVjYXB0Y2hhUmVzcG9uc2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuXHRcdFx0XHRcdHJlY2FwdGNoYVJlc3BvbnNlLnNldEF0dHJpYnV0ZSgndHlwZScsICdoaWRkZW4nKTtcblx0XHRcdFx0XHRyZWNhcHRjaGFSZXNwb25zZS5zZXRBdHRyaWJ1dGUoJ25hbWUnLCAnZy1yZWNhcHRjaGEtcmVzcG9uc2UnKTtcblx0XHRcdFx0XHRyZWNhcHRjaGFSZXNwb25zZS5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgdG9rZW4pO1xuXG5cdFx0XHRcdFx0Zm9ybS5hcHBlbmQocmVjYXB0Y2hhUmVzcG9uc2UuY2xvbmVOb2RlKHRydWUpKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRjb25zb2xlLmxvZyhlcnJvcik7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRhcHAuaW5pdCgpO1xuXG59ICggd2luZG93LCB3aW5kb3cuQ1RDVFN1cHBvcnQgKSApO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVDQSxNQUFNLENBQUNDLFdBQVcsR0FBRyxDQUFDLENBQUM7QUFFdEIsV0FBVUQsTUFBTSxFQUFFRSxHQUFHLEVBQUc7RUFFekI7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0NBLEdBQUcsQ0FBQ0MsSUFBSSxHQUFHLFlBQU07SUFDaEJELEdBQUcsQ0FBQ0UsS0FBSyxDQUFDLENBQUM7SUFDWEYsR0FBRyxDQUFDRyxVQUFVLENBQUMsQ0FBQztFQUNqQixDQUFDOztFQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNDSCxHQUFHLENBQUNFLEtBQUssR0FBRyxZQUFNO0lBRWpCRixHQUFHLENBQUNFLEtBQUssR0FBRztNQUNYRSxLQUFLLEVBQUU7SUFDUixDQUFDO0lBRUQsSUFBSUMsT0FBTyxHQUFHQyxRQUFRLENBQUNDLGdCQUFnQixDQUFDLG9CQUFvQixDQUFDO0lBQzdELElBQUlGLE9BQU8sQ0FBQ0csTUFBTSxFQUFFO01BQ25CSCxPQUFPLENBQUNJLE9BQU8sQ0FBQyxVQUFDQyxXQUFXLEVBQUs7UUFDaEMsSUFBSUMsS0FBSyxHQUFHRCxXQUFXLENBQUNFLGFBQWEsQ0FBQyxNQUFNLENBQUM7UUFDN0MsSUFBSUQsS0FBSyxFQUFFO1VBQ1ZYLEdB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\n//# sourceURL=webpack-internal:///./assets/js/ctct-plugin-frontend/validation.js\n\n}");
     32eval("{/**\n * Front-end form validation.\n *\n * @since 1.0.0\n */\n\nwindow.CTCTSupport = {};\n(function (window, app) {\n  /**\n   * @constructor\n   *\n   * @author Constant Contact\n   * @since 1.0.0\n   */\n  app.init = function () {\n    app.cache();\n    app.bindEvents();\n  };\n\n  /**\n   * Cache DOM elements.\n   *\n   * @author Constant Contact\n   * @since 1.0.0\n   */\n  app.cache = function () {\n    app.cache = {\n      forms: []\n    };\n    var wrapper = document.querySelectorAll('.ctct-form-wrapper');\n    if (wrapper.length) {\n      wrapper.forEach(function (formWrapper) {\n        var found = formWrapper.querySelector('form');\n        if (found) {\n          app.cache.forms.push(found);\n        }\n      });\n    }\n    app.cache.forms.forEach(function (form, index) {\n      app.cache.forms[index].honeypot = form.querySelector('.ctct_usage_field');\n      app.cache.forms[index].submitButton = form.querySelector('input[type=submit]');\n      app.cache.forms[index].recaptcha = form.querySelector('.g-recaptcha');\n    });\n    app.timeout = null;\n  };\n\n  /**\n   * Remove the ctct-invalid class from elements that have it.\n   *\n   * @author Constant Contact\n   * @since 1.0.0\n   */\n  app.setAllInputsValid = function () {\n    app.cache.forms.forEach(function (form) {\n      var invalid = form.querySelectorAll('.ctct-invalid');\n      Array.from(invalid).forEach(function (field) {\n        field.classList.remove('ctct-invalid');\n      });\n    });\n  };\n\n  /**\n   * Adds .ctct-invalid HTML class to inputs whose values are invalid.\n   *\n   * @author Constant Contact\n   * @since 1.0.0\n   *\n   * @param {object} error AJAX response error object.\n   */\n  app.processError = function (error) {\n    // If we have an id property set.\n    if ('undefined' !== typeof error.id) {\n      var invalid = document.querySelectorAll('#' + error.id);\n      Array.from(invalid).forEach(function (theInvalid) {\n        theInvalid.classList.add('ctct-invalid');\n      });\n    }\n  };\n\n  /**\n   * Check the value of the hidden honeypot field; disable form submission button if anything in it.\n   *\n   * @author Constant Contact\n   * @since 1.0.0\n   *\n   * @param {object} event The change or keyup event triggering this callback.\n   * @param {object} honeyPot The object for the actual input field being checked.\n   * @param {object} submitButton The object for the submit button in the same form as the honeypot field.\n   */\n  app.checkHoneypot = function (event, honeyPot, submitButton) {\n    // If there is text in the honeypot, disable the submit button.\n\n    // Leaving this disabling in place because it should not be getting used by screen readers in the first place, and I feel it's going to help more than hurt to keep.\n    if (0 < honeyPot.value.length) {\n      submitButton.setAttribute('disabled', 'disabled');\n    } else {\n      submitButton.removeAttribute('disabled');\n    }\n  };\n\n  /**\n   * Ensures that we should use AJAX to process the specified form, and that all required fields are not empty.\n   *\n   * @author Constant Contact\n   * @since 1.0.0\n   *\n   * @param {object} form object for the form being validated.\n   * @return {boolean} False if AJAX processing is disabled for this form or if a required field is empty.\n   */\n  app.validateSubmission = function (form) {\n    if ('on' !== form.getAttribute('data-doajax')) {\n      return false;\n    }\n    var fields = form.querySelectorAll('[required]');\n    Array.from(fields).forEach(function (field) {\n      if (false === field.checkValidity()) {\n        return false;\n      }\n    });\n    return true;\n  };\n\n  /**\n   * Prepends form with a message that fades out in 5 seconds.\n   *\n   * @author Constant Contact\n   * @since 1.0.0\n   *\n   * @param {object} form object for the form a message is being displayed for.\n   * @param {string} message The message content.\n   * @param {string} classes Optional. HTML classes to add to the message wrapper.\n   * @param {string} role Role attribute for accessibility.\n   */\n  app.showMessage = function (form, message) {\n    var classes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n    var role = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'log';\n    var wrapper = form.parentElement;\n    if (wrapper.querySelector('p.ctct-message')) {\n      wrapper.querySelector('p.ctct-message').remove();\n    }\n    var message_tag = document.createElement('p');\n    message_tag.setAttribute('class', 'ctct-message ' + classes);\n    message_tag.setAttribute('role', role);\n    message_tag.innerHTML = message;\n    var dismiss_btn = document.createElement('button');\n    dismiss_btn.setAttribute('class', 'button button-secondary ctct-dismiss ctct-dismiss-ajax-notice');\n    dismiss_btn.setAttribute('aria-label', 'Dismiss notification');\n    dismiss_btn.innerHTML = '&#10005;';\n    message_tag.prepend(dismiss_btn);\n    form.parentElement.prepend(message_tag);\n    wrapper.querySelector('.ctct-dismiss-ajax-notice').addEventListener('click', function () {\n      this.parentElement.remove();\n    });\n  };\n\n  /**\n   * Submits the actual form via AJAX.\n   *\n   * @author Constant Contact\n   * @since 1.0.0\n   *\n   * @param {object} form object for the form being submitted.\n   */\n  app.submitForm = function (form) {\n    var data = new FormData();\n    var formData = new FormData(form);\n    var formParams = new URLSearchParams(formData);\n    data.append('action', 'ctct_process_form');\n    data.append('data', formParams);\n    var options = {\n      method: 'POST',\n      body: data\n    };\n    fetch(window.ajaxurl, options).then(function (response) {\n      return response.json();\n    }).then(function (response) {\n      if ('undefined' === typeof response.status) {\n        return false;\n      }\n      if ('success' !== response.status) {\n        if ('undefined' !== typeof response.errors) {\n          app.setAllInputsValid();\n          response.errors.forEach(app.processError);\n        } else {\n          app.showMessage(form, response.message, 'ctct-error', 'alert');\n        }\n        return false;\n      }\n      form.style.display = 'none';\n      // If we're here, the submission was a success; show message and reset form fields.\n      app.showMessage(form, response.message, 'ctct-success', 'status');\n      form.reset();\n    });\n  };\n\n  /**\n   * Handle the form submission.\n   *\n   * @author Constant Contact\n   * @since 1.0.0\n   *\n   * @param {object} event The submit event.\n   * @param {object} form object for the current form being handled.\n   * @return {boolean} False if unable to validate the form.\n   */\n  app.handleSubmission = function (event, form) {\n    if (!app.validateSubmission(form)) {\n      return false;\n    }\n    clearTimeout(app.timeout);\n    if (form.checkValidity()) {\n      app.timeout = setTimeout(app.submitForm, 500, form);\n    }\n  };\n\n  /**\n   * Set up event bindings and callbacks.\n   *\n   * @author Constant Contact\n   * @since 1.0.0\n   */\n  app.bindEvents = function () {\n    app.cache.forms.forEach(function (form) {\n      var thesubmit = form.querySelector('[type=submit]');\n      thesubmit.addEventListener('click', function (event) {\n        var doingajax = form.getAttribute('data-doajax');\n        if (doingajax && 'on' === doingajax) {\n          event.preventDefault();\n          app.handlerecaptcha(form);\n        }\n        if (form.classList.contains('ctct-submitted')) {\n          return;\n        }\n        form.classList.add('ctct-submitted');\n        app.handleSubmission(event, form);\n        form.classList.remove('ctct-submitted');\n      });\n      form.honeypot.addEventListener('change', function (event) {\n        app.checkHoneypot(event, form.honeypot, form.submitButton);\n      });\n      form.honeypot.addEventListener('keyup', function (event) {\n        app.checkHoneypot(event, form.honeypot, form.submitButton);\n      });\n    });\n  };\n\n  /**\n   * Custom handling within our validation file, for cases of reCAPTCHA v3 + AJAX submit.\n   *\n   * @param form Form being submitted.\n   */\n  app.handlerecaptcha = function (form) {\n    if ('undefined' === typeof recaptchav3) {\n      return;\n    }\n    if ('undefined' === typeof recaptchav3.site_key) {\n      return;\n    }\n    if ('undefined' === typeof grecaptcha) {\n      return;\n    }\n    grecaptcha.ready(function () {\n      try {\n        grecaptcha.execute(recaptchav3.site_key, {\n          action: 'constantcontactsubmit'\n        }).then(function (token) {\n          var recaptchaResponse = document.createElement('input');\n          recaptchaResponse.setAttribute('type', 'hidden');\n          recaptchaResponse.setAttribute('name', 'g-recaptcha-response');\n          recaptchaResponse.setAttribute('value', token);\n          form.append(recaptchaResponse.cloneNode(true));\n        });\n      } catch (error) {\n        console.log(error);\n      }\n    });\n  };\n  app.init();\n})(window, window.CTCTSupport);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9hc3NldHMvanMvY3RjdC1wbHVnaW4tZnJvbnRlbmQvdmFsaWRhdGlvbi5qcyIsIm5hbWVzIjpbIndpbmRvdyIsIkNUQ1RTdXBwb3J0IiwiYXBwIiwiaW5pdCIsImNhY2hlIiwiYmluZEV2ZW50cyIsImZvcm1zIiwid3JhcHBlciIsImRvY3VtZW50IiwicXVlcnlTZWxlY3RvckFsbCIsImxlbmd0aCIsImZvckVhY2giLCJmb3JtV3JhcHBlciIsImZvdW5kIiwicXVlcnlTZWxlY3RvciIsInB1c2giLCJmb3JtIiwiaW5kZXgiLCJob25leXBvdCIsInN1Ym1pdEJ1dHRvbiIsInJlY2FwdGNoYSIsInRpbWVvdXQiLCJzZXRBbGxJbnB1dHNWYWxpZCIsImludmFsaWQiLCJBcnJheSIsImZyb20iLCJmaWVsZCIsImNsYXNzTGlzdCIsInJlbW92ZSIsInByb2Nlc3NFcnJvciIsImVycm9yIiwiaWQiLCJ0aGVJbnZhbGlkIiwiYWRkIiwiY2hlY2tIb25leXBvdCIsImV2ZW50IiwiaG9uZXlQb3QiLCJ2YWx1ZSIsInNldEF0dHJpYnV0ZSIsInJlbW92ZUF0dHJpYnV0ZSIsInZhbGlkYXRlU3VibWlzc2lvbiIsImdldEF0dHJpYnV0ZSIsImZpZWxkcyIsImNoZWNrVmFsaWRpdHkiLCJzaG93TWVzc2FnZSIsIm1lc3NhZ2UiLCJjbGFzc2VzIiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwicm9sZSIsInBhcmVudEVsZW1lbnQiLCJtZXNzYWdlX3RhZyIsImNyZWF0ZUVsZW1lbnQiLCJpbm5lckhUTUwiLCJkaXNtaXNzX2J0biIsInByZXBlbmQiLCJhZGRFdmVudExpc3RlbmVyIiwic3VibWl0Rm9ybSIsImRhdGEiLCJGb3JtRGF0YSIsImZvcm1EYXRhIiwiZm9ybVBhcmFtcyIsIlVSTFNlYXJjaFBhcmFtcyIsImFwcGVuZCIsIm9wdGlvbnMiLCJtZXRob2QiLCJib2R5IiwiZmV0Y2giLCJhamF4dXJsIiwidGhlbiIsInJlc3BvbnNlIiwianNvbiIsInN0YXR1cyIsImVycm9ycyIsInN0eWxlIiwiZGlzcGxheSIsInJlc2V0IiwiaGFuZGxlU3VibWlzc2lvbiIsImNsZWFyVGltZW91dCIsInNldFRpbWVvdXQiLCJ0aGVzdWJtaXQiLCJkb2luZ2FqYXgiLCJwcmV2ZW50RGVmYXVsdCIsImhhbmRsZXJlY2FwdGNoYSIsImNvbnRhaW5zIiwicmVjYXB0Y2hhdjMiLCJzaXRlX2tleSIsImdyZWNhcHRjaGEiLCJyZWFkeSIsImV4ZWN1dGUiLCJhY3Rpb24iLCJ0b2tlbiIsInJlY2FwdGNoYVJlc3BvbnNlIiwiY2xvbmVOb2RlIiwiY29uc29sZSIsImxvZyJdLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29uc3RhbnQtY29udGFjdC1mb3Jtcy8uL2Fzc2V0cy9qcy9jdGN0LXBsdWdpbi1mcm9udGVuZC92YWxpZGF0aW9uLmpzPzMzOTkiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGcm9udC1lbmQgZm9ybSB2YWxpZGF0aW9uLlxuICpcbiAqIEBzaW5jZSAxLjAuMFxuICovXG5cbiB3aW5kb3cuQ1RDVFN1cHBvcnQgPSB7fTtcblxuKCBmdW5jdGlvbiggd2luZG93LCBhcHAgKSB7XG5cblx0LyoqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKlxuXHQgKiBAYXV0aG9yIENvbnN0YW50IENvbnRhY3Rcblx0ICogQHNpbmNlIDEuMC4wXG5cdCAqL1xuXHRhcHAuaW5pdCA9ICgpID0+IHtcblx0XHRhcHAuY2FjaGUoKTtcblx0XHRhcHAuYmluZEV2ZW50cygpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBDYWNoZSBET00gZWxlbWVudHMuXG5cdCAqXG5cdCAqIEBhdXRob3IgQ29uc3RhbnQgQ29udGFjdFxuXHQgKiBAc2luY2UgMS4wLjBcblx0ICovXG5cdGFwcC5jYWNoZSA9ICgpID0+IHtcblxuXHRcdGFwcC5jYWNoZSA9IHtcblx0XHRcdGZvcm1zOiBbXVxuXHRcdH07XG5cblx0XHRsZXQgd3JhcHBlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jdGN0LWZvcm0td3JhcHBlcicpO1xuXHRcdGlmICh3cmFwcGVyLmxlbmd0aCkge1xuXHRcdFx0d3JhcHBlci5mb3JFYWNoKChmb3JtV3JhcHBlcikgPT4ge1xuXHRcdFx0XHRsZXQgZm91bmQgPSBmb3JtV3JhcHBlci5xdWVyeVNlbGVjdG9yKCdmb3JtJyk7XG5cdFx0XHRcdGlmIChmb3VuZCkge1xuXHRcdFx0XHRcdGFwcC5jYWNoZS5mb3Jtcy5wdXNoKGZvdW5kKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0YXBwLmNhY2hlLmZvcm1zLmZvckVhY2goKGZvcm0sIGluZGV4KSA9PiB7XG5cdFx0XHRhcHAuY2FjaGUuZm9ybXNbaW5kZXhdLmhvbmV5cG90ID0gZm9ybS5xdWVyeVNlbGVjdG9yKCcuY3RjdF91c2FnZV9maWVsZCcpO1xuXHRcdFx0YXBwLmNhY2hlLmZvcm1zW2luZGV4XS5zdWJtaXRCdXR0b24gPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W3R5cGU9c3VibWl0XScpO1xuXHRcdFx0YXBwLmNhY2hlLmZvcm1zW2luZGV4XS5yZWNhcHRjaGEgPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoJy5nLXJlY2FwdGNoYScpO1xuXHRcdH0pO1xuXG5cdFx0YXBwLnRpbWVvdXQgPSBudWxsO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBSZW1vdmUgdGhlIGN0Y3QtaW52YWxpZCBjbGFzcyBmcm9tIGVsZW1lbnRzIHRoYXQgaGF2ZSBpdC5cblx0ICpcblx0ICogQGF1dGhvciBDb25zdGFudCBDb250YWN0XG5cdCAqIEBzaW5jZSAxLjAuMFxuXHQgKi9cblx0YXBwLnNldEFsbElucHV0c1ZhbGlkID0gKCkgPT4ge1xuXHRcdGFwcC5jYWNoZS5mb3Jtcy5mb3JFYWNoKChmb3JtKSA9PiB7XG5cdFx0XHRsZXQgaW52YWxpZCA9IGZvcm0ucXVlcnlTZWxlY3RvckFsbCgnLmN0Y3QtaW52YWxpZCcpO1xuXHRcdFx0QXJyYXkuZnJvbShpbnZhbGlkKS5mb3JFYWNoKChmaWVsZCkgPT4ge1xuXHRcdFx0XHRmaWVsZC5jbGFzc0xpc3QucmVtb3ZlKCdjdGN0LWludmFsaWQnKTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBBZGRzIC5jdGN0LWludmFsaWQgSFRNTCBjbGFzcyB0byBpbnB1dHMgd2hvc2UgdmFsdWVzIGFyZSBpbnZhbGlkLlxuXHQgKlxuXHQgKiBAYXV0aG9yIENvbnN0YW50IENvbnRhY3Rcblx0ICogQHNpbmNlIDEuMC4wXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBlcnJvciBBSkFYIHJlc3BvbnNlIGVycm9yIG9iamVjdC5cblx0ICovXG5cdGFwcC5wcm9jZXNzRXJyb3IgPSAoIGVycm9yICkgPT4ge1xuXG5cdFx0Ly8gSWYgd2UgaGF2ZSBhbiBpZCBwcm9wZXJ0eSBzZXQuXG5cdFx0aWYgKCAndW5kZWZpbmVkJyAhPT0gdHlwZW9mKCBlcnJvci5pZCApICkge1xuXHRcdFx0bGV0IGludmFsaWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjJyArIGVycm9yLmlkKTtcblx0XHRcdEFycmF5LmZyb20oaW52YWxpZCkuZm9yRWFjaCgodGhlSW52YWxpZCkgPT4ge1xuXHRcdFx0XHR0aGVJbnZhbGlkLmNsYXNzTGlzdC5hZGQoJ2N0Y3QtaW52YWxpZCcpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBDaGVjayB0aGUgdmFsdWUgb2YgdGhlIGhpZGRlbiBob25leXBvdCBmaWVsZDsgZGlzYWJsZSBmb3JtIHN1Ym1pc3Npb24gYnV0dG9uIGlmIGFueXRoaW5nIGluIGl0LlxuXHQgKlxuXHQgKiBAYXV0aG9yIENvbnN0YW50IENvbnRhY3Rcblx0ICogQHNpbmNlIDEuMC4wXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBUaGUgY2hhbmdlIG9yIGtleXVwIGV2ZW50IHRyaWdnZXJpbmcgdGhpcyBjYWxsYmFjay5cblx0ICogQHBhcmFtIHtvYmplY3R9IGhvbmV5UG90IFRoZSBvYmplY3QgZm9yIHRoZSBhY3R1YWwgaW5wdXQgZmllbGQgYmVpbmcgY2hlY2tlZC5cblx0ICogQHBhcmFtIHtvYmplY3R9IHN1Ym1pdEJ1dHRvbiBUaGUgb2JqZWN0IGZvciB0aGUgc3VibWl0IGJ1dHRvbiBpbiB0aGUgc2FtZSBmb3JtIGFzIHRoZSBob25leXBvdCBmaWVsZC5cblx0ICovXG5cdGFwcC5jaGVja0hvbmV5cG90ID0gKCBldmVudCwgaG9uZXlQb3QsIHN1Ym1pdEJ1dHRvbiApID0+IHtcblx0XHQvLyBJZiB0aGVyZSBpcyB0ZXh0IGluIHRoZSBob25leXBvdCwgZGlzYWJsZSB0aGUgc3VibWl0IGJ1dHRvbi5cblxuXHRcdC8vIExlYXZpbmcgdGhpcyBkaXNhYmxpbmcgaW4gcGxhY2UgYmVjYXVzZSBpdCBzaG91bGQgbm90IGJlIGdldHRpbmcgdXNlZCBieSBzY3JlZW4gcmVhZGVycyBpbiB0aGUgZmlyc3QgcGxhY2UsIGFuZCBJIGZlZWwgaXQncyBnb2luZyB0byBoZWxwIG1vcmUgdGhhbiBodXJ0IHRvIGtlZXAuXG5cdFx0aWYgKCAwIDwgaG9uZXlQb3QudmFsdWUubGVuZ3RoICkge1xuXHRcdFx0c3VibWl0QnV0dG9uLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCdkaXNhYmxlZCcpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzdWJtaXRCdXR0b24ucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogRW5zdXJlcyB0aGF0IHdlIHNob3VsZCB1c2UgQUpBWCB0byBwcm9jZXNzIHRoZSBzcGVjaWZpZWQgZm9ybSwgYW5kIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgbm90IGVtcHR5LlxuXHQgKlxuXHQgKiBAYXV0aG9yIENvbnN0YW50IENvbnRhY3Rcblx0ICogQHNpbmNlIDEuMC4wXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBmb3JtIG9iamVjdCBmb3IgdGhlIGZvcm0gYmVpbmcgdmFsaWRhdGVkLlxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBGYWxzZSBpZiBBSkFYIHByb2Nlc3NpbmcgaXMgZGlzYWJsZWQgZm9yIHRoaXMgZm9ybSBvciBpZiBhIHJlcXVpcmVkIGZpZWxkIGlzIGVtcHR5LlxuXHQgKi9cblx0YXBwLnZhbGlkYXRlU3VibWlzc2lvbiA9ICggZm9ybSApID0+IHtcblx0XHRpZiAoICdvbicgIT09IGZvcm0uZ2V0QXR0cmlidXRlKCAnZGF0YS1kb2FqYXgnICkgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0bGV0IGZpZWxkcyA9IGZvcm0ucXVlcnlTZWxlY3RvckFsbCgnW3JlcXVpcmVkXScpO1xuXHRcdEFycmF5LmZyb20oZmllbGRzKS5mb3JFYWNoKChmaWVsZCkgPT4ge1xuXHRcdFx0aWYgKGZhbHNlID09PSBmaWVsZC5jaGVja1ZhbGlkaXR5KCkpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH07XG5cblx0LyoqXG5cdCAqIFByZXBlbmRzIGZvcm0gd2l0aCBhIG1lc3NhZ2UgdGhhdCBmYWRlcyBvdXQgaW4gNSBzZWNvbmRzLlxuXHQgKlxuXHQgKiBAYXV0aG9yIENvbnN0YW50IENvbnRhY3Rcblx0ICogQHNpbmNlIDEuMC4wXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBmb3JtIG9iamVjdCBmb3IgdGhlIGZvcm0gYSBtZXNzYWdlIGlzIGJlaW5nIGRpc3BsYXllZCBmb3IuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIGNvbnRlbnQuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc2VzIE9wdGlvbmFsLiBIVE1MIGNsYXNzZXMgdG8gYWRkIHRvIHRoZSBtZXNzYWdlIHdyYXBwZXIuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSByb2xlIFJvbGUgYXR0cmlidXRlIGZvciBhY2Nlc3NpYmlsaXR5LlxuXHQgKi9cblx0YXBwLnNob3dNZXNzYWdlID0gKCBmb3JtLCBtZXNzYWdlLCBjbGFzc2VzID0gJycsIHJvbGUgPSAnbG9nJyApID0+IHtcblxuXHRcdGNvbnN0IHdyYXBwZXIgPSBmb3JtLnBhcmVudEVsZW1lbnQ7XG5cblx0XHRpZiAoIHdyYXBwZXIucXVlcnlTZWxlY3RvcigncC5jdGN0LW1lc3NhZ2UnKSApIHtcblx0XHRcdHdyYXBwZXIucXVlcnlTZWxlY3RvcigncC5jdGN0LW1lc3NhZ2UnKS5yZW1vdmUoKTtcblx0XHR9XG5cblx0XHRsZXQgbWVzc2FnZV90YWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XG5cdFx0bWVzc2FnZV90YWcuc2V0QXR0cmlidXRlKCdjbGFzcycsICdjdGN0LW1lc3NhZ2UgJyArIGNsYXNzZXMpO1xuXHRcdG1lc3NhZ2VfdGFnLnNldEF0dHJpYnV0ZSgncm9sZScsIHJvbGUpO1xuXHRcdG1lc3NhZ2VfdGFnLmlubmVySFRNTCA9IG1lc3NhZ2U7XG5cblx0XHRsZXQgZGlzbWlzc19idG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcblx0XHRkaXNtaXNzX2J0bi5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ2J1dHRvbiBidXR0b24tc2Vjb25kYXJ5IGN0Y3QtZGlzbWlzcyBjdGN0LWRpc21pc3MtYWpheC1ub3RpY2UnKTtcblx0XHRkaXNtaXNzX2J0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnRGlzbWlzcyBub3RpZmljYXRpb24nKTtcblx0XHRkaXNtaXNzX2J0bi5pbm5lckhUTUwgPSAnJiMxMDAwNTsnO1xuXG5cdFx0bWVzc2FnZV90YWcucHJlcGVuZChkaXNtaXNzX2J0bik7XG5cblx0XHRmb3JtLnBhcmVudEVsZW1lbnQucHJlcGVuZChtZXNzYWdlX3RhZyk7XG5cblx0XHR3cmFwcGVyLnF1ZXJ5U2VsZWN0b3IoICcuY3RjdC1kaXNtaXNzLWFqYXgtbm90aWNlJyApLmFkZEV2ZW50TGlzdGVuZXIoXG5cdFx0XHQnY2xpY2snLFxuXHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHRoaXMucGFyZW50RWxlbWVudC5yZW1vdmUoKTtcblx0XHRcdH1cblx0XHQpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBTdWJtaXRzIHRoZSBhY3R1YWwgZm9ybSB2aWEgQUpBWC5cblx0ICpcblx0ICogQGF1dGhvciBDb25zdGFudCBDb250YWN0XG5cdCAqIEBzaW5jZSAxLjAuMFxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gZm9ybSBvYmplY3QgZm9yIHRoZSBmb3JtIGJlaW5nIHN1Ym1pdHRlZC5cblx0ICovXG5cdGFwcC5zdWJtaXRGb3JtID0gKCBmb3JtICkgPT4ge1xuXHRcdGNvbnN0IGRhdGEgPSBuZXcgRm9ybURhdGEoKTtcblx0XHRjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShmb3JtKTtcblx0XHRjb25zdCBmb3JtUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhmb3JtRGF0YSk7XG5cblx0XHRkYXRhLmFwcGVuZCgnYWN0aW9uJywgJ2N0Y3RfcHJvY2Vzc19mb3JtJyk7XG5cdFx0ZGF0YS5hcHBlbmQoJ2RhdGEnLCBmb3JtUGFyYW1zKTtcblxuXHRcdGxldCBvcHRpb25zID0ge1xuXHRcdFx0bWV0aG9kOiAnUE9TVCcsXG5cdFx0XHRib2R5OiBkYXRhXG5cdFx0fTtcblxuXHRcdGZldGNoKFxuXHRcdFx0d2luZG93LmFqYXh1cmwsXG5cdFx0XHRvcHRpb25zXG5cdFx0KVxuXHRcdC50aGVuKChyZXNwb25zZSk9PnJlc3BvbnNlLmpzb24oKSlcblx0XHQudGhlbigocmVzcG9uc2UpPT57XG5cblx0XHRcdGlmICggJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiByZXNwb25zZS5zdGF0dXMgKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCAnc3VjY2VzcycgIT09IHJlc3BvbnNlLnN0YXR1cyApIHtcblx0XHRcdFx0aWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgKHJlc3BvbnNlLmVycm9ycykpIHtcblx0XHRcdFx0XHRhcHAuc2V0QWxsSW5wdXRzVmFsaWQoKTtcblx0XHRcdFx0XHRyZXNwb25zZS5lcnJvcnMuZm9yRWFjaChhcHAucHJvY2Vzc0Vycm9yKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhcHAuc2hvd01lc3NhZ2UoZm9ybSwgcmVzcG9uc2UubWVzc2FnZSwgJ2N0Y3QtZXJyb3InLCAnYWxlcnQnKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0Zm9ybS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXHRcdFx0Ly8gSWYgd2UncmUgaGVyZSwgdGhlIHN1Ym1pc3Npb24gd2FzIGEgc3VjY2Vzczsgc2hvdyBtZXNzYWdlIGFuZCByZXNldCBmb3JtIGZpZWxkcy5cblx0XHRcdGFwcC5zaG93TWVzc2FnZShmb3JtLCByZXNwb25zZS5tZXNzYWdlLCAnY3RjdC1zdWNjZXNzJywgJ3N0YXR1cycpO1xuXHRcdFx0Zm9ybS5yZXNldCgpO1xuXHRcdH0pO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBIYW5kbGUgdGhlIGZvcm0gc3VibWlzc2lvbi5cblx0ICpcblx0ICogQGF1dGhvciBDb25zdGFudCBDb250YWN0XG5cdCAqIEBzaW5jZSAxLjAuMFxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgVGhlIHN1Ym1pdCBldmVudC5cblx0ICogQHBhcmFtIHtvYmplY3R9IGZvcm0gb2JqZWN0IGZvciB0aGUgY3VycmVudCBmb3JtIGJlaW5nIGhhbmRsZWQuXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IEZhbHNlIGlmIHVuYWJsZSB0byB2YWxpZGF0ZSB0aGUgZm9ybS5cblx0ICovXG5cdGFwcC5oYW5kbGVTdWJtaXNzaW9uID0gKCBldmVudCwgZm9ybSApID0+IHtcblxuXHRcdGlmICggISBhcHAudmFsaWRhdGVTdWJtaXNzaW9uKCBmb3JtICkgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Y2xlYXJUaW1lb3V0KCBhcHAudGltZW91dCApO1xuXG5cdFx0aWYgKGZvcm0uY2hlY2tWYWxpZGl0eSgpKSB7XG5cdFx0XHRhcHAudGltZW91dCA9IHNldFRpbWVvdXQoYXBwLnN1Ym1pdEZvcm0sIDUwMCwgZm9ybSk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBTZXQgdXAgZXZlbnQgYmluZGluZ3MgYW5kIGNhbGxiYWNrcy5cblx0ICpcblx0ICogQGF1dGhvciBDb25zdGFudCBDb250YWN0XG5cdCAqIEBzaW5jZSAxLjAuMFxuXHQgKi9cblx0YXBwLmJpbmRFdmVudHMgPSAoKSA9PiB7XG5cdFx0YXBwLmNhY2hlLmZvcm1zLmZvckVhY2goKGZvcm0pID0+IHtcblx0XHRcdGxldCB0aGVzdWJtaXQgPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoJ1t0eXBlPXN1Ym1pdF0nKTtcblx0XHRcdHRoZXN1Ym1pdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuXHRcdFx0XHRsZXQgZG9pbmdhamF4ID0gZm9ybS5nZXRBdHRyaWJ1dGUoICdkYXRhLWRvYWpheCcgKTtcblx0XHRcdFx0aWYgKCBkb2luZ2FqYXggJiYgJ29uJyA9PT0gZG9pbmdhamF4ICkge1xuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRcdFx0XHRhcHAuaGFuZGxlcmVjYXB0Y2hhKGZvcm0pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBmb3JtLmNsYXNzTGlzdC5jb250YWlucyggJ2N0Y3Qtc3VibWl0dGVkJyApICkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRmb3JtLmNsYXNzTGlzdC5hZGQoICdjdGN0LXN1Ym1pdHRlZCcgKTtcblx0XHRcdFx0YXBwLmhhbmRsZVN1Ym1pc3Npb24oIGV2ZW50LCBmb3JtICk7XG5cdFx0XHRcdGZvcm0uY2xhc3NMaXN0LnJlbW92ZSggJ2N0Y3Qtc3VibWl0dGVkJyApO1xuXHRcdFx0fSk7XG5cblx0XHRcdGZvcm0uaG9uZXlwb3QuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGV2ZW50KSA9PiB7XG5cdFx0XHRcdGFwcC5jaGVja0hvbmV5cG90KFxuXHRcdFx0XHRcdGV2ZW50LFxuXHRcdFx0XHRcdGZvcm0uaG9uZXlwb3QsXG5cdFx0XHRcdFx0Zm9ybS5zdWJtaXRCdXR0b25cblx0XHRcdFx0KTtcblx0XHRcdH0pO1xuXG5cdFx0XHRmb3JtLmhvbmV5cG90LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKGV2ZW50KSA9PiB7XG5cdFx0XHRcdGFwcC5jaGVja0hvbmV5cG90KFxuXHRcdFx0XHRcdGV2ZW50LFxuXHRcdFx0XHRcdGZvcm0uaG9uZXlwb3QsXG5cdFx0XHRcdFx0Zm9ybS5zdWJtaXRCdXR0b25cblx0XHRcdFx0KTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBDdXN0b20gaGFuZGxpbmcgd2l0aGluIG91ciB2YWxpZGF0aW9uIGZpbGUsIGZvciBjYXNlcyBvZiByZUNBUFRDSEEgdjMgKyBBSkFYIHN1Ym1pdC5cblx0ICpcblx0ICogQHBhcmFtIGZvcm0gRm9ybSBiZWluZyBzdWJtaXR0ZWQuXG5cdCAqL1xuXHRhcHAuaGFuZGxlcmVjYXB0Y2hhID0gKGZvcm0pID0+IHtcblx0XHRpZiAoJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiAocmVjYXB0Y2hhdjMpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCd1bmRlZmluZWQnID09PSB0eXBlb2YgKHJlY2FwdGNoYXYzLnNpdGVfa2V5KSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICgndW5kZWZpbmVkJyA9PT0gdHlwZW9mIChncmVjYXB0Y2hhKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGdyZWNhcHRjaGEucmVhZHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Z3JlY2FwdGNoYS5leGVjdXRlKHJlY2FwdGNoYXYzLnNpdGVfa2V5LCB7YWN0aW9uOiAnY29uc3RhbnRjb250YWN0c3VibWl0J30pLnRoZW4oZnVuY3Rpb24gKHRva2VuKSB7XG5cdFx0XHRcdFx0bGV0IHJlY2FwdGNoYVJlc3BvbnNlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcblx0XHRcdFx0XHRyZWNhcHRjaGFSZXNwb25zZS5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAnaGlkZGVuJyk7XG5cdFx0XHRcdFx0cmVjYXB0Y2hhUmVzcG9uc2Uuc2V0QXR0cmlidXRlKCduYW1lJywgJ2ctcmVjYXB0Y2hhLXJlc3BvbnNlJyk7XG5cdFx0XHRcdFx0cmVjYXB0Y2hhUmVzcG9uc2Uuc2V0QXR0cmlidXRlKCd2YWx1ZScsIHRva2VuKTtcblxuXHRcdFx0XHRcdGZvcm0uYXBwZW5kKHJlY2FwdGNoYVJlc3BvbnNlLmNsb25lTm9kZSh0cnVlKSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0Y29uc29sZS5sb2coZXJyb3IpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0YXBwLmluaXQoKTtcblxufSAoIHdpbmRvdywgd2luZG93LkNUQ1RTdXBwb3J0ICkgKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQ0EsTUFBTSxDQUFDQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO0FBRXRCLFdBQVVELE1BQU0sRUFBRUUsR0FBRyxFQUFHO0VBRXpCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNDQSxHQUFHLENBQUNDLElBQUksR0FBRyxZQUFNO0lBQ2hCRCxHQUFHLENBQUNFLEtBQUssQ0FBQyxDQUFDO0lBQ1hGLEdBQUcsQ0FBQ0csVUFBVSxDQUFDLENBQUM7RUFDakIsQ0FBQzs7RUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQ0gsR0FBRyxDQUFDRSxLQUFLLEdBQUcsWUFBTTtJQUVqQkYsR0FBRyxDQUFDRSxLQUFLLEdBQUc7TUFDWEUsS0FBSyxFQUFFO0lBQ1IsQ0FBQztJQUVELElBQUlDLE9BQU8sR0FBR0MsUUFBUSxDQUFDQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQztJQUM3RCxJQUFJRixPQUFP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\n//# sourceURL=webpack-internal:///./assets/js/ctct-plugin-frontend/validation.js\n\n}");
    3333
    3434/***/ })
  • constant-contact-forms/trunk/assets/js/ctct-plugin-frontend.min.js

    r3389849 r3397480  
    1 !function(){var t={30:function(){window.CTCTSupport={},function(t,e){e.init=function(){e.cache(),e.bindEvents()},e.cache=function(){e.cache={forms:[]};var t=document.querySelectorAll(".ctct-form-wrapper");t.length&&t.forEach(function(t){var n=t.querySelector("form");n&&e.cache.forms.push(n)}),e.cache.forms.forEach(function(t,n){e.cache.forms[n].honeypot=t.querySelector(".ctct_usage_field"),e.cache.forms[n].submitButton=t.querySelector("input[type=submit]"),e.cache.forms[n].recaptcha=t.querySelector(".g-recaptcha")}),e.timeout=null},e.setAllInputsValid=function(){e.cache.forms.forEach(function(t){var e=t.querySelectorAll(".ctct-invalid");Array.from(e).forEach(function(t){t.classList.remove("ctct-invalid")})})},e.processError=function(t){if(void 0!==t.id){var e=document.querySelectorAll("#"+t.id);Array.from(e).forEach(function(t){t.classList.add("ctct-invalid")})}},e.checkHoneypot=function(t,e,n){0<e.value.length?n.setAttribute("disabled","disabled"):n.removeAttribute("disabled")},e.validateSubmission=function(t){if("on"!==t.getAttribute("data-doajax"))return!1;var e=t.querySelectorAll("[required]");return Array.from(e).forEach(function(t){if(!1===t.checkValidity())return!1}),!0},e.showMessage=function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",c=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"log",r=t.parentElement;r.querySelector("p.ctct-message")&&r.querySelector("p.ctct-message").remove();var o=document.createElement("p");o.setAttribute("class","ctct-message "+n),o.setAttribute("role",c),o.innerHTML=e;var a=document.createElement("button");a.setAttribute("class","button button-secondary ctct-dismiss ctct-dismiss-ajax-notice"),a.setAttribute("aria-label","Dismiss notification"),a.innerHTML="&#10005;",o.prepend(a),t.parentElement.prepend(o),r.querySelector(".ctct-dismiss-ajax-notice").addEventListener("click",function(){this.parentElement.remove()})},e.submitForm=function(n){var c=new FormData,r=new FormData(n),o=new URLSearchParams(r);c.append("action","ctct_process_form"),c.append("data",o);var a={method:"POST",body:c};fetch(t.ajaxurl,a).then(function(t){return t.json()}).then(function(t){return void 0!==t.status&&("success"!==t.status?(void 0!==t.errors?(e.setAllInputsValid(),t.errors.forEach(e.processError)):e.showMessage(n,t.message,"ctct-error","alert"),!1):(n.style.display="none",e.showMessage(n,t.message,"ctct-success","status"),void n.reset()))})},e.handleSubmission=function(t,n){if(!e.validateSubmission(n))return!1;clearTimeout(e.timeout),n.checkValidity()&&(e.timeout=setTimeout(e.submitForm,500,n))},e.bindEvents=function(){e.cache.forms.forEach(function(t){t.querySelector("[type=submit]").addEventListener("click",function(n){var c=t.getAttribute("data-doajax");c&&"on"===c&&(n.preventDefault(),e.handlerecaptcha(t)),t.classList.contains("ctct-submitted")||(t.classList.add("ctct-submitted"),e.handleSubmission(n,t),t.classList.remove("ctct-submitted"))}),t.honeypot.addEventListener("change",function(n){e.checkHoneypot(n,t.honeypot,t.submitButton)}),t.honeypot.addEventListener("keyup",function(n){e.checkHoneypot(n,t.honeypot,t.submitButton)})})},e.handlerecaptcha=function(t){void 0!==recaptchav3.site_key&&grecaptcha.ready(function(){try{grecaptcha.execute(recaptchav3.site_key,{action:"constantcontactsubmit"}).then(function(e){var n=document.createElement("input");n.setAttribute("type","hidden"),n.setAttribute("name","g-recaptcha-response"),n.setAttribute("value",e),t.append(n.cloneNode(!0))})}catch(t){console.log(t)}})},e.init()}(window,window.CTCTSupport)}},e={};function n(c){var r=e[c];if(void 0!==r)return r.exports;var o=e[c]={exports:{}};return t[c](o,o.exports,n),o.exports}n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,{a:e}),e},n.d=function(t,e){for(var c in e)n.o(e,c)&&!n.o(t,c)&&Object.defineProperty(t,c,{enumerable:!0,get:e[c]})},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},function(){"use strict";n(30)}()}();
     1!function(){var t={30:function(){window.CTCTSupport={},function(t,e){e.init=function(){e.cache(),e.bindEvents()},e.cache=function(){e.cache={forms:[]};var t=document.querySelectorAll(".ctct-form-wrapper");t.length&&t.forEach(function(t){var n=t.querySelector("form");n&&e.cache.forms.push(n)}),e.cache.forms.forEach(function(t,n){e.cache.forms[n].honeypot=t.querySelector(".ctct_usage_field"),e.cache.forms[n].submitButton=t.querySelector("input[type=submit]"),e.cache.forms[n].recaptcha=t.querySelector(".g-recaptcha")}),e.timeout=null},e.setAllInputsValid=function(){e.cache.forms.forEach(function(t){var e=t.querySelectorAll(".ctct-invalid");Array.from(e).forEach(function(t){t.classList.remove("ctct-invalid")})})},e.processError=function(t){if(void 0!==t.id){var e=document.querySelectorAll("#"+t.id);Array.from(e).forEach(function(t){t.classList.add("ctct-invalid")})}},e.checkHoneypot=function(t,e,n){0<e.value.length?n.setAttribute("disabled","disabled"):n.removeAttribute("disabled")},e.validateSubmission=function(t){if("on"!==t.getAttribute("data-doajax"))return!1;var e=t.querySelectorAll("[required]");return Array.from(e).forEach(function(t){if(!1===t.checkValidity())return!1}),!0},e.showMessage=function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",c=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"log",r=t.parentElement;r.querySelector("p.ctct-message")&&r.querySelector("p.ctct-message").remove();var o=document.createElement("p");o.setAttribute("class","ctct-message "+n),o.setAttribute("role",c),o.innerHTML=e;var a=document.createElement("button");a.setAttribute("class","button button-secondary ctct-dismiss ctct-dismiss-ajax-notice"),a.setAttribute("aria-label","Dismiss notification"),a.innerHTML="&#10005;",o.prepend(a),t.parentElement.prepend(o),r.querySelector(".ctct-dismiss-ajax-notice").addEventListener("click",function(){this.parentElement.remove()})},e.submitForm=function(n){var c=new FormData,r=new FormData(n),o=new URLSearchParams(r);c.append("action","ctct_process_form"),c.append("data",o);var a={method:"POST",body:c};fetch(t.ajaxurl,a).then(function(t){return t.json()}).then(function(t){return void 0!==t.status&&("success"!==t.status?(void 0!==t.errors?(e.setAllInputsValid(),t.errors.forEach(e.processError)):e.showMessage(n,t.message,"ctct-error","alert"),!1):(n.style.display="none",e.showMessage(n,t.message,"ctct-success","status"),void n.reset()))})},e.handleSubmission=function(t,n){if(!e.validateSubmission(n))return!1;clearTimeout(e.timeout),n.checkValidity()&&(e.timeout=setTimeout(e.submitForm,500,n))},e.bindEvents=function(){e.cache.forms.forEach(function(t){t.querySelector("[type=submit]").addEventListener("click",function(n){var c=t.getAttribute("data-doajax");c&&"on"===c&&(n.preventDefault(),e.handlerecaptcha(t)),t.classList.contains("ctct-submitted")||(t.classList.add("ctct-submitted"),e.handleSubmission(n,t),t.classList.remove("ctct-submitted"))}),t.honeypot.addEventListener("change",function(n){e.checkHoneypot(n,t.honeypot,t.submitButton)}),t.honeypot.addEventListener("keyup",function(n){e.checkHoneypot(n,t.honeypot,t.submitButton)})})},e.handlerecaptcha=function(t){"undefined"!=typeof recaptchav3&&void 0!==recaptchav3.site_key&&"undefined"!=typeof grecaptcha&&grecaptcha.ready(function(){try{grecaptcha.execute(recaptchav3.site_key,{action:"constantcontactsubmit"}).then(function(e){var n=document.createElement("input");n.setAttribute("type","hidden"),n.setAttribute("name","g-recaptcha-response"),n.setAttribute("value",e),t.append(n.cloneNode(!0))})}catch(t){console.log(t)}})},e.init()}(window,window.CTCTSupport)}},e={};function n(c){var r=e[c];if(void 0!==r)return r.exports;var o=e[c]={exports:{}};return t[c](o,o.exports,n),o.exports}n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,{a:e}),e},n.d=function(t,e){for(var c in e)n.o(e,c)&&!n.o(t,c)&&Object.defineProperty(t,c,{enumerable:!0,get:e[c]})},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},function(){"use strict";n(30)}()}();
    22//# sourceMappingURL=ctct-plugin-frontend.min.js.map
  • constant-contact-forms/trunk/assets/js/ctct-plugin-frontend.min.js.map

    r3389849 r3397480  
    1 {"version":3,"file":"./ctct-plugin-frontend.min.js","mappings":"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","sources":["webpack://constant-contact-forms/./assets/js/ctct-plugin-frontend/validation.js","webpack://constant-contact-forms/webpack/bootstrap","webpack://constant-contact-forms/webpack/runtime/compat get default export","webpack://constant-contact-forms/webpack/runtime/define property getters","webpack://constant-contact-forms/webpack/runtime/hasOwnProperty shorthand"],"sourcesContent":["/**\n * Front-end form validation.\n *\n * @since 1.0.0\n */\n\n window.CTCTSupport = {};\n\n( function( window, app ) {\n\n\t/**\n\t * @constructor\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tapp.init = () => {\n\t\tapp.cache();\n\t\tapp.bindEvents();\n\t};\n\n\t/**\n\t * Cache DOM elements.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tapp.cache = () => {\n\n\t\tapp.cache = {\n\t\t\tforms: []\n\t\t};\n\n\t\tlet wrapper = document.querySelectorAll('.ctct-form-wrapper');\n\t\tif (wrapper.length) {\n\t\t\twrapper.forEach((formWrapper) => {\n\t\t\t\tlet found = formWrapper.querySelector('form');\n\t\t\t\tif (found) {\n\t\t\t\t\tapp.cache.forms.push(found);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tapp.cache.forms.forEach((form, index) => {\n\t\t\tapp.cache.forms[index].honeypot = form.querySelector('.ctct_usage_field');\n\t\t\tapp.cache.forms[index].submitButton = form.querySelector('input[type=submit]');\n\t\t\tapp.cache.forms[index].recaptcha = form.querySelector('.g-recaptcha');\n\t\t});\n\n\t\tapp.timeout = null;\n\t};\n\n\t/**\n\t * Remove the ctct-invalid class from elements that have it.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tapp.setAllInputsValid = () => {\n\t\tapp.cache.forms.forEach((form) => {\n\t\t\tlet invalid = form.querySelectorAll('.ctct-invalid');\n\t\t\tArray.from(invalid).forEach((field) => {\n\t\t\t\tfield.classList.remove('ctct-invalid');\n\t\t\t});\n\t\t});\n\t};\n\n\t/**\n\t * Adds .ctct-invalid HTML class to inputs whose values are invalid.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t *\n\t * @param {object} error AJAX response error object.\n\t */\n\tapp.processError = ( error ) => {\n\n\t\t// If we have an id property set.\n\t\tif ( 'undefined' !== typeof( error.id ) ) {\n\t\t\tlet invalid = document.querySelectorAll('#' + error.id);\n\t\t\tArray.from(invalid).forEach((theInvalid) => {\n\t\t\t\ttheInvalid.classList.add('ctct-invalid');\n\t\t\t});\n\t\t}\n\t};\n\n\t/**\n\t * Check the value of the hidden honeypot field; disable form submission button if anything in it.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t *\n\t * @param {object} event The change or keyup event triggering this callback.\n\t * @param {object} honeyPot The object for the actual input field being checked.\n\t * @param {object} submitButton The object for the submit button in the same form as the honeypot field.\n\t */\n\tapp.checkHoneypot = ( event, honeyPot, submitButton ) => {\n\t\t// If there is text in the honeypot, disable the submit button.\n\n\t\t// Leaving this disabling in place because it should not be getting used by screen readers in the first place, and I feel it's going to help more than hurt to keep.\n\t\tif ( 0 < honeyPot.value.length ) {\n\t\t\tsubmitButton.setAttribute('disabled','disabled');\n\t\t} else {\n\t\t\tsubmitButton.removeAttribute('disabled');\n\t\t}\n\t};\n\n\t/**\n\t * Ensures that we should use AJAX to process the specified form, and that all required fields are not empty.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t *\n\t * @param {object} form object for the form being validated.\n\t * @return {boolean} False if AJAX processing is disabled for this form or if a required field is empty.\n\t */\n\tapp.validateSubmission = ( form ) => {\n\t\tif ( 'on' !== form.getAttribute( 'data-doajax' ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tlet fields = form.querySelectorAll('[required]');\n\t\tArray.from(fields).forEach((field) => {\n\t\t\tif (false === field.checkValidity()) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\n\t\treturn true;\n\t};\n\n\t/**\n\t * Prepends form with a message that fades out in 5 seconds.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t *\n\t * @param {object} form object for the form a message is being displayed for.\n\t * @param {string} message The message content.\n\t * @param {string} classes Optional. HTML classes to add to the message wrapper.\n\t * @param {string} role Role attribute for accessibility.\n\t */\n\tapp.showMessage = ( form, message, classes = '', role = 'log' ) => {\n\n\t\tconst wrapper = form.parentElement;\n\n\t\tif ( wrapper.querySelector('p.ctct-message') ) {\n\t\t\twrapper.querySelector('p.ctct-message').remove();\n\t\t}\n\n\t\tlet message_tag = document.createElement('p');\n\t\tmessage_tag.setAttribute('class', 'ctct-message ' + classes);\n\t\tmessage_tag.setAttribute('role', role);\n\t\tmessage_tag.innerHTML = message;\n\n\t\tlet dismiss_btn = document.createElement('button');\n\t\tdismiss_btn.setAttribute('class', 'button button-secondary ctct-dismiss ctct-dismiss-ajax-notice');\n\t\tdismiss_btn.setAttribute('aria-label', 'Dismiss notification');\n\t\tdismiss_btn.innerHTML = '&#10005;';\n\n\t\tmessage_tag.prepend(dismiss_btn);\n\n\t\tform.parentElement.prepend(message_tag);\n\n\t\twrapper.querySelector( '.ctct-dismiss-ajax-notice' ).addEventListener(\n\t\t\t'click',\n\t\t\tfunction() {\n\t\t\t\tthis.parentElement.remove();\n\t\t\t}\n\t\t);\n\t};\n\n\t/**\n\t * Submits the actual form via AJAX.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t *\n\t * @param {object} form object for the form being submitted.\n\t */\n\tapp.submitForm = ( form ) => {\n\t\tconst data = new FormData();\n\t\tconst formData = new FormData(form);\n\t\tconst formParams = new URLSearchParams(formData);\n\n\t\tdata.append('action', 'ctct_process_form');\n\t\tdata.append('data', formParams);\n\n\t\tlet options = {\n\t\t\tmethod: 'POST',\n\t\t\tbody: data\n\t\t};\n\n\t\tfetch(\n\t\t\twindow.ajaxurl,\n\t\t\toptions\n\t\t)\n\t\t.then((response)=>response.json())\n\t\t.then((response)=>{\n\n\t\t\tif ( 'undefined' === typeof response.status ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif ( 'success' !== response.status ) {\n\t\t\t\tif ('undefined' !== typeof (response.errors)) {\n\t\t\t\t\tapp.setAllInputsValid();\n\t\t\t\t\tresponse.errors.forEach(app.processError);\n\t\t\t\t} else {\n\t\t\t\t\tapp.showMessage(form, response.message, 'ctct-error', 'alert');\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tform.style.display = 'none';\n\t\t\t// If we're here, the submission was a success; show message and reset form fields.\n\t\t\tapp.showMessage(form, response.message, 'ctct-success', 'status');\n\t\t\tform.reset();\n\t\t});\n\t};\n\n\t/**\n\t * Handle the form submission.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t *\n\t * @param {object} event The submit event.\n\t * @param {object} form object for the current form being handled.\n\t * @return {boolean} False if unable to validate the form.\n\t */\n\tapp.handleSubmission = ( event, form ) => {\n\n\t\tif ( ! app.validateSubmission( form ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tclearTimeout( app.timeout );\n\n\t\tif (form.checkValidity()) {\n\t\t\tapp.timeout = setTimeout(app.submitForm, 500, form);\n\t\t}\n\t};\n\n\t/**\n\t * Set up event bindings and callbacks.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tapp.bindEvents = () => {\n\t\tapp.cache.forms.forEach((form) => {\n\t\t\tlet thesubmit = form.querySelector('[type=submit]');\n\t\t\tthesubmit.addEventListener('click', (event) => {\n\t\t\t\tlet doingajax = form.getAttribute( 'data-doajax' );\n\t\t\t\tif ( doingajax && 'on' === doingajax ) {\n\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\tapp.handlerecaptcha(form);\n\t\t\t\t}\n\n\t\t\t\tif ( form.classList.contains( 'ctct-submitted' ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tform.classList.add( 'ctct-submitted' );\n\t\t\t\tapp.handleSubmission( event, form );\n\t\t\t\tform.classList.remove( 'ctct-submitted' );\n\t\t\t});\n\n\t\t\tform.honeypot.addEventListener('change', (event) => {\n\t\t\t\tapp.checkHoneypot(\n\t\t\t\t\tevent,\n\t\t\t\t\tform.honeypot,\n\t\t\t\t\tform.submitButton\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tform.honeypot.addEventListener('keyup', (event) => {\n\t\t\t\tapp.checkHoneypot(\n\t\t\t\t\tevent,\n\t\t\t\t\tform.honeypot,\n\t\t\t\t\tform.submitButton\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\t};\n\n\t/**\n\t * Custom handling within our validation file, for cases of reCAPTCHA v3 + AJAX submit.\n\t *\n\t * @param form Form being submitted.\n\t */\n\tapp.handlerecaptcha = (form) => {\n\t\tif ('undefined' === typeof (recaptchav3.site_key)) {\n\t\t\treturn;\n\t\t}\n\n\t\tgrecaptcha.ready(function () {\n\t\t\ttry {\n\t\t\t\tgrecaptcha.execute(recaptchav3.site_key, {action: 'constantcontactsubmit'}).then(function (token) {\n\t\t\t\t\tlet recaptchaResponse = document.createElement('input');\n\t\t\t\t\trecaptchaResponse.setAttribute('type', 'hidden');\n\t\t\t\t\trecaptchaResponse.setAttribute('name', 'g-recaptcha-response');\n\t\t\t\t\trecaptchaResponse.setAttribute('value', token);\n\n\t\t\t\t\tform.append(recaptchaResponse.cloneNode(true));\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tconsole.log(error);\n\t\t\t}\n\t\t});\n\t}\n\n\tapp.init();\n\n} ( window, window.CTCTSupport ) );\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }"],"names":["window","CTCTSupport","app","init","cache","bindEvents","forms","wrapper","document","querySelectorAll","length","forEach","formWrapper","found","querySelector","push","form","index","honeypot","submitButton","recaptcha","timeout","setAllInputsValid","invalid","Array","from","field","classList","remove","processError","error","id","theInvalid","add","checkHoneypot","event","honeyPot","value","setAttribute","removeAttribute","validateSubmission","getAttribute","fields","checkValidity","showMessage","message","classes","arguments","undefined","role","parentElement","message_tag","createElement","innerHTML","dismiss_btn","prepend","addEventListener","this","submitForm","data","FormData","formData","formParams","URLSearchParams","append","options","method","body","fetch","ajaxurl","then","response","json","status","errors","style","display","reset","handleSubmission","clearTimeout","setTimeout","doingajax","preventDefault","handlerecaptcha","contains","recaptchav3","site_key","grecaptcha","ready","execute","action","token","recaptchaResponse","cloneNode","console","log","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","n","getter","__esModule","d","a","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call"],"sourceRoot":""}
     1{"version":3,"file":"./ctct-plugin-frontend.min.js","mappings":"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","sources":["webpack://constant-contact-forms/./assets/js/ctct-plugin-frontend/validation.js","webpack://constant-contact-forms/webpack/bootstrap","webpack://constant-contact-forms/webpack/runtime/compat get default export","webpack://constant-contact-forms/webpack/runtime/define property getters","webpack://constant-contact-forms/webpack/runtime/hasOwnProperty shorthand"],"sourcesContent":["/**\n * Front-end form validation.\n *\n * @since 1.0.0\n */\n\n window.CTCTSupport = {};\n\n( function( window, app ) {\n\n\t/**\n\t * @constructor\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tapp.init = () => {\n\t\tapp.cache();\n\t\tapp.bindEvents();\n\t};\n\n\t/**\n\t * Cache DOM elements.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tapp.cache = () => {\n\n\t\tapp.cache = {\n\t\t\tforms: []\n\t\t};\n\n\t\tlet wrapper = document.querySelectorAll('.ctct-form-wrapper');\n\t\tif (wrapper.length) {\n\t\t\twrapper.forEach((formWrapper) => {\n\t\t\t\tlet found = formWrapper.querySelector('form');\n\t\t\t\tif (found) {\n\t\t\t\t\tapp.cache.forms.push(found);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tapp.cache.forms.forEach((form, index) => {\n\t\t\tapp.cache.forms[index].honeypot = form.querySelector('.ctct_usage_field');\n\t\t\tapp.cache.forms[index].submitButton = form.querySelector('input[type=submit]');\n\t\t\tapp.cache.forms[index].recaptcha = form.querySelector('.g-recaptcha');\n\t\t});\n\n\t\tapp.timeout = null;\n\t};\n\n\t/**\n\t * Remove the ctct-invalid class from elements that have it.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tapp.setAllInputsValid = () => {\n\t\tapp.cache.forms.forEach((form) => {\n\t\t\tlet invalid = form.querySelectorAll('.ctct-invalid');\n\t\t\tArray.from(invalid).forEach((field) => {\n\t\t\t\tfield.classList.remove('ctct-invalid');\n\t\t\t});\n\t\t});\n\t};\n\n\t/**\n\t * Adds .ctct-invalid HTML class to inputs whose values are invalid.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t *\n\t * @param {object} error AJAX response error object.\n\t */\n\tapp.processError = ( error ) => {\n\n\t\t// If we have an id property set.\n\t\tif ( 'undefined' !== typeof( error.id ) ) {\n\t\t\tlet invalid = document.querySelectorAll('#' + error.id);\n\t\t\tArray.from(invalid).forEach((theInvalid) => {\n\t\t\t\ttheInvalid.classList.add('ctct-invalid');\n\t\t\t});\n\t\t}\n\t};\n\n\t/**\n\t * Check the value of the hidden honeypot field; disable form submission button if anything in it.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t *\n\t * @param {object} event The change or keyup event triggering this callback.\n\t * @param {object} honeyPot The object for the actual input field being checked.\n\t * @param {object} submitButton The object for the submit button in the same form as the honeypot field.\n\t */\n\tapp.checkHoneypot = ( event, honeyPot, submitButton ) => {\n\t\t// If there is text in the honeypot, disable the submit button.\n\n\t\t// Leaving this disabling in place because it should not be getting used by screen readers in the first place, and I feel it's going to help more than hurt to keep.\n\t\tif ( 0 < honeyPot.value.length ) {\n\t\t\tsubmitButton.setAttribute('disabled','disabled');\n\t\t} else {\n\t\t\tsubmitButton.removeAttribute('disabled');\n\t\t}\n\t};\n\n\t/**\n\t * Ensures that we should use AJAX to process the specified form, and that all required fields are not empty.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t *\n\t * @param {object} form object for the form being validated.\n\t * @return {boolean} False if AJAX processing is disabled for this form or if a required field is empty.\n\t */\n\tapp.validateSubmission = ( form ) => {\n\t\tif ( 'on' !== form.getAttribute( 'data-doajax' ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tlet fields = form.querySelectorAll('[required]');\n\t\tArray.from(fields).forEach((field) => {\n\t\t\tif (false === field.checkValidity()) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\n\t\treturn true;\n\t};\n\n\t/**\n\t * Prepends form with a message that fades out in 5 seconds.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t *\n\t * @param {object} form object for the form a message is being displayed for.\n\t * @param {string} message The message content.\n\t * @param {string} classes Optional. HTML classes to add to the message wrapper.\n\t * @param {string} role Role attribute for accessibility.\n\t */\n\tapp.showMessage = ( form, message, classes = '', role = 'log' ) => {\n\n\t\tconst wrapper = form.parentElement;\n\n\t\tif ( wrapper.querySelector('p.ctct-message') ) {\n\t\t\twrapper.querySelector('p.ctct-message').remove();\n\t\t}\n\n\t\tlet message_tag = document.createElement('p');\n\t\tmessage_tag.setAttribute('class', 'ctct-message ' + classes);\n\t\tmessage_tag.setAttribute('role', role);\n\t\tmessage_tag.innerHTML = message;\n\n\t\tlet dismiss_btn = document.createElement('button');\n\t\tdismiss_btn.setAttribute('class', 'button button-secondary ctct-dismiss ctct-dismiss-ajax-notice');\n\t\tdismiss_btn.setAttribute('aria-label', 'Dismiss notification');\n\t\tdismiss_btn.innerHTML = '&#10005;';\n\n\t\tmessage_tag.prepend(dismiss_btn);\n\n\t\tform.parentElement.prepend(message_tag);\n\n\t\twrapper.querySelector( '.ctct-dismiss-ajax-notice' ).addEventListener(\n\t\t\t'click',\n\t\t\tfunction() {\n\t\t\t\tthis.parentElement.remove();\n\t\t\t}\n\t\t);\n\t};\n\n\t/**\n\t * Submits the actual form via AJAX.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t *\n\t * @param {object} form object for the form being submitted.\n\t */\n\tapp.submitForm = ( form ) => {\n\t\tconst data = new FormData();\n\t\tconst formData = new FormData(form);\n\t\tconst formParams = new URLSearchParams(formData);\n\n\t\tdata.append('action', 'ctct_process_form');\n\t\tdata.append('data', formParams);\n\n\t\tlet options = {\n\t\t\tmethod: 'POST',\n\t\t\tbody: data\n\t\t};\n\n\t\tfetch(\n\t\t\twindow.ajaxurl,\n\t\t\toptions\n\t\t)\n\t\t.then((response)=>response.json())\n\t\t.then((response)=>{\n\n\t\t\tif ( 'undefined' === typeof response.status ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif ( 'success' !== response.status ) {\n\t\t\t\tif ('undefined' !== typeof (response.errors)) {\n\t\t\t\t\tapp.setAllInputsValid();\n\t\t\t\t\tresponse.errors.forEach(app.processError);\n\t\t\t\t} else {\n\t\t\t\t\tapp.showMessage(form, response.message, 'ctct-error', 'alert');\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tform.style.display = 'none';\n\t\t\t// If we're here, the submission was a success; show message and reset form fields.\n\t\t\tapp.showMessage(form, response.message, 'ctct-success', 'status');\n\t\t\tform.reset();\n\t\t});\n\t};\n\n\t/**\n\t * Handle the form submission.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t *\n\t * @param {object} event The submit event.\n\t * @param {object} form object for the current form being handled.\n\t * @return {boolean} False if unable to validate the form.\n\t */\n\tapp.handleSubmission = ( event, form ) => {\n\n\t\tif ( ! app.validateSubmission( form ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tclearTimeout( app.timeout );\n\n\t\tif (form.checkValidity()) {\n\t\t\tapp.timeout = setTimeout(app.submitForm, 500, form);\n\t\t}\n\t};\n\n\t/**\n\t * Set up event bindings and callbacks.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tapp.bindEvents = () => {\n\t\tapp.cache.forms.forEach((form) => {\n\t\t\tlet thesubmit = form.querySelector('[type=submit]');\n\t\t\tthesubmit.addEventListener('click', (event) => {\n\t\t\t\tlet doingajax = form.getAttribute( 'data-doajax' );\n\t\t\t\tif ( doingajax && 'on' === doingajax ) {\n\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\tapp.handlerecaptcha(form);\n\t\t\t\t}\n\n\t\t\t\tif ( form.classList.contains( 'ctct-submitted' ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tform.classList.add( 'ctct-submitted' );\n\t\t\t\tapp.handleSubmission( event, form );\n\t\t\t\tform.classList.remove( 'ctct-submitted' );\n\t\t\t});\n\n\t\t\tform.honeypot.addEventListener('change', (event) => {\n\t\t\t\tapp.checkHoneypot(\n\t\t\t\t\tevent,\n\t\t\t\t\tform.honeypot,\n\t\t\t\t\tform.submitButton\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tform.honeypot.addEventListener('keyup', (event) => {\n\t\t\t\tapp.checkHoneypot(\n\t\t\t\t\tevent,\n\t\t\t\t\tform.honeypot,\n\t\t\t\t\tform.submitButton\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\t};\n\n\t/**\n\t * Custom handling within our validation file, for cases of reCAPTCHA v3 + AJAX submit.\n\t *\n\t * @param form Form being submitted.\n\t */\n\tapp.handlerecaptcha = (form) => {\n\t\tif ('undefined' === typeof (recaptchav3)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ('undefined' === typeof (recaptchav3.site_key)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ('undefined' === typeof (grecaptcha)) {\n\t\t\treturn;\n\t\t}\n\n\t\tgrecaptcha.ready(function () {\n\t\t\ttry {\n\t\t\t\tgrecaptcha.execute(recaptchav3.site_key, {action: 'constantcontactsubmit'}).then(function (token) {\n\t\t\t\t\tlet recaptchaResponse = document.createElement('input');\n\t\t\t\t\trecaptchaResponse.setAttribute('type', 'hidden');\n\t\t\t\t\trecaptchaResponse.setAttribute('name', 'g-recaptcha-response');\n\t\t\t\t\trecaptchaResponse.setAttribute('value', token);\n\n\t\t\t\t\tform.append(recaptchaResponse.cloneNode(true));\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tconsole.log(error);\n\t\t\t}\n\t\t});\n\t}\n\n\tapp.init();\n\n} ( window, window.CTCTSupport ) );\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }"],"names":["window","CTCTSupport","app","init","cache","bindEvents","forms","wrapper","document","querySelectorAll","length","forEach","formWrapper","found","querySelector","push","form","index","honeypot","submitButton","recaptcha","timeout","setAllInputsValid","invalid","Array","from","field","classList","remove","processError","error","id","theInvalid","add","checkHoneypot","event","honeyPot","value","setAttribute","removeAttribute","validateSubmission","getAttribute","fields","checkValidity","showMessage","message","classes","arguments","undefined","role","parentElement","message_tag","createElement","innerHTML","dismiss_btn","prepend","addEventListener","this","submitForm","data","FormData","formData","formParams","URLSearchParams","append","options","method","body","fetch","ajaxurl","then","response","json","status","errors","style","display","reset","handleSubmission","clearTimeout","setTimeout","doingajax","preventDefault","handlerecaptcha","contains","recaptchav3","site_key","grecaptcha","ready","execute","action","token","recaptchaResponse","cloneNode","console","log","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","n","getter","__esModule","d","a","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call"],"sourceRoot":""}
  • constant-contact-forms/trunk/assets/js/ctct-plugin-frontend/validation.js

    r3389849 r3397480  
    293293     */
    294294    app.handlerecaptcha = (form) => {
     295        if ('undefined' === typeof (recaptchav3)) {
     296            return;
     297        }
     298
    295299        if ('undefined' === typeof (recaptchav3.site_key)) {
     300            return;
     301        }
     302
     303        if ('undefined' === typeof (grecaptcha)) {
    296304            return;
    297305        }
  • constant-contact-forms/trunk/constant-contact-forms.php

    r3393018 r3397480  
    1313 * Plugin URI:  https://www.constantcontact.com
    1414 * Description: Be a better marketer. All it takes is Constant Contact email marketing.
    15  * Version:     2.14.1
     15 * Version:     2.14.2
    1616 * Author:      Constant Contact
    1717 * Author URI:  https://www.constantcontact.com/index?pn=miwordpress
     
    7777     * @var string
    7878     */
    79     const VERSION = '2.14.1';
     79    const VERSION = '2.14.2';
    8080
    8181    /**
  • constant-contact-forms/trunk/readme.txt

    r3393018 r3397480  
    44Requires at least: 6.4.0
    55Tested up to:      6.8
    6 Stable tag:        2.14.1
     6Stable tag:        2.14.2
    77License:           GPLv3
    88License URI:       http://www.gnu.org/licenses/gpl-3.0.html
     
    4949
    5050== Changelog ==
     51
     52= 2.14.2 =
     53* Fixed: errors regarding Google reCAPTCHA v3 javascript variables.
    5154
    5255= 2.14.1 =
     
    109112
    110113== Upgrade Notice ==
    111 * Fixes issues around reCAPTCHA, details related to connection issues, and PHP notices. Adds ability to choose address type.
     114* Fixes issues around reCAPTCHA
    112115
    113116== Frequently Asked Questions ==
Note: See TracChangeset for help on using the changeset viewer.