Constant Contact Forms - Version 1.9.0

Version Description

  • Added: Ability for site owners to multiple lists for users to choose which to sign up for.
  • Fixed: Issues around enabling list signup on user registration.
  • Fixed: Unintended markup in email notification text.
  • Fixed: Inappropriate or unneeded markup around hidden fields.
  • Updated: Max length values for first/last name fields.
  • Updated: Deprecated some functions in order to get consistent naming across all our code.
Download this release

Release Info

Developer constantcontact
Plugin Icon 128x128 Constant Contact Forms
Version 1.9.0
Comparing to
See all releases

Code changes from version 1.8.8 to 1.9.0

Files changed (50) hide show
  1. assets/css/admin-style.css +10 -0
  2. assets/css/style.css +16 -1
  3. assets/css/style.min.css +2 -2
  4. assets/images/check_circle.svg +0 -0
  5. assets/images/error.svg +0 -0
  6. assets/js/ctct-plugin-admin.js +1 -1
  7. assets/js/ctct-plugin-admin.min.js +1 -1
  8. assets/js/ctct-plugin-admin.min.js.map +1 -1
  9. assets/js/ctct-plugin-admin/optins.js +1 -1
  10. assets/sass/_admin-forms.scss +17 -0
  11. assets/sass/_forms.scss +13 -0
  12. assets/sass/_inputs.scss +4 -0
  13. assets/sass/_variables.scss +1 -0
  14. constant-contact-forms.php +12 -10
  15. includes/class-admin.php +21 -10
  16. includes/class-api.php +71 -49
  17. includes/class-builder-fields.php +6 -8
  18. includes/class-check.php +3 -0
  19. includes/class-connect.php +5 -5
  20. includes/class-cpts.php +17 -4
  21. includes/class-display-shortcode.php +1 -1
  22. includes/class-display.php +199 -73
  23. includes/class-gutenberg.php +1 -1
  24. includes/class-lists.php +47 -12
  25. includes/class-logging.php +9 -3
  26. includes/class-mail.php +26 -24
  27. includes/class-middleware.php +15 -8
  28. includes/class-notification-content.php +4 -4
  29. includes/class-notifications.php +1 -1
  30. includes/class-process-form.php +136 -49
  31. includes/class-recaptcha-v2.php +12 -2
  32. includes/class-recaptcha-v3.php +2 -0
  33. includes/class-recaptcha.php +7 -5
  34. includes/class-settings.php +97 -40
  35. includes/class-shortcode.php +1 -0
  36. includes/class-uninstall.php +39 -3
  37. includes/class-user-customizations.php +1 -1
  38. includes/compatibility.php +1 -1
  39. includes/deprecated.php +60 -0
  40. includes/helper-functions.php +26 -25
  41. includes/widgets/contact-form-select.php +8 -6
  42. languages/constant-contact-forms.pot +235 -208
  43. readme.txt +10 -2
  44. vendor/constantcontact/constantcontact/.gitignore +0 -25
  45. vendor/defuse/php-encryption/.gitignore +0 -11
  46. vendor/google/recaptcha/.gitignore +0 -7
  47. vendor/guzzlehttp/ringphp/.gitignore +0 -4
  48. vendor/guzzlehttp/streams/.gitignore +0 -6
  49. vendor/psr/log/.gitignore +0 -1
  50. vendor/react/promise/.gitignore +0 -5
assets/css/admin-style.css CHANGED
@@ -522,6 +522,16 @@ body.post-type-ctct_forms #titlediv #title {
522
  display: none;
523
  }
524
 
 
 
 
 
 
 
 
 
 
 
525
  .ui-dialog .cmb-type-checkbox.cmb2-id--ctct-show-title .cmb-th {
526
  width: 90px;
527
  }
522
  display: none;
523
  }
524
 
525
+ .cmb2-id--ctct-list .cmb2-list {
526
+ background: linear-gradient(#fff 33%, transparent), linear-gradient(transparent, #fff 66%) 0 100%, radial-gradient(farthest-side at 50% 0, rgba(0, 0, 0, 0.5), transparent), radial-gradient(farthest-side at 50% 100%, rgba(0, 0, 0, 0.5), transparent) 0 100%;
527
+ background-attachment: local, local, scroll, scroll;
528
+ background-color: #fff;
529
+ background-repeat: no-repeat;
530
+ background-size: 100% 30px, 100% 30px, 100% 10px, 100% 10px;
531
+ max-height: 10rem;
532
+ overflow-y: auto;
533
+ }
534
+
535
  .ui-dialog .cmb-type-checkbox.cmb2-id--ctct-show-title .cmb-th {
536
  width: 90px;
537
  }
assets/css/style.css CHANGED
@@ -86,6 +86,11 @@
86
  width: 75%;
87
  }
88
 
 
 
 
 
 
89
  .ctct-form-wrapper span.ctct-label-right {
90
  display: inline-block;
91
  width: 20%;
@@ -156,6 +161,16 @@
156
  cursor: pointer;
157
  }
158
 
 
 
 
 
 
 
 
 
 
 
159
  .ctct-twentyfourteen .ctct-form-field input {
160
  width: 100%;
161
  }
@@ -187,4 +202,4 @@
187
  }
188
  }
189
 
190
- /*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN0eWxlLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtFQUNFLGlCQUFpQjtBQUNuQjs7QUFFQTtFQUNFLGlCQUFpQjtFQUNqQixZQUFZO0FBQ2Q7O0FBRUE7RUFDRSx5Q0FBeUM7RUFDekMscUJBQXFCO0VBQ3JCLGNBQWM7QUFDaEI7O0FBRUE7RUFDRSx5Q0FBeUM7RUFDekMscUJBQXFCO0VBQ3JCLGNBQWM7QUFDaEI7O0FBRUE7RUFDRSxrQkFBa0I7RUFDbEIsWUFBWTtFQUNaLGNBQWM7RUFDZCxxQkFBcUI7RUFDckIscUJBQXFCO0FBQ3ZCOztBQUVBO0VBQ0UsZ0JBQWdCO0FBQ2xCOztBQUVBO0VBQ0UscUJBQXFCO0FBQ3ZCOztBQW1DQTtFQUNFLG1EQUFtRDtFQUNuRCw0QkFBNEI7RUFDNUIsNEJBQTRCO0VBQzVCLHFCQUFxQjtFQUNyQixxQkFBcUI7RUFDckIsa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0UscURBQXFEO0VBQ3JELHlDQUF5QztFQUN6Qyw0QkFBNEI7RUFDNUIscUJBQXFCO0VBQ3JCLHFCQUFxQjtFQUNyQixrQkFBa0I7QUFDcEI7O0FBRUE7RUFDRSxrQkFBa0I7RUFDbEIsa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0UscURBQXFEO0VBQ3JELHlDQUF5QztFQUN6Qyw0QkFBNEI7RUFDNUIscUJBQXFCO0VBQ3JCLHFCQUFxQjtFQUNyQixrQkFBa0I7QUFDcEI7O0FBRUE7O0VBRUUscUJBQXFCO0VBQ3JCLFVBQVU7QUFDWjs7QUFFQTtFQUNFLHFCQUFxQjtFQUNyQixnQkFBZ0I7RUFDaEIsVUFBVTtBQUNaOztBQUVBOztFQUVFLHFCQUFxQjtFQUNyQixnQkFBZ0I7RUFDaEIsVUFBVTtBQUNaOztBQUVBO0VBQ0UscUJBQXFCO0VBQ3JCLFVBQVU7QUFDWjs7QUFFQTtFQUNFLHdCQUF3QjtFQUN4Qiw2QkFBNkI7RUFDN0IsdUJBQXVCO0FBQ3pCOztBQUVBO0VBQ0UsY0FBYztFQUNkLHNCQUFzQjtFQUN0QixXQUFXO0VBQ1gsWUFBWTtFQUNaLGdCQUFnQjtFQUNoQixVQUFVO0VBQ1Ysa0JBQWtCO0VBQ2xCLFVBQVU7QUFDWjs7QUFFQTtFQUNFLCtDQUErQztFQUMvQywyQkFBMkI7RUFDM0IsNEJBQTRCO0VBQzVCLGtCQUFrQjtFQUNsQixZQUFZO0VBQ1osWUFBWTtBQUNkOztBQUVBO0VBQ0UsbUJBQW1CO0FBQ3JCOztBQUVBO0VBQ0UsV0FBVztFQUNYLFdBQVc7RUFDWCxjQUFjO0FBQ2hCOztBQUVBOztFQUVFLGNBQWM7QUFDaEI7O0FBRUE7O0VBRUUscUJBQXFCO0FBQ3ZCOztBQUVBO0VBQ0UsWUFBWTtFQUNaLGNBQWM7RUFDZCxpQkFBaUI7QUFDbkI7O0FBRUE7RUFDRSxXQUFXO0VBQ1gsaUJBQWlCO0FBQ25COztBQUVBO0VBQ0UsY0FBYztBQUNoQjs7QUFFQTtFQUNFLGVBQWU7QUFDakI7O0FBRUE7RUFDRSxXQUFXO0FBQ2I7O0FBNUpBO0VBQ0U7SUFDRSxXQUFXO0lBQ1gsZ0JBQWdCO0lBQ2hCLFVBQVU7RUFDWjtFQUNBO0lBQ0UsZUFBZTtFQUNqQjtFQUlBO0lBQ0UsV0FBVztJQUNYLGdCQUFnQjtJQUNoQixVQUFVO0VBQ1o7RUFDQTtJQUNFLGVBQWU7RUFDakI7RUFJQTtJQUNFLFdBQVc7SUFDWCxnQkFBZ0I7SUFDaEIsVUFBVTtFQUNaO0VBQ0E7SUFDRSxlQUFlO0VBQ2pCO0FBckJGIiwiZmlsZSI6InN0eWxlLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi5jdGN0LWZvcm0td3JhcHBlciAuY3RjdC1idXR0b24ge1xuICBmb250LXNpemU6IDAuOXJlbTtcbn1cblxuLmN0Y3QtZm9ybS13cmFwcGVyIC5jdGN0LW1lc3NhZ2Uge1xuICBib3JkZXI6IDFweCBzb2xpZDtcbiAgcGFkZGluZzogMWVtO1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3QtbWVzc2FnZS5jdGN0LWVycm9yIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDY1LCA1NCwgMC4wMik7XG4gIGJvcmRlci1jb2xvcjogI2ZmNDEzNjtcbiAgY29sb3I6ICNjZjBiMDA7XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciAuY3RjdC1tZXNzYWdlLmN0Y3Qtc3VjY2VzcyB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNDYsIDIwNCwgNjQsIDAuMDIpO1xuICBib3JkZXItY29sb3I6ICMyZWNjNDA7XG4gIGNvbG9yOiAjMWI3OTI2O1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3QtbWVzc2FnZSAuY3RjdC1kaXNtaXNzLWFqYXgtbm90aWNlIHtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBmbG9hdDogcmlnaHQ7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBwYWRkaW5nOiAwLjg1cmVtIDFyZW07XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cblxuLmN0Y3QtZm9ybS13cmFwcGVyIC5jdGN0LWZvcm0tZmllbGQge1xuICBtYXJnaW46IDAgMCAxcmVtO1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3QtZmllbGQtaW5saW5lIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogOTkycHgpIHtcbiAgLmN0Y3QtZm9ybS13cmFwcGVyIC5jdGN0LWZpZWxkLWhhbGYge1xuICAgIGZsb2F0OiBsZWZ0O1xuICAgIG1hcmdpbi1yaWdodDogMiU7XG4gICAgd2lkdGg6IDQ4JTtcbiAgfVxuICAuY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3QtZmllbGQtaGFsZjpsYXN0LW9mLXR5cGUge1xuICAgIG1hcmdpbi1yaWdodDogMDtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogOTkycHgpIHtcbiAgLmN0Y3QtZm9ybS13cmFwcGVyIC5jdGN0LWZpZWxkLXRoaXJkIHtcbiAgICBmbG9hdDogbGVmdDtcbiAgICBtYXJnaW4tcmlnaHQ6IDIlO1xuICAgIHdpZHRoOiAzMiU7XG4gIH1cbiAgLmN0Y3QtZm9ybS13cmFwcGVyIC5jdGN0LWZpZWxkLXRoaXJkOmxhc3Qtb2YtdHlwZSB7XG4gICAgbWFyZ2luLXJpZ2h0OiAwO1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkge1xuICAuY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3QtZmllbGQtZm91cnRoIHtcbiAgICBmbG9hdDogbGVmdDtcbiAgICBtYXJnaW4tcmlnaHQ6IDIlO1xuICAgIHdpZHRoOiAyNCU7XG4gIH1cbiAgLmN0Y3QtZm9ybS13cmFwcGVyIC5jdGN0LWZpZWxkLWZvdXJ0aDpsYXN0LW9mLXR5cGUge1xuICAgIG1hcmdpbi1yaWdodDogMDtcbiAgfVxufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgaW5wdXRbdHlwZT0ndGV4dCddOnJlcXVpcmVkOnZhbGlkLCAuY3RjdC1mb3JtLXdyYXBwZXIgaW5wdXRbdHlwZT0nZW1haWwnXTpyZXF1aXJlZDp2YWxpZCwgLmN0Y3QtZm9ybS13cmFwcGVyIGlucHV0W3R5cGU9J3Bhc3N3b3JkJ106cmVxdWlyZWQ6dmFsaWQsIC5jdGN0LWZvcm0td3JhcHBlciBpbnB1dFt0eXBlPSd0ZWwnXTpyZXF1aXJlZDp2YWxpZCwgLmN0Y3QtZm9ybS13cmFwcGVyIGlucHV0W3R5cGU9J251bWJlciddOnJlcXVpcmVkOnZhbGlkIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiLi4vaW1hZ2VzL2NoZWNrX2NpcmNsZS5zdmdcIik7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IDhweCA1MCU7XG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gIGJhY2tncm91bmQtc2l6ZTogMThweDtcbiAgYm9yZGVyLWNvbG9yOiAjMmVjYzQwO1xuICBwYWRkaW5nLWxlZnQ6IDMycHg7XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciBpbnB1dFt0eXBlPSd0ZXh0J106cmVxdWlyZWQuY3RjdC1pbnZhbGlkLCAuY3RjdC1mb3JtLXdyYXBwZXIgaW5wdXRbdHlwZT0ndGV4dCddLmN0Y3QtaW52YWxpZCwgLmN0Y3QtZm9ybS13cmFwcGVyIGlucHV0W3R5cGU9J2VtYWlsJ106cmVxdWlyZWQuY3RjdC1pbnZhbGlkLCAuY3RjdC1mb3JtLXdyYXBwZXIgaW5wdXRbdHlwZT0nZW1haWwnXS5jdGN0LWludmFsaWQsIC5jdGN0LWZvcm0td3JhcHBlciBpbnB1dFt0eXBlPSdwYXNzd29yZCddOnJlcXVpcmVkLmN0Y3QtaW52YWxpZCwgLmN0Y3QtZm9ybS13cmFwcGVyIGlucHV0W3R5cGU9J3Bhc3N3b3JkJ10uY3RjdC1pbnZhbGlkLCAuY3RjdC1mb3JtLXdyYXBwZXIgaW5wdXRbdHlwZT0ndGVsJ106cmVxdWlyZWQuY3RjdC1pbnZhbGlkLCAuY3RjdC1mb3JtLXdyYXBwZXIgaW5wdXRbdHlwZT0ndGVsJ10uY3RjdC1pbnZhbGlkLCAuY3RjdC1mb3JtLXdyYXBwZXIgaW5wdXRbdHlwZT0nbnVtYmVyJ106cmVxdWlyZWQuY3RjdC1pbnZhbGlkLCAuY3RjdC1mb3JtLXdyYXBwZXIgaW5wdXRbdHlwZT0nbnVtYmVyJ10uY3RjdC1pbnZhbGlkIHtcbiAgYmFja2dyb3VuZDogI2ZmZiB1cmwoXCIuLi9pbWFnZXMvZXJyb3Iuc3ZnXCIpIG5vLXJlcGVhdDtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDY1LCA1NCwgMC4wMik7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IDhweCA1MCU7XG4gIGJhY2tncm91bmQtc2l6ZTogMjRweDtcbiAgYm9yZGVyLWNvbG9yOiAjZmY0MTM2O1xuICBwYWRkaW5nLWxlZnQ6IDQwcHg7XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciAuY3RjdC1maWVsZC1lcnJvciB7XG4gIGZvbnQtc2l6ZTogMC44NXJlbTtcbiAgZm9udC1zdHlsZTogaXRhbGljO1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgaW5wdXQuY3RjdC1pbnZhbGlkIHtcbiAgYmFja2dyb3VuZDogI2ZmZiB1cmwoXCIuLi9pbWFnZXMvZXJyb3Iuc3ZnXCIpIG5vLXJlcGVhdDtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDY1LCA1NCwgMC4wMik7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IDhweCA1MCU7XG4gIGJhY2tncm91bmQtc2l6ZTogMjRweDtcbiAgYm9yZGVyLWNvbG9yOiAjZmY0MTM2O1xuICBwYWRkaW5nLWxlZnQ6IDQwcHg7XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciBpbnB1dC5jdGN0LWxhYmVsLWxlZnQsXG4uY3RjdC1mb3JtLXdyYXBwZXIgdGV4dGFyZWEuY3RjdC1sYWJlbC1sZWZ0IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB3aWR0aDogNzUlO1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgc3Bhbi5jdGN0LWxhYmVsLWxlZnQge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1hcmdpbi1yaWdodDogNSU7XG4gIHdpZHRoOiAyMCU7XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciBpbnB1dC5jdGN0LWxhYmVsLXJpZ2h0LFxuLmN0Y3QtZm9ybS13cmFwcGVyIHRleHRhcmVhLmN0Y3QtbGFiZWwtcmlnaHQge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1hcmdpbi1yaWdodDogNSU7XG4gIHdpZHRoOiA3NSU7XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciBzcGFuLmN0Y3QtbGFiZWwtcmlnaHQge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHdpZHRoOiAyMCU7XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciBzcGFuLmN0Y3QtbGFiZWwtaGlkZGVuIHtcbiAgbGVmdDogLTk5OTlweCAhaW1wb3J0YW50O1xuICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDtcbiAgdG9wOiAtOTk5OXB4ICFpbXBvcnRhbnQ7XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciAuY3RjdF91c2FnZSB7XG4gIGJvcmRlcjogMCBub25lO1xuICBjbGlwOiByZWN0KDAsIDAsIDAsIDApO1xuICBoZWlnaHQ6IDFweDtcbiAgbWFyZ2luOiAtMXB4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBwYWRkaW5nOiAwO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHdpZHRoOiAxcHg7XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciAubm8tcmVjYXB0Y2hhIC5jdGN0LXN1Ym1pdHRlZDpkaXNhYmxlZCB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChcIi4uL2ltYWdlcy9vdmFsLm1pbi5zdmdcIik7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgY29sb3I6IHRyYW5zcGFyZW50O1xuICBjdXJzb3I6IHdhaXQ7XG4gIG9wYWNpdHk6IDAuMztcbn1cblxuLmN0Y3QtZm9ybS13cmFwcGVyIC5oYXMtcmVjYXB0Y2hhIC5jdGN0LXN1Ym1pdHRlZDpkaXNhYmxlZCB7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciAuY3RjdC1mb3JtOjphZnRlciB7XG4gIGNsZWFyOiBib3RoO1xuICBjb250ZW50OiAnJztcbiAgZGlzcGxheTogdGFibGU7XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciAuY3RjdC1mb3JtIC5jdGN0LWxhYmVsLXRvcCBsYWJlbCxcbi5jdGN0LWZvcm0td3JhcHBlciAuY3RjdC1mb3JtIC5jdGN0LWxhYmVsLWJvdHRvbSBsYWJlbCB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3QtZm9ybSAuY3RjdC1sYWJlbC1sZWZ0IGxhYmVsLFxuLmN0Y3QtZm9ybS13cmFwcGVyIC5jdGN0LWZvcm0gLmN0Y3QtbGFiZWwtcmlnaHQgbGFiZWwge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciAuY3RjdC1mb3JtIGFiYnIge1xuICBib3JkZXI6IG5vbmU7XG4gIGNvbG9yOiAjZmY0MTM2O1xuICBmb250LXNpemU6IDAuOXJlbTtcbn1cblxuLmN0Y3QtZm9ybS13cmFwcGVyIC5jdGN0LWlucHV0LWNvbnRhaW5lciBsYWJlbCB7XG4gIGNvbG9yOiAjYWFhO1xuICBmb250LXNpemU6IDAuOHJlbTtcbn1cblxuLmN0Y3QtZm9ybS13cmFwcGVyIC5jdGN0LWZpZWxkLWVycm9yIHtcbiAgY29sb3I6ICNmZjQxMzY7XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciAuY3RjdC1zdWJtaXQge1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5jdGN0LXR3ZW50eWZvdXJ0ZWVuIC5jdGN0LWZvcm0tZmllbGQgaW5wdXQge1xuICB3aWR0aDogMTAwJTtcbn1cbiJdfQ== */
86
  width: 75%;
87
  }
88
 
89
+ .ctct-form-wrapper input.ctct-label-right[type="checkbox"],
90
+ .ctct-form-wrapper textarea.ctct-label-right[type="checkbox"] {
91
+ width: auto;
92
+ }
93
+
94
  .ctct-form-wrapper span.ctct-label-right {
95
  display: inline-block;
96
  width: 20%;
161
  cursor: pointer;
162
  }
163
 
164
+ .ctct-form-wrapper .ctct-form-field-checkbox fieldset {
165
+ border: none;
166
+ padding: 0;
167
+ }
168
+
169
+ .ctct-form-wrapper .ctct-form-field-checkbox fieldset legend {
170
+ font-weight: normal;
171
+ padding: 0;
172
+ }
173
+
174
  .ctct-twentyfourteen .ctct-form-field input {
175
  width: 100%;
176
  }
202
  }
203
  }
204
 
205
+ /*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN0eWxlLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtFQUNFLGlCQUFpQjtBQUNuQjs7QUFFQTtFQUNFLGlCQUFpQjtFQUNqQixZQUFZO0FBQ2Q7O0FBRUE7RUFDRSx5Q0FBeUM7RUFDekMscUJBQXFCO0VBQ3JCLGNBQWM7QUFDaEI7O0FBRUE7RUFDRSx5Q0FBeUM7RUFDekMscUJBQXFCO0VBQ3JCLGNBQWM7QUFDaEI7O0FBRUE7RUFDRSxrQkFBa0I7RUFDbEIsWUFBWTtFQUNaLGNBQWM7RUFDZCxxQkFBcUI7RUFDckIscUJBQXFCO0FBQ3ZCOztBQUVBO0VBQ0UsZ0JBQWdCO0FBQ2xCOztBQUVBO0VBQ0UscUJBQXFCO0FBQ3ZCOztBQW1DQTtFQUNFLG1EQUFtRDtFQUNuRCw0QkFBNEI7RUFDNUIsNEJBQTRCO0VBQzVCLHFCQUFxQjtFQUNyQixxQkFBcUI7RUFDckIsa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0UscURBQXFEO0VBQ3JELHlDQUF5QztFQUN6Qyw0QkFBNEI7RUFDNUIscUJBQXFCO0VBQ3JCLHFCQUFxQjtFQUNyQixrQkFBa0I7QUFDcEI7O0FBRUE7RUFDRSxrQkFBa0I7RUFDbEIsa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0UscURBQXFEO0VBQ3JELHlDQUF5QztFQUN6Qyw0QkFBNEI7RUFDNUIscUJBQXFCO0VBQ3JCLHFCQUFxQjtFQUNyQixrQkFBa0I7QUFDcEI7O0FBRUE7O0VBRUUscUJBQXFCO0VBQ3JCLFVBQVU7QUFDWjs7QUFFQTtFQUNFLHFCQUFxQjtFQUNyQixnQkFBZ0I7RUFDaEIsVUFBVTtBQUNaOztBQUVBOztFQUVFLHFCQUFxQjtFQUNyQixnQkFBZ0I7RUFDaEIsVUFBVTtBQUNaOztBQUVBOztFQUVFLFdBQVc7QUFDYjs7QUFFQTtFQUNFLHFCQUFxQjtFQUNyQixVQUFVO0FBQ1o7O0FBRUE7RUFDRSx3QkFBd0I7RUFDeEIsNkJBQTZCO0VBQzdCLHVCQUF1QjtBQUN6Qjs7QUFFQTtFQUNFLGNBQWM7RUFDZCxzQkFBc0I7RUFDdEIsV0FBVztFQUNYLFlBQVk7RUFDWixnQkFBZ0I7RUFDaEIsVUFBVTtFQUNWLGtCQUFrQjtFQUNsQixVQUFVO0FBQ1o7O0FBRUE7RUFDRSwrQ0FBK0M7RUFDL0MsMkJBQTJCO0VBQzNCLDRCQUE0QjtFQUM1QixrQkFBa0I7RUFDbEIsWUFBWTtFQUNaLFlBQVk7QUFDZDs7QUFFQTtFQUNFLG1CQUFtQjtBQUNyQjs7QUFFQTtFQUNFLFdBQVc7RUFDWCxXQUFXO0VBQ1gsY0FBYztBQUNoQjs7QUFFQTs7RUFFRSxjQUFjO0FBQ2hCOztBQUVBOztFQUVFLHFCQUFxQjtBQUN2Qjs7QUFFQTtFQUNFLFlBQVk7RUFDWixjQUFjO0VBQ2QsaUJBQWlCO0FBQ25COztBQUVBO0VBQ0UsV0FBVztFQUNYLGlCQUFpQjtBQUNuQjs7QUFFQTtFQUNFLGNBQWM7QUFDaEI7O0FBRUE7RUFDRSxlQUFlO0FBQ2pCOztBQUVBO0VBQ0UsWUFBWTtFQUNaLFVBQVU7QUFDWjs7QUFFQTtFQUNFLG1CQUFtQjtFQUNuQixVQUFVO0FBQ1o7O0FBRUE7RUFDRSxXQUFXO0FBQ2I7O0FBM0tBO0VBQ0U7SUFDRSxXQUFXO0lBQ1gsZ0JBQWdCO0lBQ2hCLFVBQVU7RUFDWjtFQUNBO0lBQ0UsZUFBZTtFQUNqQjtFQUlBO0lBQ0UsV0FBVztJQUNYLGdCQUFnQjtJQUNoQixVQUFVO0VBQ1o7RUFDQTtJQUNFLGVBQWU7RUFDakI7RUFJQTtJQUNFLFdBQVc7SUFDWCxnQkFBZ0I7SUFDaEIsVUFBVTtFQUNaO0VBQ0E7SUFDRSxlQUFlO0VBQ2pCO0FBckJGIiwiZmlsZSI6InN0eWxlLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi5jdGN0LWZvcm0td3JhcHBlciAuY3RjdC1idXR0b24ge1xuICBmb250LXNpemU6IDAuOXJlbTtcbn1cblxuLmN0Y3QtZm9ybS13cmFwcGVyIC5jdGN0LW1lc3NhZ2Uge1xuICBib3JkZXI6IDFweCBzb2xpZDtcbiAgcGFkZGluZzogMWVtO1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3QtbWVzc2FnZS5jdGN0LWVycm9yIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDY1LCA1NCwgMC4wMik7XG4gIGJvcmRlci1jb2xvcjogI2ZmNDEzNjtcbiAgY29sb3I6ICNjZjBiMDA7XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciAuY3RjdC1tZXNzYWdlLmN0Y3Qtc3VjY2VzcyB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNDYsIDIwNCwgNjQsIDAuMDIpO1xuICBib3JkZXItY29sb3I6ICMyZWNjNDA7XG4gIGNvbG9yOiAjMWI3OTI2O1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3QtbWVzc2FnZSAuY3RjdC1kaXNtaXNzLWFqYXgtbm90aWNlIHtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBmbG9hdDogcmlnaHQ7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBwYWRkaW5nOiAwLjg1cmVtIDFyZW07XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cblxuLmN0Y3QtZm9ybS13cmFwcGVyIC5jdGN0LWZvcm0tZmllbGQge1xuICBtYXJnaW46IDAgMCAxcmVtO1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3QtZmllbGQtaW5saW5lIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogOTkycHgpIHtcbiAgLmN0Y3QtZm9ybS13cmFwcGVyIC5jdGN0LWZpZWxkLWhhbGYge1xuICAgIGZsb2F0OiBsZWZ0O1xuICAgIG1hcmdpbi1yaWdodDogMiU7XG4gICAgd2lkdGg6IDQ4JTtcbiAgfVxuICAuY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3QtZmllbGQtaGFsZjpsYXN0LW9mLXR5cGUge1xuICAgIG1hcmdpbi1yaWdodDogMDtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogOTkycHgpIHtcbiAgLmN0Y3QtZm9ybS13cmFwcGVyIC5jdGN0LWZpZWxkLXRoaXJkIHtcbiAgICBmbG9hdDogbGVmdDtcbiAgICBtYXJnaW4tcmlnaHQ6IDIlO1xuICAgIHdpZHRoOiAzMiU7XG4gIH1cbiAgLmN0Y3QtZm9ybS13cmFwcGVyIC5jdGN0LWZpZWxkLXRoaXJkOmxhc3Qtb2YtdHlwZSB7XG4gICAgbWFyZ2luLXJpZ2h0OiAwO1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkge1xuICAuY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3QtZmllbGQtZm91cnRoIHtcbiAgICBmbG9hdDogbGVmdDtcbiAgICBtYXJnaW4tcmlnaHQ6IDIlO1xuICAgIHdpZHRoOiAyNCU7XG4gIH1cbiAgLmN0Y3QtZm9ybS13cmFwcGVyIC5jdGN0LWZpZWxkLWZvdXJ0aDpsYXN0LW9mLXR5cGUge1xuICAgIG1hcmdpbi1yaWdodDogMDtcbiAgfVxufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgaW5wdXRbdHlwZT0ndGV4dCddOnJlcXVpcmVkOnZhbGlkLCAuY3RjdC1mb3JtLXdyYXBwZXIgaW5wdXRbdHlwZT0nZW1haWwnXTpyZXF1aXJlZDp2YWxpZCwgLmN0Y3QtZm9ybS13cmFwcGVyIGlucHV0W3R5cGU9J3Bhc3N3b3JkJ106cmVxdWlyZWQ6dmFsaWQsIC5jdGN0LWZvcm0td3JhcHBlciBpbnB1dFt0eXBlPSd0ZWwnXTpyZXF1aXJlZDp2YWxpZCwgLmN0Y3QtZm9ybS13cmFwcGVyIGlucHV0W3R5cGU9J251bWJlciddOnJlcXVpcmVkOnZhbGlkIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiLi4vaW1hZ2VzL2NoZWNrX2NpcmNsZS5zdmdcIik7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IDhweCA1MCU7XG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gIGJhY2tncm91bmQtc2l6ZTogMThweDtcbiAgYm9yZGVyLWNvbG9yOiAjMmVjYzQwO1xuICBwYWRkaW5nLWxlZnQ6IDMycHg7XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciBpbnB1dFt0eXBlPSd0ZXh0J106cmVxdWlyZWQuY3RjdC1pbnZhbGlkLCAuY3RjdC1mb3JtLXdyYXBwZXIgaW5wdXRbdHlwZT0ndGV4dCddLmN0Y3QtaW52YWxpZCwgLmN0Y3QtZm9ybS13cmFwcGVyIGlucHV0W3R5cGU9J2VtYWlsJ106cmVxdWlyZWQuY3RjdC1pbnZhbGlkLCAuY3RjdC1mb3JtLXdyYXBwZXIgaW5wdXRbdHlwZT0nZW1haWwnXS5jdGN0LWludmFsaWQsIC5jdGN0LWZvcm0td3JhcHBlciBpbnB1dFt0eXBlPSdwYXNzd29yZCddOnJlcXVpcmVkLmN0Y3QtaW52YWxpZCwgLmN0Y3QtZm9ybS13cmFwcGVyIGlucHV0W3R5cGU9J3Bhc3N3b3JkJ10uY3RjdC1pbnZhbGlkLCAuY3RjdC1mb3JtLXdyYXBwZXIgaW5wdXRbdHlwZT0ndGVsJ106cmVxdWlyZWQuY3RjdC1pbnZhbGlkLCAuY3RjdC1mb3JtLXdyYXBwZXIgaW5wdXRbdHlwZT0ndGVsJ10uY3RjdC1pbnZhbGlkLCAuY3RjdC1mb3JtLXdyYXBwZXIgaW5wdXRbdHlwZT0nbnVtYmVyJ106cmVxdWlyZWQuY3RjdC1pbnZhbGlkLCAuY3RjdC1mb3JtLXdyYXBwZXIgaW5wdXRbdHlwZT0nbnVtYmVyJ10uY3RjdC1pbnZhbGlkIHtcbiAgYmFja2dyb3VuZDogI2ZmZiB1cmwoXCIuLi9pbWFnZXMvZXJyb3Iuc3ZnXCIpIG5vLXJlcGVhdDtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDY1LCA1NCwgMC4wMik7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IDhweCA1MCU7XG4gIGJhY2tncm91bmQtc2l6ZTogMjRweDtcbiAgYm9yZGVyLWNvbG9yOiAjZmY0MTM2O1xuICBwYWRkaW5nLWxlZnQ6IDQwcHg7XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciAuY3RjdC1maWVsZC1lcnJvciB7XG4gIGZvbnQtc2l6ZTogMC44NXJlbTtcbiAgZm9udC1zdHlsZTogaXRhbGljO1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgaW5wdXQuY3RjdC1pbnZhbGlkIHtcbiAgYmFja2dyb3VuZDogI2ZmZiB1cmwoXCIuLi9pbWFnZXMvZXJyb3Iuc3ZnXCIpIG5vLXJlcGVhdDtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDY1LCA1NCwgMC4wMik7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IDhweCA1MCU7XG4gIGJhY2tncm91bmQtc2l6ZTogMjRweDtcbiAgYm9yZGVyLWNvbG9yOiAjZmY0MTM2O1xuICBwYWRkaW5nLWxlZnQ6IDQwcHg7XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciBpbnB1dC5jdGN0LWxhYmVsLWxlZnQsXG4uY3RjdC1mb3JtLXdyYXBwZXIgdGV4dGFyZWEuY3RjdC1sYWJlbC1sZWZ0IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB3aWR0aDogNzUlO1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgc3Bhbi5jdGN0LWxhYmVsLWxlZnQge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1hcmdpbi1yaWdodDogNSU7XG4gIHdpZHRoOiAyMCU7XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciBpbnB1dC5jdGN0LWxhYmVsLXJpZ2h0LFxuLmN0Y3QtZm9ybS13cmFwcGVyIHRleHRhcmVhLmN0Y3QtbGFiZWwtcmlnaHQge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1hcmdpbi1yaWdodDogNSU7XG4gIHdpZHRoOiA3NSU7XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciBpbnB1dC5jdGN0LWxhYmVsLXJpZ2h0W3R5cGU9XCJjaGVja2JveFwiXSxcbi5jdGN0LWZvcm0td3JhcHBlciB0ZXh0YXJlYS5jdGN0LWxhYmVsLXJpZ2h0W3R5cGU9XCJjaGVja2JveFwiXSB7XG4gIHdpZHRoOiBhdXRvO1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgc3Bhbi5jdGN0LWxhYmVsLXJpZ2h0IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB3aWR0aDogMjAlO1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgc3Bhbi5jdGN0LWxhYmVsLWhpZGRlbiB7XG4gIGxlZnQ6IC05OTk5cHggIWltcG9ydGFudDtcbiAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7XG4gIHRvcDogLTk5OTlweCAhaW1wb3J0YW50O1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3RfdXNhZ2Uge1xuICBib3JkZXI6IDAgbm9uZTtcbiAgY2xpcDogcmVjdCgwLCAwLCAwLCAwKTtcbiAgaGVpZ2h0OiAxcHg7XG4gIG1hcmdpbjogLTFweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgcGFkZGluZzogMDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB3aWR0aDogMXB4O1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgLm5vLXJlY2FwdGNoYSAuY3RjdC1zdWJtaXR0ZWQ6ZGlzYWJsZWQge1xuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCIuLi9pbWFnZXMvb3ZhbC5taW4uc3ZnXCIpO1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7XG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gIGNvbG9yOiB0cmFuc3BhcmVudDtcbiAgY3Vyc29yOiB3YWl0O1xuICBvcGFjaXR5OiAwLjM7XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciAuaGFzLXJlY2FwdGNoYSAuY3RjdC1zdWJtaXR0ZWQ6ZGlzYWJsZWQge1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3QtZm9ybTo6YWZ0ZXIge1xuICBjbGVhcjogYm90aDtcbiAgY29udGVudDogJyc7XG4gIGRpc3BsYXk6IHRhYmxlO1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3QtZm9ybSAuY3RjdC1sYWJlbC10b3AgbGFiZWwsXG4uY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3QtZm9ybSAuY3RjdC1sYWJlbC1ib3R0b20gbGFiZWwge1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuLmN0Y3QtZm9ybS13cmFwcGVyIC5jdGN0LWZvcm0gLmN0Y3QtbGFiZWwtbGVmdCBsYWJlbCxcbi5jdGN0LWZvcm0td3JhcHBlciAuY3RjdC1mb3JtIC5jdGN0LWxhYmVsLXJpZ2h0IGxhYmVsIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3QtZm9ybSBhYmJyIHtcbiAgYm9yZGVyOiBub25lO1xuICBjb2xvcjogI2ZmNDEzNjtcbiAgZm9udC1zaXplOiAwLjlyZW07XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciAuY3RjdC1pbnB1dC1jb250YWluZXIgbGFiZWwge1xuICBjb2xvcjogI2FhYTtcbiAgZm9udC1zaXplOiAwLjhyZW07XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciAuY3RjdC1maWVsZC1lcnJvciB7XG4gIGNvbG9yOiAjZmY0MTM2O1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3Qtc3VibWl0IHtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3QtZm9ybS1maWVsZC1jaGVja2JveCBmaWVsZHNldCB7XG4gIGJvcmRlcjogbm9uZTtcbiAgcGFkZGluZzogMDtcbn1cblxuLmN0Y3QtZm9ybS13cmFwcGVyIC5jdGN0LWZvcm0tZmllbGQtY2hlY2tib3ggZmllbGRzZXQgbGVnZW5kIHtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgcGFkZGluZzogMDtcbn1cblxuLmN0Y3QtdHdlbnR5Zm91cnRlZW4gLmN0Y3QtZm9ybS1maWVsZCBpbnB1dCB7XG4gIHdpZHRoOiAxMDAlO1xufVxuIl19 */
assets/css/style.min.css CHANGED
@@ -1,2 +1,2 @@
1
- .ctct-form-wrapper .ctct-button{font-size:.9rem}.ctct-form-wrapper .ctct-message{border:1px solid;padding:1em}.ctct-form-wrapper .ctct-message.ctct-error{background-color:rgba(255,65,54,.02);border-color:#ff4136;color:#cf0b00}.ctct-form-wrapper .ctct-message.ctct-success{background-color:rgba(46,204,64,.02);border-color:#2ecc40;color:#1b7926}.ctct-form-wrapper .ctct-message .ctct-dismiss-ajax-notice{border-radius:50%;float:right;line-height:1;padding:.85rem 1rem;text-decoration:none}.ctct-form-wrapper .ctct-form-field{margin:0 0 1rem}.ctct-form-wrapper .ctct-field-inline{display:inline-block}.ctct-form-wrapper input[type=email]:required:valid,.ctct-form-wrapper input[type=number]:required:valid,.ctct-form-wrapper input[type=password]:required:valid,.ctct-form-wrapper input[type=tel]:required:valid,.ctct-form-wrapper input[type=text]:required:valid{background-image:url(../images/check_circle.svg);background-position:8px 50%;background-repeat:no-repeat;background-size:18px;border-color:#2ecc40;padding-left:32px}.ctct-form-wrapper input[type=email].ctct-invalid,.ctct-form-wrapper input[type=email]:required.ctct-invalid,.ctct-form-wrapper input[type=number].ctct-invalid,.ctct-form-wrapper input[type=number]:required.ctct-invalid,.ctct-form-wrapper input[type=password].ctct-invalid,.ctct-form-wrapper input[type=password]:required.ctct-invalid,.ctct-form-wrapper input[type=tel].ctct-invalid,.ctct-form-wrapper input[type=tel]:required.ctct-invalid,.ctct-form-wrapper input[type=text].ctct-invalid,.ctct-form-wrapper input[type=text]:required.ctct-invalid{background:#fff url(../images/error.svg) no-repeat;background-color:rgba(255,65,54,.02);background-position:8px 50%;background-size:24px;border-color:#ff4136;padding-left:40px}.ctct-form-wrapper .ctct-field-error{font-size:.85rem;font-style:italic}.ctct-form-wrapper input.ctct-invalid{background:#fff url(../images/error.svg) no-repeat;background-color:rgba(255,65,54,.02);background-position:8px 50%;background-size:24px;border-color:#ff4136;padding-left:40px}.ctct-form-wrapper input.ctct-label-left,.ctct-form-wrapper textarea.ctct-label-left{display:inline-block;width:75%}.ctct-form-wrapper span.ctct-label-left{display:inline-block;margin-right:5%;width:20%}.ctct-form-wrapper input.ctct-label-right,.ctct-form-wrapper textarea.ctct-label-right{display:inline-block;margin-right:5%;width:75%}.ctct-form-wrapper span.ctct-label-right{display:inline-block;width:20%}.ctct-form-wrapper span.ctct-label-hidden{left:-9999px!important;position:absolute!important;top:-9999px!important}.ctct-form-wrapper .ctct_usage{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ctct-form-wrapper .no-recaptcha .ctct-submitted:disabled{background-image:url(../images/oval.min.svg);background-position:50%;background-repeat:no-repeat;color:transparent;cursor:wait;opacity:.3}.ctct-form-wrapper .has-recaptcha .ctct-submitted:disabled{cursor:not-allowed}.ctct-form-wrapper .ctct-form:after{clear:both;content:"";display:table}.ctct-form-wrapper .ctct-form .ctct-label-bottom label,.ctct-form-wrapper .ctct-form .ctct-label-top label{display:block}.ctct-form-wrapper .ctct-form .ctct-label-left label,.ctct-form-wrapper .ctct-form .ctct-label-right label{display:inline-block}.ctct-form-wrapper .ctct-form abbr{border:none;color:#ff4136;font-size:.9rem}.ctct-form-wrapper .ctct-input-container label{color:#aaa;font-size:.8rem}.ctct-form-wrapper .ctct-field-error{color:#ff4136}.ctct-form-wrapper .ctct-submit{cursor:pointer}.ctct-twentyfourteen .ctct-form-field input{width:100%}@media (min-width:992px){.ctct-form-wrapper .ctct-field-half{float:left;margin-right:2%;width:48%}.ctct-form-wrapper .ctct-field-half:last-of-type{margin-right:0}.ctct-form-wrapper .ctct-field-third{float:left;margin-right:2%;width:32%}.ctct-form-wrapper .ctct-field-third:last-of-type{margin-right:0}.ctct-form-wrapper .ctct-field-fourth{float:left;margin-right:2%;width:24%}.ctct-form-wrapper .ctct-field-fourth:last-of-type{margin-right:0}}
2
- /*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN0eWxlLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxnQ0FDRSxlQUNGLENBRUEsaUNBQ0UsZ0JBQWlCLENBQ2pCLFdBQ0YsQ0FFQSw0Q0FDRSxvQ0FBeUMsQ0FDekMsb0JBQXFCLENBQ3JCLGFBQ0YsQ0FFQSw4Q0FDRSxvQ0FBeUMsQ0FDekMsb0JBQXFCLENBQ3JCLGFBQ0YsQ0FFQSwyREFDRSxpQkFBa0IsQ0FDbEIsV0FBWSxDQUNaLGFBQWMsQ0FDZCxtQkFBcUIsQ0FDckIsb0JBQ0YsQ0FFQSxvQ0FDRSxlQUNGLENBRUEsc0NBQ0Usb0JBQ0YsQ0FtQ0EscVFBQ0UsZ0RBQW1ELENBQ25ELDJCQUE0QixDQUM1QiwyQkFBNEIsQ0FDNUIsb0JBQXFCLENBQ3JCLG9CQUFxQixDQUNyQixpQkFDRixDQUVBLG1pQkFDRSxrREFBcUQsQ0FDckQsb0NBQXlDLENBQ3pDLDJCQUE0QixDQUM1QixvQkFBcUIsQ0FDckIsb0JBQXFCLENBQ3JCLGlCQUNGLENBRUEscUNBQ0UsZ0JBQWtCLENBQ2xCLGlCQUNGLENBRUEsc0NBQ0Usa0RBQXFELENBQ3JELG9DQUF5QyxDQUN6QywyQkFBNEIsQ0FDNUIsb0JBQXFCLENBQ3JCLG9CQUFxQixDQUNyQixpQkFDRixDQUVBLHFGQUVFLG9CQUFxQixDQUNyQixTQUNGLENBRUEsd0NBQ0Usb0JBQXFCLENBQ3JCLGVBQWdCLENBQ2hCLFNBQ0YsQ0FFQSx1RkFFRSxvQkFBcUIsQ0FDckIsZUFBZ0IsQ0FDaEIsU0FDRixDQUVBLHlDQUNFLG9CQUFxQixDQUNyQixTQUNGLENBRUEsMENBQ0Usc0JBQXdCLENBQ3hCLDJCQUE2QixDQUM3QixxQkFDRixDQUVBLCtCQUNFLFFBQWMsQ0FDZCxrQkFBc0IsQ0FDdEIsVUFBVyxDQUNYLFdBQVksQ0FDWixlQUFnQixDQUNoQixTQUFVLENBQ1YsaUJBQWtCLENBQ2xCLFNBQ0YsQ0FFQSwwREFDRSw0Q0FBK0MsQ0FDL0MsdUJBQTJCLENBQzNCLDJCQUE0QixDQUM1QixpQkFBa0IsQ0FDbEIsV0FBWSxDQUNaLFVBQ0YsQ0FFQSwyREFDRSxrQkFDRixDQUVBLG9DQUNFLFVBQVcsQ0FDWCxVQUFXLENBQ1gsYUFDRixDQUVBLDJHQUVFLGFBQ0YsQ0FFQSwyR0FFRSxvQkFDRixDQUVBLG1DQUNFLFdBQVksQ0FDWixhQUFjLENBQ2QsZUFDRixDQUVBLCtDQUNFLFVBQVcsQ0FDWCxlQUNGLENBRUEscUNBQ0UsYUFDRixDQUVBLGdDQUNFLGNBQ0YsQ0FFQSw0Q0FDRSxVQUNGLENBNUpBLHlCQUNFLG9DQUNFLFVBQVcsQ0FDWCxlQUFnQixDQUNoQixTQUNGLENBQ0EsaURBQ0UsY0FDRixDQUlBLHFDQUNFLFVBQVcsQ0FDWCxlQUFnQixDQUNoQixTQUNGLENBQ0Esa0RBQ0UsY0FDRixDQUlBLHNDQUNFLFVBQVcsQ0FDWCxlQUFnQixDQUNoQixTQUNGLENBQ0EsbURBQ0UsY0FDRixDQXJCRiIsImZpbGUiOiJzdHlsZS5taW4uY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLmN0Y3QtZm9ybS13cmFwcGVyIC5jdGN0LWJ1dHRvbiB7XG4gIGZvbnQtc2l6ZTogMC45cmVtO1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3QtbWVzc2FnZSB7XG4gIGJvcmRlcjogMXB4IHNvbGlkO1xuICBwYWRkaW5nOiAxZW07XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciAuY3RjdC1tZXNzYWdlLmN0Y3QtZXJyb3Ige1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgNjUsIDU0LCAwLjAyKTtcbiAgYm9yZGVyLWNvbG9yOiAjZmY0MTM2O1xuICBjb2xvcjogI2NmMGIwMDtcbn1cblxuLmN0Y3QtZm9ybS13cmFwcGVyIC5jdGN0LW1lc3NhZ2UuY3RjdC1zdWNjZXNzIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSg0NiwgMjA0LCA2NCwgMC4wMik7XG4gIGJvcmRlci1jb2xvcjogIzJlY2M0MDtcbiAgY29sb3I6ICMxYjc5MjY7XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciAuY3RjdC1tZXNzYWdlIC5jdGN0LWRpc21pc3MtYWpheC1ub3RpY2Uge1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIGZsb2F0OiByaWdodDtcbiAgbGluZS1oZWlnaHQ6IDE7XG4gIHBhZGRpbmc6IDAuODVyZW0gMXJlbTtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3QtZm9ybS1maWVsZCB7XG4gIG1hcmdpbjogMCAwIDFyZW07XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciAuY3RjdC1maWVsZC1pbmxpbmUge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkge1xuICAuY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3QtZmllbGQtaGFsZiB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gICAgbWFyZ2luLXJpZ2h0OiAyJTtcbiAgICB3aWR0aDogNDglO1xuICB9XG4gIC5jdGN0LWZvcm0td3JhcHBlciAuY3RjdC1maWVsZC1oYWxmOmxhc3Qtb2YtdHlwZSB7XG4gICAgbWFyZ2luLXJpZ2h0OiAwO1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkge1xuICAuY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3QtZmllbGQtdGhpcmQge1xuICAgIGZsb2F0OiBsZWZ0O1xuICAgIG1hcmdpbi1yaWdodDogMiU7XG4gICAgd2lkdGg6IDMyJTtcbiAgfVxuICAuY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3QtZmllbGQtdGhpcmQ6bGFzdC1vZi10eXBlIHtcbiAgICBtYXJnaW4tcmlnaHQ6IDA7XG4gIH1cbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDk5MnB4KSB7XG4gIC5jdGN0LWZvcm0td3JhcHBlciAuY3RjdC1maWVsZC1mb3VydGgge1xuICAgIGZsb2F0OiBsZWZ0O1xuICAgIG1hcmdpbi1yaWdodDogMiU7XG4gICAgd2lkdGg6IDI0JTtcbiAgfVxuICAuY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3QtZmllbGQtZm91cnRoOmxhc3Qtb2YtdHlwZSB7XG4gICAgbWFyZ2luLXJpZ2h0OiAwO1xuICB9XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciBpbnB1dFt0eXBlPSd0ZXh0J106cmVxdWlyZWQ6dmFsaWQsIC5jdGN0LWZvcm0td3JhcHBlciBpbnB1dFt0eXBlPSdlbWFpbCddOnJlcXVpcmVkOnZhbGlkLCAuY3RjdC1mb3JtLXdyYXBwZXIgaW5wdXRbdHlwZT0ncGFzc3dvcmQnXTpyZXF1aXJlZDp2YWxpZCwgLmN0Y3QtZm9ybS13cmFwcGVyIGlucHV0W3R5cGU9J3RlbCddOnJlcXVpcmVkOnZhbGlkLCAuY3RjdC1mb3JtLXdyYXBwZXIgaW5wdXRbdHlwZT0nbnVtYmVyJ106cmVxdWlyZWQ6dmFsaWQge1xuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCIuLi9pbWFnZXMvY2hlY2tfY2lyY2xlLnN2Z1wiKTtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogOHB4IDUwJTtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgYmFja2dyb3VuZC1zaXplOiAxOHB4O1xuICBib3JkZXItY29sb3I6ICMyZWNjNDA7XG4gIHBhZGRpbmctbGVmdDogMzJweDtcbn1cblxuLmN0Y3QtZm9ybS13cmFwcGVyIGlucHV0W3R5cGU9J3RleHQnXTpyZXF1aXJlZC5jdGN0LWludmFsaWQsIC5jdGN0LWZvcm0td3JhcHBlciBpbnB1dFt0eXBlPSd0ZXh0J10uY3RjdC1pbnZhbGlkLCAuY3RjdC1mb3JtLXdyYXBwZXIgaW5wdXRbdHlwZT0nZW1haWwnXTpyZXF1aXJlZC5jdGN0LWludmFsaWQsIC5jdGN0LWZvcm0td3JhcHBlciBpbnB1dFt0eXBlPSdlbWFpbCddLmN0Y3QtaW52YWxpZCwgLmN0Y3QtZm9ybS13cmFwcGVyIGlucHV0W3R5cGU9J3Bhc3N3b3JkJ106cmVxdWlyZWQuY3RjdC1pbnZhbGlkLCAuY3RjdC1mb3JtLXdyYXBwZXIgaW5wdXRbdHlwZT0ncGFzc3dvcmQnXS5jdGN0LWludmFsaWQsIC5jdGN0LWZvcm0td3JhcHBlciBpbnB1dFt0eXBlPSd0ZWwnXTpyZXF1aXJlZC5jdGN0LWludmFsaWQsIC5jdGN0LWZvcm0td3JhcHBlciBpbnB1dFt0eXBlPSd0ZWwnXS5jdGN0LWludmFsaWQsIC5jdGN0LWZvcm0td3JhcHBlciBpbnB1dFt0eXBlPSdudW1iZXInXTpyZXF1aXJlZC5jdGN0LWludmFsaWQsIC5jdGN0LWZvcm0td3JhcHBlciBpbnB1dFt0eXBlPSdudW1iZXInXS5jdGN0LWludmFsaWQge1xuICBiYWNrZ3JvdW5kOiAjZmZmIHVybChcIi4uL2ltYWdlcy9lcnJvci5zdmdcIikgbm8tcmVwZWF0O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgNjUsIDU0LCAwLjAyKTtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogOHB4IDUwJTtcbiAgYmFja2dyb3VuZC1zaXplOiAyNHB4O1xuICBib3JkZXItY29sb3I6ICNmZjQxMzY7XG4gIHBhZGRpbmctbGVmdDogNDBweDtcbn1cblxuLmN0Y3QtZm9ybS13cmFwcGVyIC5jdGN0LWZpZWxkLWVycm9yIHtcbiAgZm9udC1zaXplOiAwLjg1cmVtO1xuICBmb250LXN0eWxlOiBpdGFsaWM7XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciBpbnB1dC5jdGN0LWludmFsaWQge1xuICBiYWNrZ3JvdW5kOiAjZmZmIHVybChcIi4uL2ltYWdlcy9lcnJvci5zdmdcIikgbm8tcmVwZWF0O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgNjUsIDU0LCAwLjAyKTtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogOHB4IDUwJTtcbiAgYmFja2dyb3VuZC1zaXplOiAyNHB4O1xuICBib3JkZXItY29sb3I6ICNmZjQxMzY7XG4gIHBhZGRpbmctbGVmdDogNDBweDtcbn1cblxuLmN0Y3QtZm9ybS13cmFwcGVyIGlucHV0LmN0Y3QtbGFiZWwtbGVmdCxcbi5jdGN0LWZvcm0td3JhcHBlciB0ZXh0YXJlYS5jdGN0LWxhYmVsLWxlZnQge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHdpZHRoOiA3NSU7XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciBzcGFuLmN0Y3QtbGFiZWwtbGVmdCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWFyZ2luLXJpZ2h0OiA1JTtcbiAgd2lkdGg6IDIwJTtcbn1cblxuLmN0Y3QtZm9ybS13cmFwcGVyIGlucHV0LmN0Y3QtbGFiZWwtcmlnaHQsXG4uY3RjdC1mb3JtLXdyYXBwZXIgdGV4dGFyZWEuY3RjdC1sYWJlbC1yaWdodCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWFyZ2luLXJpZ2h0OiA1JTtcbiAgd2lkdGg6IDc1JTtcbn1cblxuLmN0Y3QtZm9ybS13cmFwcGVyIHNwYW4uY3RjdC1sYWJlbC1yaWdodCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgd2lkdGg6IDIwJTtcbn1cblxuLmN0Y3QtZm9ybS13cmFwcGVyIHNwYW4uY3RjdC1sYWJlbC1oaWRkZW4ge1xuICBsZWZ0OiAtOTk5OXB4ICFpbXBvcnRhbnQ7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50O1xuICB0b3A6IC05OTk5cHggIWltcG9ydGFudDtcbn1cblxuLmN0Y3QtZm9ybS13cmFwcGVyIC5jdGN0X3VzYWdlIHtcbiAgYm9yZGVyOiAwIG5vbmU7XG4gIGNsaXA6IHJlY3QoMCwgMCwgMCwgMCk7XG4gIGhlaWdodDogMXB4O1xuICBtYXJnaW46IC0xcHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHBhZGRpbmc6IDA7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgd2lkdGg6IDFweDtcbn1cblxuLmN0Y3QtZm9ybS13cmFwcGVyIC5uby1yZWNhcHRjaGEgLmN0Y3Qtc3VibWl0dGVkOmRpc2FibGVkIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiLi4vaW1hZ2VzL292YWwubWluLnN2Z1wiKTtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyO1xuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICBjb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGN1cnNvcjogd2FpdDtcbiAgb3BhY2l0eTogMC4zO1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgLmhhcy1yZWNhcHRjaGEgLmN0Y3Qtc3VibWl0dGVkOmRpc2FibGVkIHtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbn1cblxuLmN0Y3QtZm9ybS13cmFwcGVyIC5jdGN0LWZvcm06OmFmdGVyIHtcbiAgY2xlYXI6IGJvdGg7XG4gIGNvbnRlbnQ6ICcnO1xuICBkaXNwbGF5OiB0YWJsZTtcbn1cblxuLmN0Y3QtZm9ybS13cmFwcGVyIC5jdGN0LWZvcm0gLmN0Y3QtbGFiZWwtdG9wIGxhYmVsLFxuLmN0Y3QtZm9ybS13cmFwcGVyIC5jdGN0LWZvcm0gLmN0Y3QtbGFiZWwtYm90dG9tIGxhYmVsIHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciAuY3RjdC1mb3JtIC5jdGN0LWxhYmVsLWxlZnQgbGFiZWwsXG4uY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3QtZm9ybSAuY3RjdC1sYWJlbC1yaWdodCBsYWJlbCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cblxuLmN0Y3QtZm9ybS13cmFwcGVyIC5jdGN0LWZvcm0gYWJiciB7XG4gIGJvcmRlcjogbm9uZTtcbiAgY29sb3I6ICNmZjQxMzY7XG4gIGZvbnQtc2l6ZTogMC45cmVtO1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3QtaW5wdXQtY29udGFpbmVyIGxhYmVsIHtcbiAgY29sb3I6ICNhYWE7XG4gIGZvbnQtc2l6ZTogMC44cmVtO1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3QtZmllbGQtZXJyb3Ige1xuICBjb2xvcjogI2ZmNDEzNjtcbn1cblxuLmN0Y3QtZm9ybS13cmFwcGVyIC5jdGN0LXN1Ym1pdCB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLmN0Y3QtdHdlbnR5Zm91cnRlZW4gLmN0Y3QtZm9ybS1maWVsZCBpbnB1dCB7XG4gIHdpZHRoOiAxMDAlO1xufVxuIl19 */
1
+ .ctct-form-wrapper .ctct-button{font-size:.9rem}.ctct-form-wrapper .ctct-message{border:1px solid;padding:1em}.ctct-form-wrapper .ctct-message.ctct-error{background-color:rgba(255,65,54,.02);border-color:#ff4136;color:#cf0b00}.ctct-form-wrapper .ctct-message.ctct-success{background-color:rgba(46,204,64,.02);border-color:#2ecc40;color:#1b7926}.ctct-form-wrapper .ctct-message .ctct-dismiss-ajax-notice{border-radius:50%;float:right;line-height:1;padding:.85rem 1rem;text-decoration:none}.ctct-form-wrapper .ctct-form-field{margin:0 0 1rem}.ctct-form-wrapper .ctct-field-inline{display:inline-block}.ctct-form-wrapper input[type=email]:required:valid,.ctct-form-wrapper input[type=number]:required:valid,.ctct-form-wrapper input[type=password]:required:valid,.ctct-form-wrapper input[type=tel]:required:valid,.ctct-form-wrapper input[type=text]:required:valid{background-image:url(../images/check_circle.svg);background-position:8px 50%;background-repeat:no-repeat;background-size:18px;border-color:#2ecc40;padding-left:32px}.ctct-form-wrapper input[type=email].ctct-invalid,.ctct-form-wrapper input[type=email]:required.ctct-invalid,.ctct-form-wrapper input[type=number].ctct-invalid,.ctct-form-wrapper input[type=number]:required.ctct-invalid,.ctct-form-wrapper input[type=password].ctct-invalid,.ctct-form-wrapper input[type=password]:required.ctct-invalid,.ctct-form-wrapper input[type=tel].ctct-invalid,.ctct-form-wrapper input[type=tel]:required.ctct-invalid,.ctct-form-wrapper input[type=text].ctct-invalid,.ctct-form-wrapper input[type=text]:required.ctct-invalid{background:#fff url(../images/error.svg) no-repeat;background-color:rgba(255,65,54,.02);background-position:8px 50%;background-size:24px;border-color:#ff4136;padding-left:40px}.ctct-form-wrapper .ctct-field-error{font-size:.85rem;font-style:italic}.ctct-form-wrapper input.ctct-invalid{background:#fff url(../images/error.svg) no-repeat;background-color:rgba(255,65,54,.02);background-position:8px 50%;background-size:24px;border-color:#ff4136;padding-left:40px}.ctct-form-wrapper input.ctct-label-left,.ctct-form-wrapper textarea.ctct-label-left{display:inline-block;width:75%}.ctct-form-wrapper span.ctct-label-left{display:inline-block;margin-right:5%;width:20%}.ctct-form-wrapper input.ctct-label-right,.ctct-form-wrapper textarea.ctct-label-right{display:inline-block;margin-right:5%;width:75%}.ctct-form-wrapper input.ctct-label-right[type=checkbox],.ctct-form-wrapper textarea.ctct-label-right[type=checkbox]{width:auto}.ctct-form-wrapper span.ctct-label-right{display:inline-block;width:20%}.ctct-form-wrapper span.ctct-label-hidden{left:-9999px!important;position:absolute!important;top:-9999px!important}.ctct-form-wrapper .ctct_usage{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ctct-form-wrapper .no-recaptcha .ctct-submitted:disabled{background-image:url(../images/oval.min.svg);background-position:50%;background-repeat:no-repeat;color:transparent;cursor:wait;opacity:.3}.ctct-form-wrapper .has-recaptcha .ctct-submitted:disabled{cursor:not-allowed}.ctct-form-wrapper .ctct-form:after{clear:both;content:"";display:table}.ctct-form-wrapper .ctct-form .ctct-label-bottom label,.ctct-form-wrapper .ctct-form .ctct-label-top label{display:block}.ctct-form-wrapper .ctct-form .ctct-label-left label,.ctct-form-wrapper .ctct-form .ctct-label-right label{display:inline-block}.ctct-form-wrapper .ctct-form abbr{border:none;color:#ff4136;font-size:.9rem}.ctct-form-wrapper .ctct-input-container label{color:#aaa;font-size:.8rem}.ctct-form-wrapper .ctct-field-error{color:#ff4136}.ctct-form-wrapper .ctct-submit{cursor:pointer}.ctct-form-wrapper .ctct-form-field-checkbox fieldset{border:none;padding:0}.ctct-form-wrapper .ctct-form-field-checkbox fieldset legend{font-weight:400;padding:0}.ctct-twentyfourteen .ctct-form-field input{width:100%}@media (min-width:992px){.ctct-form-wrapper .ctct-field-half{float:left;margin-right:2%;width:48%}.ctct-form-wrapper .ctct-field-half:last-of-type{margin-right:0}.ctct-form-wrapper .ctct-field-third{float:left;margin-right:2%;width:32%}.ctct-form-wrapper .ctct-field-third:last-of-type{margin-right:0}.ctct-form-wrapper .ctct-field-fourth{float:left;margin-right:2%;width:24%}.ctct-form-wrapper .ctct-field-fourth:last-of-type{margin-right:0}}
2
+ /*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN0eWxlLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxnQ0FDRSxlQUNGLENBRUEsaUNBQ0UsZ0JBQWlCLENBQ2pCLFdBQ0YsQ0FFQSw0Q0FDRSxvQ0FBeUMsQ0FDekMsb0JBQXFCLENBQ3JCLGFBQ0YsQ0FFQSw4Q0FDRSxvQ0FBeUMsQ0FDekMsb0JBQXFCLENBQ3JCLGFBQ0YsQ0FFQSwyREFDRSxpQkFBa0IsQ0FDbEIsV0FBWSxDQUNaLGFBQWMsQ0FDZCxtQkFBcUIsQ0FDckIsb0JBQ0YsQ0FFQSxvQ0FDRSxlQUNGLENBRUEsc0NBQ0Usb0JBQ0YsQ0FtQ0EscVFBQ0UsZ0RBQW1ELENBQ25ELDJCQUE0QixDQUM1QiwyQkFBNEIsQ0FDNUIsb0JBQXFCLENBQ3JCLG9CQUFxQixDQUNyQixpQkFDRixDQUVBLG1pQkFDRSxrREFBcUQsQ0FDckQsb0NBQXlDLENBQ3pDLDJCQUE0QixDQUM1QixvQkFBcUIsQ0FDckIsb0JBQXFCLENBQ3JCLGlCQUNGLENBRUEscUNBQ0UsZ0JBQWtCLENBQ2xCLGlCQUNGLENBRUEsc0NBQ0Usa0RBQXFELENBQ3JELG9DQUF5QyxDQUN6QywyQkFBNEIsQ0FDNUIsb0JBQXFCLENBQ3JCLG9CQUFxQixDQUNyQixpQkFDRixDQUVBLHFGQUVFLG9CQUFxQixDQUNyQixTQUNGLENBRUEsd0NBQ0Usb0JBQXFCLENBQ3JCLGVBQWdCLENBQ2hCLFNBQ0YsQ0FFQSx1RkFFRSxvQkFBcUIsQ0FDckIsZUFBZ0IsQ0FDaEIsU0FDRixDQUVBLHFIQUVFLFVBQ0YsQ0FFQSx5Q0FDRSxvQkFBcUIsQ0FDckIsU0FDRixDQUVBLDBDQUNFLHNCQUF3QixDQUN4QiwyQkFBNkIsQ0FDN0IscUJBQ0YsQ0FFQSwrQkFDRSxRQUFjLENBQ2Qsa0JBQXNCLENBQ3RCLFVBQVcsQ0FDWCxXQUFZLENBQ1osZUFBZ0IsQ0FDaEIsU0FBVSxDQUNWLGlCQUFrQixDQUNsQixTQUNGLENBRUEsMERBQ0UsNENBQStDLENBQy9DLHVCQUEyQixDQUMzQiwyQkFBNEIsQ0FDNUIsaUJBQWtCLENBQ2xCLFdBQVksQ0FDWixVQUNGLENBRUEsMkRBQ0Usa0JBQ0YsQ0FFQSxvQ0FDRSxVQUFXLENBQ1gsVUFBVyxDQUNYLGFBQ0YsQ0FFQSwyR0FFRSxhQUNGLENBRUEsMkdBRUUsb0JBQ0YsQ0FFQSxtQ0FDRSxXQUFZLENBQ1osYUFBYyxDQUNkLGVBQ0YsQ0FFQSwrQ0FDRSxVQUFXLENBQ1gsZUFDRixDQUVBLHFDQUNFLGFBQ0YsQ0FFQSxnQ0FDRSxjQUNGLENBRUEsc0RBQ0UsV0FBWSxDQUNaLFNBQ0YsQ0FFQSw2REFDRSxlQUFtQixDQUNuQixTQUNGLENBRUEsNENBQ0UsVUFDRixDQTNLQSx5QkFDRSxvQ0FDRSxVQUFXLENBQ1gsZUFBZ0IsQ0FDaEIsU0FDRixDQUNBLGlEQUNFLGNBQ0YsQ0FJQSxxQ0FDRSxVQUFXLENBQ1gsZUFBZ0IsQ0FDaEIsU0FDRixDQUNBLGtEQUNFLGNBQ0YsQ0FJQSxzQ0FDRSxVQUFXLENBQ1gsZUFBZ0IsQ0FDaEIsU0FDRixDQUNBLG1EQUNFLGNBQ0YsQ0FyQkYiLCJmaWxlIjoic3R5bGUubWluLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi5jdGN0LWZvcm0td3JhcHBlciAuY3RjdC1idXR0b24ge1xuICBmb250LXNpemU6IDAuOXJlbTtcbn1cblxuLmN0Y3QtZm9ybS13cmFwcGVyIC5jdGN0LW1lc3NhZ2Uge1xuICBib3JkZXI6IDFweCBzb2xpZDtcbiAgcGFkZGluZzogMWVtO1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3QtbWVzc2FnZS5jdGN0LWVycm9yIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDY1LCA1NCwgMC4wMik7XG4gIGJvcmRlci1jb2xvcjogI2ZmNDEzNjtcbiAgY29sb3I6ICNjZjBiMDA7XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciAuY3RjdC1tZXNzYWdlLmN0Y3Qtc3VjY2VzcyB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNDYsIDIwNCwgNjQsIDAuMDIpO1xuICBib3JkZXItY29sb3I6ICMyZWNjNDA7XG4gIGNvbG9yOiAjMWI3OTI2O1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3QtbWVzc2FnZSAuY3RjdC1kaXNtaXNzLWFqYXgtbm90aWNlIHtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBmbG9hdDogcmlnaHQ7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBwYWRkaW5nOiAwLjg1cmVtIDFyZW07XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cblxuLmN0Y3QtZm9ybS13cmFwcGVyIC5jdGN0LWZvcm0tZmllbGQge1xuICBtYXJnaW46IDAgMCAxcmVtO1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3QtZmllbGQtaW5saW5lIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogOTkycHgpIHtcbiAgLmN0Y3QtZm9ybS13cmFwcGVyIC5jdGN0LWZpZWxkLWhhbGYge1xuICAgIGZsb2F0OiBsZWZ0O1xuICAgIG1hcmdpbi1yaWdodDogMiU7XG4gICAgd2lkdGg6IDQ4JTtcbiAgfVxuICAuY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3QtZmllbGQtaGFsZjpsYXN0LW9mLXR5cGUge1xuICAgIG1hcmdpbi1yaWdodDogMDtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogOTkycHgpIHtcbiAgLmN0Y3QtZm9ybS13cmFwcGVyIC5jdGN0LWZpZWxkLXRoaXJkIHtcbiAgICBmbG9hdDogbGVmdDtcbiAgICBtYXJnaW4tcmlnaHQ6IDIlO1xuICAgIHdpZHRoOiAzMiU7XG4gIH1cbiAgLmN0Y3QtZm9ybS13cmFwcGVyIC5jdGN0LWZpZWxkLXRoaXJkOmxhc3Qtb2YtdHlwZSB7XG4gICAgbWFyZ2luLXJpZ2h0OiAwO1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkge1xuICAuY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3QtZmllbGQtZm91cnRoIHtcbiAgICBmbG9hdDogbGVmdDtcbiAgICBtYXJnaW4tcmlnaHQ6IDIlO1xuICAgIHdpZHRoOiAyNCU7XG4gIH1cbiAgLmN0Y3QtZm9ybS13cmFwcGVyIC5jdGN0LWZpZWxkLWZvdXJ0aDpsYXN0LW9mLXR5cGUge1xuICAgIG1hcmdpbi1yaWdodDogMDtcbiAgfVxufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgaW5wdXRbdHlwZT0ndGV4dCddOnJlcXVpcmVkOnZhbGlkLCAuY3RjdC1mb3JtLXdyYXBwZXIgaW5wdXRbdHlwZT0nZW1haWwnXTpyZXF1aXJlZDp2YWxpZCwgLmN0Y3QtZm9ybS13cmFwcGVyIGlucHV0W3R5cGU9J3Bhc3N3b3JkJ106cmVxdWlyZWQ6dmFsaWQsIC5jdGN0LWZvcm0td3JhcHBlciBpbnB1dFt0eXBlPSd0ZWwnXTpyZXF1aXJlZDp2YWxpZCwgLmN0Y3QtZm9ybS13cmFwcGVyIGlucHV0W3R5cGU9J251bWJlciddOnJlcXVpcmVkOnZhbGlkIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiLi4vaW1hZ2VzL2NoZWNrX2NpcmNsZS5zdmdcIik7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IDhweCA1MCU7XG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gIGJhY2tncm91bmQtc2l6ZTogMThweDtcbiAgYm9yZGVyLWNvbG9yOiAjMmVjYzQwO1xuICBwYWRkaW5nLWxlZnQ6IDMycHg7XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciBpbnB1dFt0eXBlPSd0ZXh0J106cmVxdWlyZWQuY3RjdC1pbnZhbGlkLCAuY3RjdC1mb3JtLXdyYXBwZXIgaW5wdXRbdHlwZT0ndGV4dCddLmN0Y3QtaW52YWxpZCwgLmN0Y3QtZm9ybS13cmFwcGVyIGlucHV0W3R5cGU9J2VtYWlsJ106cmVxdWlyZWQuY3RjdC1pbnZhbGlkLCAuY3RjdC1mb3JtLXdyYXBwZXIgaW5wdXRbdHlwZT0nZW1haWwnXS5jdGN0LWludmFsaWQsIC5jdGN0LWZvcm0td3JhcHBlciBpbnB1dFt0eXBlPSdwYXNzd29yZCddOnJlcXVpcmVkLmN0Y3QtaW52YWxpZCwgLmN0Y3QtZm9ybS13cmFwcGVyIGlucHV0W3R5cGU9J3Bhc3N3b3JkJ10uY3RjdC1pbnZhbGlkLCAuY3RjdC1mb3JtLXdyYXBwZXIgaW5wdXRbdHlwZT0ndGVsJ106cmVxdWlyZWQuY3RjdC1pbnZhbGlkLCAuY3RjdC1mb3JtLXdyYXBwZXIgaW5wdXRbdHlwZT0ndGVsJ10uY3RjdC1pbnZhbGlkLCAuY3RjdC1mb3JtLXdyYXBwZXIgaW5wdXRbdHlwZT0nbnVtYmVyJ106cmVxdWlyZWQuY3RjdC1pbnZhbGlkLCAuY3RjdC1mb3JtLXdyYXBwZXIgaW5wdXRbdHlwZT0nbnVtYmVyJ10uY3RjdC1pbnZhbGlkIHtcbiAgYmFja2dyb3VuZDogI2ZmZiB1cmwoXCIuLi9pbWFnZXMvZXJyb3Iuc3ZnXCIpIG5vLXJlcGVhdDtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDY1LCA1NCwgMC4wMik7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IDhweCA1MCU7XG4gIGJhY2tncm91bmQtc2l6ZTogMjRweDtcbiAgYm9yZGVyLWNvbG9yOiAjZmY0MTM2O1xuICBwYWRkaW5nLWxlZnQ6IDQwcHg7XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciAuY3RjdC1maWVsZC1lcnJvciB7XG4gIGZvbnQtc2l6ZTogMC44NXJlbTtcbiAgZm9udC1zdHlsZTogaXRhbGljO1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgaW5wdXQuY3RjdC1pbnZhbGlkIHtcbiAgYmFja2dyb3VuZDogI2ZmZiB1cmwoXCIuLi9pbWFnZXMvZXJyb3Iuc3ZnXCIpIG5vLXJlcGVhdDtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDY1LCA1NCwgMC4wMik7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IDhweCA1MCU7XG4gIGJhY2tncm91bmQtc2l6ZTogMjRweDtcbiAgYm9yZGVyLWNvbG9yOiAjZmY0MTM2O1xuICBwYWRkaW5nLWxlZnQ6IDQwcHg7XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciBpbnB1dC5jdGN0LWxhYmVsLWxlZnQsXG4uY3RjdC1mb3JtLXdyYXBwZXIgdGV4dGFyZWEuY3RjdC1sYWJlbC1sZWZ0IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB3aWR0aDogNzUlO1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgc3Bhbi5jdGN0LWxhYmVsLWxlZnQge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1hcmdpbi1yaWdodDogNSU7XG4gIHdpZHRoOiAyMCU7XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciBpbnB1dC5jdGN0LWxhYmVsLXJpZ2h0LFxuLmN0Y3QtZm9ybS13cmFwcGVyIHRleHRhcmVhLmN0Y3QtbGFiZWwtcmlnaHQge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1hcmdpbi1yaWdodDogNSU7XG4gIHdpZHRoOiA3NSU7XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciBpbnB1dC5jdGN0LWxhYmVsLXJpZ2h0W3R5cGU9XCJjaGVja2JveFwiXSxcbi5jdGN0LWZvcm0td3JhcHBlciB0ZXh0YXJlYS5jdGN0LWxhYmVsLXJpZ2h0W3R5cGU9XCJjaGVja2JveFwiXSB7XG4gIHdpZHRoOiBhdXRvO1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgc3Bhbi5jdGN0LWxhYmVsLXJpZ2h0IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB3aWR0aDogMjAlO1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgc3Bhbi5jdGN0LWxhYmVsLWhpZGRlbiB7XG4gIGxlZnQ6IC05OTk5cHggIWltcG9ydGFudDtcbiAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7XG4gIHRvcDogLTk5OTlweCAhaW1wb3J0YW50O1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3RfdXNhZ2Uge1xuICBib3JkZXI6IDAgbm9uZTtcbiAgY2xpcDogcmVjdCgwLCAwLCAwLCAwKTtcbiAgaGVpZ2h0OiAxcHg7XG4gIG1hcmdpbjogLTFweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgcGFkZGluZzogMDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB3aWR0aDogMXB4O1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgLm5vLXJlY2FwdGNoYSAuY3RjdC1zdWJtaXR0ZWQ6ZGlzYWJsZWQge1xuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCIuLi9pbWFnZXMvb3ZhbC5taW4uc3ZnXCIpO1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7XG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gIGNvbG9yOiB0cmFuc3BhcmVudDtcbiAgY3Vyc29yOiB3YWl0O1xuICBvcGFjaXR5OiAwLjM7XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciAuaGFzLXJlY2FwdGNoYSAuY3RjdC1zdWJtaXR0ZWQ6ZGlzYWJsZWQge1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3QtZm9ybTo6YWZ0ZXIge1xuICBjbGVhcjogYm90aDtcbiAgY29udGVudDogJyc7XG4gIGRpc3BsYXk6IHRhYmxlO1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3QtZm9ybSAuY3RjdC1sYWJlbC10b3AgbGFiZWwsXG4uY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3QtZm9ybSAuY3RjdC1sYWJlbC1ib3R0b20gbGFiZWwge1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuLmN0Y3QtZm9ybS13cmFwcGVyIC5jdGN0LWZvcm0gLmN0Y3QtbGFiZWwtbGVmdCBsYWJlbCxcbi5jdGN0LWZvcm0td3JhcHBlciAuY3RjdC1mb3JtIC5jdGN0LWxhYmVsLXJpZ2h0IGxhYmVsIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3QtZm9ybSBhYmJyIHtcbiAgYm9yZGVyOiBub25lO1xuICBjb2xvcjogI2ZmNDEzNjtcbiAgZm9udC1zaXplOiAwLjlyZW07XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciAuY3RjdC1pbnB1dC1jb250YWluZXIgbGFiZWwge1xuICBjb2xvcjogI2FhYTtcbiAgZm9udC1zaXplOiAwLjhyZW07XG59XG5cbi5jdGN0LWZvcm0td3JhcHBlciAuY3RjdC1maWVsZC1lcnJvciB7XG4gIGNvbG9yOiAjZmY0MTM2O1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3Qtc3VibWl0IHtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uY3RjdC1mb3JtLXdyYXBwZXIgLmN0Y3QtZm9ybS1maWVsZC1jaGVja2JveCBmaWVsZHNldCB7XG4gIGJvcmRlcjogbm9uZTtcbiAgcGFkZGluZzogMDtcbn1cblxuLmN0Y3QtZm9ybS13cmFwcGVyIC5jdGN0LWZvcm0tZmllbGQtY2hlY2tib3ggZmllbGRzZXQgbGVnZW5kIHtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgcGFkZGluZzogMDtcbn1cblxuLmN0Y3QtdHdlbnR5Zm91cnRlZW4gLmN0Y3QtZm9ybS1maWVsZCBpbnB1dCB7XG4gIHdpZHRoOiAxMDAlO1xufVxuIl19 */
assets/images/check_circle.svg CHANGED
File without changes
assets/images/error.svg CHANGED
File without changes
assets/js/ctct-plugin-admin.js CHANGED
@@ -160,7 +160,7 @@ eval("window.CTCTNewsletter = {};\n\n(function (window, $, app) {\n /**\n * @
160
  /*! no static exports found */
161
  /***/ (function(module, exports) {
162
 
163
- eval("window.CTCT_OptIns = {};\n\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 * Cache DOM elements.\n *\n * @author Constant Contact\n * @since 1.0.0\n */\n\n\n app.cache = function () {\n app.$c = {\n optinNoConn: $('#cmb2-metabox-ctct_1_optin_metabox #_ctct_opt_in_not_connected'),\n list: $('#cmb2-metabox-ctct_0_list_metabox #_ctct_list'),\n title: $('#cmb2-metabox-ctct_1_optin_metabox .cmb2-id-email-optin-title'),\n optin: $('#cmb2-metabox-ctct_1_optin_metabox .cmb2-id--ctct-opt-in'),\n instruct: $('#cmb2-metabox-ctct_1_optin_metabox .cmb2-id--ctct-opt-in-instructions')\n };\n };\n /**\n * Attach callbacks to events.\n *\n * @author Constant Contact\n * @since 1.0.0\n */\n\n\n app.bindEvents = function () {\n // Only fire show/hide if we have the normal checkbox.\n if (app.$c.optinNoConn.length) {\n // Fire once to get our loaded state set up.\n app.toggleNoConnectionFields(); // Bind to fire when needed.\n\n app.$c.optinNoConn.change(function () {\n app.toggleNoConnectionFields();\n });\n } // Only fire show/hide if we have the normal checkbox.\n\n\n if (app.$c.list.length) {\n // Fire once to get our loaded state set up.\n app.toggleConnectionFields(); // Bind to fire when needed.\n\n app.$c.list.change(function () {\n app.toggleConnectionFields();\n });\n }\n };\n /**\n * Toggle unnecessary, unconnected optin fields if we're not showing the opt-in.\n *\n * @author Constant Contact\n * @since 1.0.0\n */\n\n\n app.toggleNoConnectionFields = function () {\n if (app.$c.optinNoConn.prop('checked')) {\n app.$c.instruct.slideDown();\n } else {\n app.$c.instruct.slideUp();\n }\n };\n /**\n * Toggle unnecessary, *connected* optin fields if we're not showing the opt-in.\n *\n * @author Constant Contact\n * @since 1.0.0\n */\n\n\n app.toggleConnectionFields = function () {\n // If checked, show them, else hide it.\n if ('' !== app.$c.list.val()) {\n app.$c.title.slideDown();\n app.$c.optin.slideDown();\n app.$c.instruct.slideDown();\n } else {\n app.$c.title.slideUp();\n app.$c.optin.slideUp();\n app.$c.instruct.slideUp();\n }\n };\n\n $(app.init);\n})(window, jQuery, window.CTCT_OptIns);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9hc3NldHMvanMvY3RjdC1wbHVnaW4tYWRtaW4vb3B0aW5zLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYXNzZXRzL2pzL2N0Y3QtcGx1Z2luLWFkbWluL29wdGlucy5qcz9jNGM5Il0sInNvdXJjZXNDb250ZW50IjpbIndpbmRvdy5DVENUX09wdElucyA9IHt9O1xuXG4oIGZ1bmN0aW9uKCB3aW5kb3csICQsIGFwcCApIHtcblxuXHQvKipcblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqXG5cdCAqIEBhdXRob3IgQ29uc3RhbnQgQ29udGFjdFxuXHQgKiBAc2luY2UgMS4wLjBcblx0ICovXG5cdGFwcC5pbml0ID0gKCkgPT4ge1xuXHRcdGFwcC5jYWNoZSgpO1xuXHRcdGFwcC5iaW5kRXZlbnRzKCk7XG5cdH07XG5cblx0LyoqXG5cdCAqIENhY2hlIERPTSBlbGVtZW50cy5cblx0ICpcblx0ICogQGF1dGhvciBDb25zdGFudCBDb250YWN0XG5cdCAqIEBzaW5jZSAxLjAuMFxuXHQgKi9cblx0YXBwLmNhY2hlID0gKCkgPT4ge1xuXHRcdGFwcC4kYyA9IHtcblx0XHRcdG9wdGluTm9Db25uOiAkKCAnI2NtYjItbWV0YWJveC1jdGN0XzFfb3B0aW5fbWV0YWJveCAjX2N0Y3Rfb3B0X2luX25vdF9jb25uZWN0ZWQnICksXG5cdFx0XHRsaXN0OiAkKCAnI2NtYjItbWV0YWJveC1jdGN0XzBfbGlzdF9tZXRhYm94ICNfY3RjdF9saXN0JyApLFxuXHRcdFx0dGl0bGU6ICQoICcjY21iMi1tZXRhYm94LWN0Y3RfMV9vcHRpbl9tZXRhYm94IC5jbWIyLWlkLWVtYWlsLW9wdGluLXRpdGxlJyApLFxuXHRcdFx0b3B0aW46ICQoICcjY21iMi1tZXRhYm94LWN0Y3RfMV9vcHRpbl9tZXRhYm94IC5jbWIyLWlkLS1jdGN0LW9wdC1pbicgKSxcblx0XHRcdGluc3RydWN0OiAkKCAnI2NtYjItbWV0YWJveC1jdGN0XzFfb3B0aW5fbWV0YWJveCAuY21iMi1pZC0tY3RjdC1vcHQtaW4taW5zdHJ1Y3Rpb25zJyApXG5cdFx0fTtcblx0fTtcblxuXHQvKipcblx0ICogQXR0YWNoIGNhbGxiYWNrcyB0byBldmVudHMuXG5cdCAqXG5cdCAqIEBhdXRob3IgQ29uc3RhbnQgQ29udGFjdFxuXHQgKiBAc2luY2UgMS4wLjBcblx0ICovXG5cdGFwcC5iaW5kRXZlbnRzID0gKCkgPT4ge1xuXG5cdFx0Ly8gT25seSBmaXJlIHNob3cvaGlkZSBpZiB3ZSBoYXZlIHRoZSBub3JtYWwgY2hlY2tib3guXG5cdFx0aWYgKCBhcHAuJGMub3B0aW5Ob0Nvbm4ubGVuZ3RoICkge1xuXG5cdFx0XHQvLyBGaXJlIG9uY2UgdG8gZ2V0IG91ciBsb2FkZWQgc3RhdGUgc2V0IHVwLlxuXHRcdFx0YXBwLnRvZ2dsZU5vQ29ubmVjdGlvbkZpZWxkcygpO1xuXG5cdFx0XHQvLyBCaW5kIHRvIGZpcmUgd2hlbiBuZWVkZWQuXG5cdFx0XHRhcHAuJGMub3B0aW5Ob0Nvbm4uY2hhbmdlKCAoKSA9PiB7XG5cdFx0XHRcdGFwcC50b2dnbGVOb0Nvbm5lY3Rpb25GaWVsZHMoKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHQvLyBPbmx5IGZpcmUgc2hvdy9oaWRlIGlmIHdlIGhhdmUgdGhlIG5vcm1hbCBjaGVja2JveC5cblx0XHRpZiAoIGFwcC4kYy5saXN0Lmxlbmd0aCApIHtcblxuXHRcdFx0Ly8gRmlyZSBvbmNlIHRvIGdldCBvdXIgbG9hZGVkIHN0YXRlIHNldCB1cC5cblx0XHRcdGFwcC50b2dnbGVDb25uZWN0aW9uRmllbGRzKCk7XG5cblx0XHRcdC8vIEJpbmQgdG8gZmlyZSB3aGVuIG5lZWRlZC5cblx0XHRcdGFwcC4kYy5saXN0LmNoYW5nZSggKCkgPT4ge1xuXHRcdFx0XHRhcHAudG9nZ2xlQ29ubmVjdGlvbkZpZWxkcygpO1xuXHRcdFx0fSApO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogVG9nZ2xlIHVubmVjZXNzYXJ5LCB1bmNvbm5lY3RlZCBvcHRpbiBmaWVsZHMgaWYgd2UncmUgbm90IHNob3dpbmcgdGhlIG9wdC1pbi5cblx0ICpcblx0ICogQGF1dGhvciBDb25zdGFudCBDb250YWN0XG5cdCAqIEBzaW5jZSAxLjAuMFxuXHQgKi9cblx0YXBwLnRvZ2dsZU5vQ29ubmVjdGlvbkZpZWxkcyA9ICgpID0+IHtcblxuXHRcdGlmICggYXBwLiRjLm9wdGluTm9Db25uLnByb3AoICdjaGVja2VkJyApICkge1xuXHRcdFx0YXBwLiRjLmluc3RydWN0LnNsaWRlRG93bigpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhcHAuJGMuaW5zdHJ1Y3Quc2xpZGVVcCgpO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogIFRvZ2dsZSB1bm5lY2Vzc2FyeSwgKmNvbm5lY3RlZCogb3B0aW4gZmllbGRzIGlmIHdlJ3JlIG5vdCBzaG93aW5nIHRoZSBvcHQtaW4uXG5cdCAqXG5cdCAqIEBhdXRob3IgQ29uc3RhbnQgQ29udGFjdFxuXHQgKiBAc2luY2UgMS4wLjBcblx0ICovXG5cdGFwcC50b2dnbGVDb25uZWN0aW9uRmllbGRzID0gKCkgPT4ge1xuXG5cdFx0Ly8gSWYgY2hlY2tlZCwgc2hvdyB0aGVtLCBlbHNlIGhpZGUgaXQuXG5cdFx0aWYgKCAnJyAhPT0gYXBwLiRjLmxpc3QudmFsKCkgKSB7XG5cdFx0XHRhcHAuJGMudGl0bGUuc2xpZGVEb3duKCk7XG5cdFx0XHRhcHAuJGMub3B0aW4uc2xpZGVEb3duKCk7XG5cdFx0XHRhcHAuJGMuaW5zdHJ1Y3Quc2xpZGVEb3duKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFwcC4kYy50aXRsZS5zbGlkZVVwKCk7XG5cdFx0XHRhcHAuJGMub3B0aW4uc2xpZGVVcCgpO1xuXHRcdFx0YXBwLiRjLmluc3RydWN0LnNsaWRlVXAoKTtcblx0XHR9XG5cdH07XG5cblx0JCggYXBwLmluaXQgKTtcblxufSAoIHdpbmRvdywgalF1ZXJ5LCB3aW5kb3cuQ1RDVF9PcHRJbnMgKSApO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBT0E7QUFFQTs7Ozs7Ozs7QUFNQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFNQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQU1BO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./assets/js/ctct-plugin-admin/optins.js\n");
164
 
165
  /***/ }),
166
 
160
  /*! no static exports found */
161
  /***/ (function(module, exports) {
162
 
163
+ eval("window.CTCT_OptIns = {};\n\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 * Cache DOM elements.\n *\n * @author Constant Contact\n * @since 1.0.0\n */\n\n\n app.cache = function () {\n app.$c = {\n optinNoConn: $('#cmb2-metabox-ctct_1_optin_metabox #_ctct_opt_in_not_connected'),\n list: $('#cmb2-metabox-ctct_0_list_metabox [name=\"_ctct_list[]\"]'),\n title: $('#cmb2-metabox-ctct_1_optin_metabox .cmb2-id-email-optin-title'),\n optin: $('#cmb2-metabox-ctct_1_optin_metabox .cmb2-id--ctct-opt-in'),\n instruct: $('#cmb2-metabox-ctct_1_optin_metabox .cmb2-id--ctct-opt-in-instructions')\n };\n };\n /**\n * Attach callbacks to events.\n *\n * @author Constant Contact\n * @since 1.0.0\n */\n\n\n app.bindEvents = function () {\n // Only fire show/hide if we have the normal checkbox.\n if (app.$c.optinNoConn.length) {\n // Fire once to get our loaded state set up.\n app.toggleNoConnectionFields(); // Bind to fire when needed.\n\n app.$c.optinNoConn.change(function () {\n app.toggleNoConnectionFields();\n });\n } // Only fire show/hide if we have the normal checkbox.\n\n\n if (app.$c.list.length) {\n // Fire once to get our loaded state set up.\n app.toggleConnectionFields(); // Bind to fire when needed.\n\n app.$c.list.change(function () {\n app.toggleConnectionFields();\n });\n }\n };\n /**\n * Toggle unnecessary, unconnected optin fields if we're not showing the opt-in.\n *\n * @author Constant Contact\n * @since 1.0.0\n */\n\n\n app.toggleNoConnectionFields = function () {\n if (app.$c.optinNoConn.prop('checked')) {\n app.$c.instruct.slideDown();\n } else {\n app.$c.instruct.slideUp();\n }\n };\n /**\n * Toggle unnecessary, *connected* optin fields if we're not showing the opt-in.\n *\n * @author Constant Contact\n * @since 1.0.0\n */\n\n\n app.toggleConnectionFields = function () {\n // If checked, show them, else hide it.\n if ('' !== app.$c.list.val()) {\n app.$c.title.slideDown();\n app.$c.optin.slideDown();\n app.$c.instruct.slideDown();\n } else {\n app.$c.title.slideUp();\n app.$c.optin.slideUp();\n app.$c.instruct.slideUp();\n }\n };\n\n $(app.init);\n})(window, jQuery, window.CTCT_OptIns);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9hc3NldHMvanMvY3RjdC1wbHVnaW4tYWRtaW4vb3B0aW5zLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYXNzZXRzL2pzL2N0Y3QtcGx1Z2luLWFkbWluL29wdGlucy5qcz9jNGM5Il0sInNvdXJjZXNDb250ZW50IjpbIndpbmRvdy5DVENUX09wdElucyA9IHt9O1xuXG4oIGZ1bmN0aW9uKCB3aW5kb3csICQsIGFwcCApIHtcblxuXHQvKipcblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqXG5cdCAqIEBhdXRob3IgQ29uc3RhbnQgQ29udGFjdFxuXHQgKiBAc2luY2UgMS4wLjBcblx0ICovXG5cdGFwcC5pbml0ID0gKCkgPT4ge1xuXHRcdGFwcC5jYWNoZSgpO1xuXHRcdGFwcC5iaW5kRXZlbnRzKCk7XG5cdH07XG5cblx0LyoqXG5cdCAqIENhY2hlIERPTSBlbGVtZW50cy5cblx0ICpcblx0ICogQGF1dGhvciBDb25zdGFudCBDb250YWN0XG5cdCAqIEBzaW5jZSAxLjAuMFxuXHQgKi9cblx0YXBwLmNhY2hlID0gKCkgPT4ge1xuXHRcdGFwcC4kYyA9IHtcblx0XHRcdG9wdGluTm9Db25uOiAkKCAnI2NtYjItbWV0YWJveC1jdGN0XzFfb3B0aW5fbWV0YWJveCAjX2N0Y3Rfb3B0X2luX25vdF9jb25uZWN0ZWQnICksXG5cdFx0XHRsaXN0OiAkKCAnI2NtYjItbWV0YWJveC1jdGN0XzBfbGlzdF9tZXRhYm94IFtuYW1lPVwiX2N0Y3RfbGlzdFtdXCJdJyApLFxuXHRcdFx0dGl0bGU6ICQoICcjY21iMi1tZXRhYm94LWN0Y3RfMV9vcHRpbl9tZXRhYm94IC5jbWIyLWlkLWVtYWlsLW9wdGluLXRpdGxlJyApLFxuXHRcdFx0b3B0aW46ICQoICcjY21iMi1tZXRhYm94LWN0Y3RfMV9vcHRpbl9tZXRhYm94IC5jbWIyLWlkLS1jdGN0LW9wdC1pbicgKSxcblx0XHRcdGluc3RydWN0OiAkKCAnI2NtYjItbWV0YWJveC1jdGN0XzFfb3B0aW5fbWV0YWJveCAuY21iMi1pZC0tY3RjdC1vcHQtaW4taW5zdHJ1Y3Rpb25zJyApXG5cdFx0fTtcblx0fTtcblxuXHQvKipcblx0ICogQXR0YWNoIGNhbGxiYWNrcyB0byBldmVudHMuXG5cdCAqXG5cdCAqIEBhdXRob3IgQ29uc3RhbnQgQ29udGFjdFxuXHQgKiBAc2luY2UgMS4wLjBcblx0ICovXG5cdGFwcC5iaW5kRXZlbnRzID0gKCkgPT4ge1xuXG5cdFx0Ly8gT25seSBmaXJlIHNob3cvaGlkZSBpZiB3ZSBoYXZlIHRoZSBub3JtYWwgY2hlY2tib3guXG5cdFx0aWYgKCBhcHAuJGMub3B0aW5Ob0Nvbm4ubGVuZ3RoICkge1xuXG5cdFx0XHQvLyBGaXJlIG9uY2UgdG8gZ2V0IG91ciBsb2FkZWQgc3RhdGUgc2V0IHVwLlxuXHRcdFx0YXBwLnRvZ2dsZU5vQ29ubmVjdGlvbkZpZWxkcygpO1xuXG5cdFx0XHQvLyBCaW5kIHRvIGZpcmUgd2hlbiBuZWVkZWQuXG5cdFx0XHRhcHAuJGMub3B0aW5Ob0Nvbm4uY2hhbmdlKCAoKSA9PiB7XG5cdFx0XHRcdGFwcC50b2dnbGVOb0Nvbm5lY3Rpb25GaWVsZHMoKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHQvLyBPbmx5IGZpcmUgc2hvdy9oaWRlIGlmIHdlIGhhdmUgdGhlIG5vcm1hbCBjaGVja2JveC5cblx0XHRpZiAoIGFwcC4kYy5saXN0Lmxlbmd0aCApIHtcblxuXHRcdFx0Ly8gRmlyZSBvbmNlIHRvIGdldCBvdXIgbG9hZGVkIHN0YXRlIHNldCB1cC5cblx0XHRcdGFwcC50b2dnbGVDb25uZWN0aW9uRmllbGRzKCk7XG5cblx0XHRcdC8vIEJpbmQgdG8gZmlyZSB3aGVuIG5lZWRlZC5cblx0XHRcdGFwcC4kYy5saXN0LmNoYW5nZSggKCkgPT4ge1xuXHRcdFx0XHRhcHAudG9nZ2xlQ29ubmVjdGlvbkZpZWxkcygpO1xuXHRcdFx0fSApO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogVG9nZ2xlIHVubmVjZXNzYXJ5LCB1bmNvbm5lY3RlZCBvcHRpbiBmaWVsZHMgaWYgd2UncmUgbm90IHNob3dpbmcgdGhlIG9wdC1pbi5cblx0ICpcblx0ICogQGF1dGhvciBDb25zdGFudCBDb250YWN0XG5cdCAqIEBzaW5jZSAxLjAuMFxuXHQgKi9cblx0YXBwLnRvZ2dsZU5vQ29ubmVjdGlvbkZpZWxkcyA9ICgpID0+IHtcblxuXHRcdGlmICggYXBwLiRjLm9wdGluTm9Db25uLnByb3AoICdjaGVja2VkJyApICkge1xuXHRcdFx0YXBwLiRjLmluc3RydWN0LnNsaWRlRG93bigpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhcHAuJGMuaW5zdHJ1Y3Quc2xpZGVVcCgpO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogIFRvZ2dsZSB1bm5lY2Vzc2FyeSwgKmNvbm5lY3RlZCogb3B0aW4gZmllbGRzIGlmIHdlJ3JlIG5vdCBzaG93aW5nIHRoZSBvcHQtaW4uXG5cdCAqXG5cdCAqIEBhdXRob3IgQ29uc3RhbnQgQ29udGFjdFxuXHQgKiBAc2luY2UgMS4wLjBcblx0ICovXG5cdGFwcC50b2dnbGVDb25uZWN0aW9uRmllbGRzID0gKCkgPT4ge1xuXG5cdFx0Ly8gSWYgY2hlY2tlZCwgc2hvdyB0aGVtLCBlbHNlIGhpZGUgaXQuXG5cdFx0aWYgKCAnJyAhPT0gYXBwLiRjLmxpc3QudmFsKCkgKSB7XG5cdFx0XHRhcHAuJGMudGl0bGUuc2xpZGVEb3duKCk7XG5cdFx0XHRhcHAuJGMub3B0aW4uc2xpZGVEb3duKCk7XG5cdFx0XHRhcHAuJGMuaW5zdHJ1Y3Quc2xpZGVEb3duKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFwcC4kYy50aXRsZS5zbGlkZVVwKCk7XG5cdFx0XHRhcHAuJGMub3B0aW4uc2xpZGVVcCgpO1xuXHRcdFx0YXBwLiRjLmluc3RydWN0LnNsaWRlVXAoKTtcblx0XHR9XG5cdH07XG5cblx0JCggYXBwLmluaXQgKTtcblxufSAoIHdpbmRvdywgalF1ZXJ5LCB3aW5kb3cuQ1RDVF9PcHRJbnMgKSApO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBT0E7QUFFQTs7Ozs7Ozs7QUFNQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFNQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQU1BO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./assets/js/ctct-plugin-admin/optins.js\n");
164
 
165
  /***/ }),
166
 
assets/js/ctct-plugin-admin.min.js CHANGED
@@ -1,2 +1,2 @@
1
- !function(t){var e={};function n(c){if(e[c])return e[c].exports;var o=e[c]={i:c,l:!1,exports:{}};return t[c].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=t,n.c=e,n.d=function(t,e,c){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:c})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var c=Object.create(null);if(n.r(c),Object.defineProperty(c,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(c,o,function(e){return t[e]}.bind(null,o));return c},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="https://testing.test/wp-content/plugins/constant-contact-forms/assets/js/",n(n.s=0)}([function(t,e,n){t.exports=n(1)},function(t,e,n){"use strict";n.r(e);n(2),n(3),n(4),n(5),n(6),n(7)},function(t,e){window.CTCTAJAX={},function(t,e,n){var c=this;n.init=function(){n.handleOptinAJAX(),n.handleReviewAJAX()},n.handleOptinAJAX=function(){e("#ctct_admin_notice_tracking_optin").on("click",(function(n){var o={action:"constant_contact_optin_ajax_handler",optin:e(c).is(":checked")?"on":"off"};e.ajax({url:t.ajaxurl,data:o,dataType:"json",success:function(t){e(document.getElementById("ctct-admin-notice-optin_admin_notice")).remove()},error:function(e,n,c){t.console&&console.log([n,c])}}),e("#ctct-privacy-modal").toggleClass("ctct-modal-open")})),e("#ctct-connect-ga-optin a").on("click",(function(n){var o={action:"constant_contact_optin_ajax_handler",optin:e(c).attr("data-allow")};e.ajax({url:t.ajaxurl,data:o,dataType:"json",success:function(t){e(".ctct-connected-opt-in").hide()},error:function(e,n,c){t.console&&console.log([n,c])}})})),e("#_ctct_data_tracking").on("click",(function(t){e("#ctct-privacy-modal").toggleClass("ctct-modal-open")})),e(".ctct-modal-close").on("click",(function(t){var n=e("#_ctct_data_tracking");n.is(":checked")&&n.attr("checked",!1)})),e("#ctct-modal-footer-privacy a").on("click",(function(n){var o={action:"constant_contact_privacy_ajax_handler",privacy_agree:e(c).attr("data-agree")};e.ajax({url:t.ajaxurl,data:o,dataType:"json",success:function(t){if(e("#ctct-privacy-modal").toggleClass("ctct-modal-open"),"false"===o.privacy_agree){var n=e("#_ctct_data_tracking");n.is(":checked")&&n.attr("checked",!1)}},error:function(e,n,c){t.console&&console.log([n,c])}})}))},n.handleReviewAJAX=function(){e("#ctct-admin-notice-review_request").on("click","a",(function(n){var o="dismissed";e(c).hasClass("ctct-review")&&(o="reviewed");var i={action:"constant_contact_review_ajax_handler","ctct-review-action":o};e.ajax({url:t.ajaxurl,data:i,dataType:"json",success:function(c){t.console&&console.log(c),n.preventDefault(),e("#ctct-admin-notice-review_request").hide()},error:function(e,n,c){t.console&&console.log([n,c])}})}))},e(n.init)}(window,jQuery,window.CTCTAJAX)},function(t,e){window.CTCTBuilder={},function(t,e,n){n.init=function(){e('#cmb2-metabox-ctct_2_fields_metabox option[value="email"]:selected').length&&e("#ctct-no-email-error").remove(),n.cache(),n.bindEvents(),n.selectBinds(),n.modifyFields(),e("#ctct_0_description_metabox h2.hndle").removeClass("ui-sortable-handle, hndle"),e("head").append('<style> #cmb2-metabox-ctct_2_fields_metabox a.move-up::after { content: "'+t.ctctTexts.move_up+'" } #cmb2-metabox-ctct_2_fields_metabox a.move-down::after { content: "'+t.ctctTexts.move_down+'" }</style>')},n.cache=function(){n.$c={window:e(t),body:e("body")},n.isLeaveWarningBound=!1},n.bindLeaveWarning=function(){n.isLeaveWarningBound||(e(t).bind("beforeunload",(function(){return t.ctctTexts.leavewarning})),n.isLeaveWarningBound=!0)},n.unbindLeaveWarning=function(){e(t).unbind("beforeunload")},n.bindEvents=function(){e("#post").submit((function(){e(".ctct-email-disabled").removeClass("disabled").prop("disabled",!1),n.unbindLeaveWarning()})),e(".cmb2-wrap input, .cmb2-wrap textarea").on("input",(function(){"undefined"!=typeof tinyMCE&&n.bindLeaveWarning()})),e(document).on("cmb2_shift_rows_complete",(function(){n.modifyFields(),n.bindLeaveWarning(),n.removeDuplicateMappings()})),e(document).on("cmb2_add_row",(function(t){e("#custom_fields_group_repeat .postbox").last().find(".map select").val("none"),n.modifyFields(),n.selectBinds(),n.removeDuplicateMappings()})),n.removeDuplicateMappings(),e("#ctct-reset-css").on("click",(function(t){t.preventDefault();var n=["#_ctct_form_description_font_size","#_ctct_form_submit_button_font_size","#_ctct_form_label_placement"],c=["#_ctct_form_padding_top","#_ctct_form_padding_bottom","#_ctct_form_padding_left","#_ctct_form_padding_right","#_ctct_input_custom_classes"];e(".wp-picker-clear").each((function(){e(this).click()}));for(var o=n.length;o--;){var i=e(n[o]).children("option").first();e(n[o]).val(i.val())}for(o=c.length;o--;)e(c[o]).val("")}))},n.selectBinds=function(){e("#cmb2-metabox-ctct_2_fields_metabox .cmb2_select").change((function(){n.modifyFields(),n.removeDuplicateMappings(),n.bindLeaveWarning()}))},n.modifyFields=function(){var n=!1;e("#cmb2-metabox-ctct_2_fields_metabox #custom_fields_group_repeat .cmb-repeatable-grouping").each((function(c,o){var i=e(this).find(".cmb-field-list"),a=e(i).find(".cmb-remove-group-row"),l=e(i).find(".required input[type=checkbox]"),s=l.closest(".cmb-row"),r=e(i).find(".map select option:selected"),d=r.text(),u=e(this).find("h3"),f=e(this).find('input[name*="_ctct_field_label"]'),p=e(this).find('input[name*="_ctct_field_desc"]');if(u.text(d),0===f.val().length?f.val(d).addClass("ctct-label-filled"):f.addClass("ctct-label-filled"),n||"email"!==e(r).val()?(e(o).find("select").removeClass("disabled ctct-email-disabled").prop("disabled",!1),s.show(),a.show()):(n=!0,l.prop("checked",!0),e(o).find("select").addClass("disabled ctct-email-disabled").prop("disabled",!0),s.hide(),a.hide()),t.ctct_admin_placeholders){var _=t.ctct_admin_placeholders[e(o).find("select").val()];_&&_.length&&p.length?p.attr("placeholder","Example: "+_):t.ctct_admin_placeholders.default&&p.attr("placeholder",t.ctct_admin_placeholders.default)}}))},n.removeDuplicateMappings=function(){var t=[],n="#cmb2-metabox-ctct_2_fields_metabox #custom_fields_group_repeat .cmb-repeatable-grouping select",c=e(n);c.each((function(n,c){t.push(e(c).val())})),c.children().show(),t.forEach((function(t){"custom_text_area"!==t&&"custom"!==t&&e(n+" option[value="+t+"]:not( :selected )").hide()}))},e(n.init)}(window,jQuery,window.CTCTBuilder)},function(t,e){window.CTCTForms={},function(t,e,n){n.init=function(){n.cache(),n.bindEvents()},n.cache=function(){n.$c={window:e(t),body:e("body"),disconnect:".ctct-disconnect"}},n.bindEvents=function(){e(n.$c.disconnect).on("click",(function(e){confirm(t.ctctTexts.disconnectconfirm)}))},e(n.init)}(window,jQuery,window.CTCTForms)},function(t,e){window.CTCTModal={},function(t,e,n){n.init=function(){n.cache(),n.bindEvents()},n.cache=function(){n.$c={window:e(t),modalSelector:e(".ctct-modal"),modalClose:e(".ctct-modal-close"),textareaModal:e("#ctct-custom-textarea-modal"),textareaLink:e("#ctct-open-textarea-info"),deleteLogLink:e("#deletelog")}},n.bindEvents=function(){n.$c.modalClose.on("click",(function(){n.$c.modalSelector.removeClass("ctct-modal-open"),n.$c.modalSelector.hasClass("ctct-custom-textarea-modal")||e.ajax({type:"post",dataType:"json",url:t.ajaxurl,data:{action:"ctct_dismiss_first_modal",ctct_is_dismissed:"true"}})})),n.$c.textareaLink.on("click",(function(){n.$c.textareaModal.addClass("ctct-modal-open")})),n.$c.deleteLogLink.on("click",(function(n){n.preventDefault();var c=e(n.currentTarget).attr("href");e("#confirmdelete").dialog({resizable:!1,height:"auto",width:400,modal:!0,buttons:{Yes:function(){t.location.replace(c)},Cancel:function(){e("#confirmdelete").closest(".ui-dialog-content").dialog("close")}}})}))},e(n.init)}(window,jQuery,window.CTCTModal)},function(t,e){var n,c;window.CTCTNewsletter={},window,n=jQuery,(c=window.CTCTNewsletter).init=function(){c.submitNewsletter()},c.submitNewsletter=function(){n(".ctct-body #subscribe").on("submit",(function(t){t.preventDefault();var e=n("#subscribe .ctct-call-to-action"),c=n(".ctct-body #subscribe")[0],o=n('.ctct-call-to-action input[type="text"]')[0],i=t.target.action;!0===o.validity.valid?(n("<iframe>",{src:i+"?"+n(c).serialize(),height:0,width:0,style:"display: none;"}).appendTo(e),n("#subbutton").val("Thanks for signing up").css({"background-color":"rgb(1, 128, 0)",color:"rgb(255,255,255)"}),n("#subscribe .ctct-call-to-action-text").css({width:"70%"})):n("#subbutton").val("Error occurred")})),n(".ctct-section #subscribe").on("submit",(function(t){t.preventDefault();var e=n(".section-marketing-tips"),c=n(".ctct-section #subscribe")[0],o=n('.ctct-section #subscribe input[type="text"]')[0],i=t.target.action;!0===o.validity.valid?(n("<iframe>",{src:i+"?"+n(c).serialize(),height:0,width:0,style:"display: none;"}).appendTo(e),n("#subbutton").val("Thanks for signing up").css({"background-color":"rgb(1, 128, 0)"})):n("#subbutton").val("Error occurred")}))},n(c.init)},function(t,e){var n,c;window.CTCT_OptIns={},window,n=jQuery,(c=window.CTCT_OptIns).init=function(){c.cache(),c.bindEvents()},c.cache=function(){c.$c={optinNoConn:n("#cmb2-metabox-ctct_1_optin_metabox #_ctct_opt_in_not_connected"),list:n("#cmb2-metabox-ctct_0_list_metabox #_ctct_list"),title:n("#cmb2-metabox-ctct_1_optin_metabox .cmb2-id-email-optin-title"),optin:n("#cmb2-metabox-ctct_1_optin_metabox .cmb2-id--ctct-opt-in"),instruct:n("#cmb2-metabox-ctct_1_optin_metabox .cmb2-id--ctct-opt-in-instructions")}},c.bindEvents=function(){c.$c.optinNoConn.length&&(c.toggleNoConnectionFields(),c.$c.optinNoConn.change((function(){c.toggleNoConnectionFields()}))),c.$c.list.length&&(c.toggleConnectionFields(),c.$c.list.change((function(){c.toggleConnectionFields()})))},c.toggleNoConnectionFields=function(){c.$c.optinNoConn.prop("checked")?c.$c.instruct.slideDown():c.$c.instruct.slideUp()},c.toggleConnectionFields=function(){""!==c.$c.list.val()?(c.$c.title.slideDown(),c.$c.optin.slideDown(),c.$c.instruct.slideDown()):(c.$c.title.slideUp(),c.$c.optin.slideUp(),c.$c.instruct.slideUp())},n(c.init)}]);
2
  //# sourceMappingURL=ctct-plugin-admin.min.js.map
1
+ !function(t){var e={};function n(c){if(e[c])return e[c].exports;var o=e[c]={i:c,l:!1,exports:{}};return t[c].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=t,n.c=e,n.d=function(t,e,c){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:c})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var c=Object.create(null);if(n.r(c),Object.defineProperty(c,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(c,o,function(e){return t[e]}.bind(null,o));return c},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="https://testing.test/wp-content/plugins/constant-contact-forms/assets/js/",n(n.s=0)}([function(t,e,n){t.exports=n(1)},function(t,e,n){"use strict";n.r(e);n(2),n(3),n(4),n(5),n(6),n(7)},function(t,e){window.CTCTAJAX={},function(t,e,n){var c=this;n.init=function(){n.handleOptinAJAX(),n.handleReviewAJAX()},n.handleOptinAJAX=function(){e("#ctct_admin_notice_tracking_optin").on("click",(function(n){var o={action:"constant_contact_optin_ajax_handler",optin:e(c).is(":checked")?"on":"off"};e.ajax({url:t.ajaxurl,data:o,dataType:"json",success:function(t){e(document.getElementById("ctct-admin-notice-optin_admin_notice")).remove()},error:function(e,n,c){t.console&&console.log([n,c])}}),e("#ctct-privacy-modal").toggleClass("ctct-modal-open")})),e("#ctct-connect-ga-optin a").on("click",(function(n){var o={action:"constant_contact_optin_ajax_handler",optin:e(c).attr("data-allow")};e.ajax({url:t.ajaxurl,data:o,dataType:"json",success:function(t){e(".ctct-connected-opt-in").hide()},error:function(e,n,c){t.console&&console.log([n,c])}})})),e("#_ctct_data_tracking").on("click",(function(t){e("#ctct-privacy-modal").toggleClass("ctct-modal-open")})),e(".ctct-modal-close").on("click",(function(t){var n=e("#_ctct_data_tracking");n.is(":checked")&&n.attr("checked",!1)})),e("#ctct-modal-footer-privacy a").on("click",(function(n){var o={action:"constant_contact_privacy_ajax_handler",privacy_agree:e(c).attr("data-agree")};e.ajax({url:t.ajaxurl,data:o,dataType:"json",success:function(t){if(e("#ctct-privacy-modal").toggleClass("ctct-modal-open"),"false"===o.privacy_agree){var n=e("#_ctct_data_tracking");n.is(":checked")&&n.attr("checked",!1)}},error:function(e,n,c){t.console&&console.log([n,c])}})}))},n.handleReviewAJAX=function(){e("#ctct-admin-notice-review_request").on("click","a",(function(n){var o="dismissed";e(c).hasClass("ctct-review")&&(o="reviewed");var i={action:"constant_contact_review_ajax_handler","ctct-review-action":o};e.ajax({url:t.ajaxurl,data:i,dataType:"json",success:function(c){t.console&&console.log(c),n.preventDefault(),e("#ctct-admin-notice-review_request").hide()},error:function(e,n,c){t.console&&console.log([n,c])}})}))},e(n.init)}(window,jQuery,window.CTCTAJAX)},function(t,e){window.CTCTBuilder={},function(t,e,n){n.init=function(){e('#cmb2-metabox-ctct_2_fields_metabox option[value="email"]:selected').length&&e("#ctct-no-email-error").remove(),n.cache(),n.bindEvents(),n.selectBinds(),n.modifyFields(),e("#ctct_0_description_metabox h2.hndle").removeClass("ui-sortable-handle, hndle"),e("head").append('<style> #cmb2-metabox-ctct_2_fields_metabox a.move-up::after { content: "'+t.ctctTexts.move_up+'" } #cmb2-metabox-ctct_2_fields_metabox a.move-down::after { content: "'+t.ctctTexts.move_down+'" }</style>')},n.cache=function(){n.$c={window:e(t),body:e("body")},n.isLeaveWarningBound=!1},n.bindLeaveWarning=function(){n.isLeaveWarningBound||(e(t).bind("beforeunload",(function(){return t.ctctTexts.leavewarning})),n.isLeaveWarningBound=!0)},n.unbindLeaveWarning=function(){e(t).unbind("beforeunload")},n.bindEvents=function(){e("#post").submit((function(){e(".ctct-email-disabled").removeClass("disabled").prop("disabled",!1),n.unbindLeaveWarning()})),e(".cmb2-wrap input, .cmb2-wrap textarea").on("input",(function(){"undefined"!=typeof tinyMCE&&n.bindLeaveWarning()})),e(document).on("cmb2_shift_rows_complete",(function(){n.modifyFields(),n.bindLeaveWarning(),n.removeDuplicateMappings()})),e(document).on("cmb2_add_row",(function(t){e("#custom_fields_group_repeat .postbox").last().find(".map select").val("none"),n.modifyFields(),n.selectBinds(),n.removeDuplicateMappings()})),n.removeDuplicateMappings(),e("#ctct-reset-css").on("click",(function(t){t.preventDefault();var n=["#_ctct_form_description_font_size","#_ctct_form_submit_button_font_size","#_ctct_form_label_placement"],c=["#_ctct_form_padding_top","#_ctct_form_padding_bottom","#_ctct_form_padding_left","#_ctct_form_padding_right","#_ctct_input_custom_classes"];e(".wp-picker-clear").each((function(){e(this).click()}));for(var o=n.length;o--;){var i=e(n[o]).children("option").first();e(n[o]).val(i.val())}for(o=c.length;o--;)e(c[o]).val("")}))},n.selectBinds=function(){e("#cmb2-metabox-ctct_2_fields_metabox .cmb2_select").change((function(){n.modifyFields(),n.removeDuplicateMappings(),n.bindLeaveWarning()}))},n.modifyFields=function(){var n=!1;e("#cmb2-metabox-ctct_2_fields_metabox #custom_fields_group_repeat .cmb-repeatable-grouping").each((function(c,o){var i=e(this).find(".cmb-field-list"),a=e(i).find(".cmb-remove-group-row"),l=e(i).find(".required input[type=checkbox]"),s=l.closest(".cmb-row"),r=e(i).find(".map select option:selected"),d=r.text(),u=e(this).find("h3"),f=e(this).find('input[name*="_ctct_field_label"]'),p=e(this).find('input[name*="_ctct_field_desc"]');if(u.text(d),0===f.val().length?f.val(d).addClass("ctct-label-filled"):f.addClass("ctct-label-filled"),n||"email"!==e(r).val()?(e(o).find("select").removeClass("disabled ctct-email-disabled").prop("disabled",!1),s.show(),a.show()):(n=!0,l.prop("checked",!0),e(o).find("select").addClass("disabled ctct-email-disabled").prop("disabled",!0),s.hide(),a.hide()),t.ctct_admin_placeholders){var _=t.ctct_admin_placeholders[e(o).find("select").val()];_&&_.length&&p.length?p.attr("placeholder","Example: "+_):t.ctct_admin_placeholders.default&&p.attr("placeholder",t.ctct_admin_placeholders.default)}}))},n.removeDuplicateMappings=function(){var t=[],n="#cmb2-metabox-ctct_2_fields_metabox #custom_fields_group_repeat .cmb-repeatable-grouping select",c=e(n);c.each((function(n,c){t.push(e(c).val())})),c.children().show(),t.forEach((function(t){"custom_text_area"!==t&&"custom"!==t&&e(n+" option[value="+t+"]:not( :selected )").hide()}))},e(n.init)}(window,jQuery,window.CTCTBuilder)},function(t,e){window.CTCTForms={},function(t,e,n){n.init=function(){n.cache(),n.bindEvents()},n.cache=function(){n.$c={window:e(t),body:e("body"),disconnect:".ctct-disconnect"}},n.bindEvents=function(){e(n.$c.disconnect).on("click",(function(e){confirm(t.ctctTexts.disconnectconfirm)}))},e(n.init)}(window,jQuery,window.CTCTForms)},function(t,e){window.CTCTModal={},function(t,e,n){n.init=function(){n.cache(),n.bindEvents()},n.cache=function(){n.$c={window:e(t),modalSelector:e(".ctct-modal"),modalClose:e(".ctct-modal-close"),textareaModal:e("#ctct-custom-textarea-modal"),textareaLink:e("#ctct-open-textarea-info"),deleteLogLink:e("#deletelog")}},n.bindEvents=function(){n.$c.modalClose.on("click",(function(){n.$c.modalSelector.removeClass("ctct-modal-open"),n.$c.modalSelector.hasClass("ctct-custom-textarea-modal")||e.ajax({type:"post",dataType:"json",url:t.ajaxurl,data:{action:"ctct_dismiss_first_modal",ctct_is_dismissed:"true"}})})),n.$c.textareaLink.on("click",(function(){n.$c.textareaModal.addClass("ctct-modal-open")})),n.$c.deleteLogLink.on("click",(function(n){n.preventDefault();var c=e(n.currentTarget).attr("href");e("#confirmdelete").dialog({resizable:!1,height:"auto",width:400,modal:!0,buttons:{Yes:function(){t.location.replace(c)},Cancel:function(){e("#confirmdelete").closest(".ui-dialog-content").dialog("close")}}})}))},e(n.init)}(window,jQuery,window.CTCTModal)},function(t,e){var n,c;window.CTCTNewsletter={},window,n=jQuery,(c=window.CTCTNewsletter).init=function(){c.submitNewsletter()},c.submitNewsletter=function(){n(".ctct-body #subscribe").on("submit",(function(t){t.preventDefault();var e=n("#subscribe .ctct-call-to-action"),c=n(".ctct-body #subscribe")[0],o=n('.ctct-call-to-action input[type="text"]')[0],i=t.target.action;!0===o.validity.valid?(n("<iframe>",{src:i+"?"+n(c).serialize(),height:0,width:0,style:"display: none;"}).appendTo(e),n("#subbutton").val("Thanks for signing up").css({"background-color":"rgb(1, 128, 0)",color:"rgb(255,255,255)"}),n("#subscribe .ctct-call-to-action-text").css({width:"70%"})):n("#subbutton").val("Error occurred")})),n(".ctct-section #subscribe").on("submit",(function(t){t.preventDefault();var e=n(".section-marketing-tips"),c=n(".ctct-section #subscribe")[0],o=n('.ctct-section #subscribe input[type="text"]')[0],i=t.target.action;!0===o.validity.valid?(n("<iframe>",{src:i+"?"+n(c).serialize(),height:0,width:0,style:"display: none;"}).appendTo(e),n("#subbutton").val("Thanks for signing up").css({"background-color":"rgb(1, 128, 0)"})):n("#subbutton").val("Error occurred")}))},n(c.init)},function(t,e){var n,c;window.CTCT_OptIns={},window,n=jQuery,(c=window.CTCT_OptIns).init=function(){c.cache(),c.bindEvents()},c.cache=function(){c.$c={optinNoConn:n("#cmb2-metabox-ctct_1_optin_metabox #_ctct_opt_in_not_connected"),list:n('#cmb2-metabox-ctct_0_list_metabox [name="_ctct_list[]"]'),title:n("#cmb2-metabox-ctct_1_optin_metabox .cmb2-id-email-optin-title"),optin:n("#cmb2-metabox-ctct_1_optin_metabox .cmb2-id--ctct-opt-in"),instruct:n("#cmb2-metabox-ctct_1_optin_metabox .cmb2-id--ctct-opt-in-instructions")}},c.bindEvents=function(){c.$c.optinNoConn.length&&(c.toggleNoConnectionFields(),c.$c.optinNoConn.change((function(){c.toggleNoConnectionFields()}))),c.$c.list.length&&(c.toggleConnectionFields(),c.$c.list.change((function(){c.toggleConnectionFields()})))},c.toggleNoConnectionFields=function(){c.$c.optinNoConn.prop("checked")?c.$c.instruct.slideDown():c.$c.instruct.slideUp()},c.toggleConnectionFields=function(){""!==c.$c.list.val()?(c.$c.title.slideDown(),c.$c.optin.slideDown(),c.$c.instruct.slideDown()):(c.$c.title.slideUp(),c.$c.optin.slideUp(),c.$c.instruct.slideUp())},n(c.init)}]);
2
  //# sourceMappingURL=ctct-plugin-admin.min.js.map
assets/js/ctct-plugin-admin.min.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./assets/js/ctct-plugin-admin/index.js","webpack:///./assets/js/ctct-plugin-admin/ajax.js","webpack:///./assets/js/ctct-plugin-admin/builder.js","webpack:///./assets/js/ctct-plugin-admin/forms.js","webpack:///./assets/js/ctct-plugin-admin/modal.js","webpack:///./assets/js/ctct-plugin-admin/newsletter.js","webpack:///./assets/js/ctct-plugin-admin/optins.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","window","CTCTAJAX","$","that","init","handleOptinAJAX","handleReviewAJAX","on","e","ctctOptinAjax","is","ajax","url","ajaxurl","data","dataType","success","response","document","getElementById","remove","error","x","console","log","toggleClass","attr","hide","$checkbox","ctctPrivacyAjax","privacy_agree","ctctAction","hasClass","ctctReviewAjax","resp","preventDefault","jQuery","CTCTBuilder","length","cache","bindEvents","selectBinds","modifyFields","removeClass","append","ctctTexts","move_up","move_down","$c","body","isLeaveWarningBound","bindLeaveWarning","leavewarning","unbindLeaveWarning","unbind","submit","prop","tinyMCE","removeDuplicateMappings","newRow","last","find","val","event","selectFields","textFields","each","this","click","firstOption","children","first","change","foundEmail","$fieldParent","$button","$required","$requiredRow","closest","$map","$mapName","text","$fieldTitle","$labelField","$descField","addClass","show","ctct_admin_placeholders","placeholder","default","usedMappings","dropdowns","$dropdowns","push","forEach","CTCTForms","disconnect","confirm","disconnectconfirm","CTCTModal","app","modalSelector","modalClose","textareaModal","textareaLink","deleteLogLink","type","action","currentTarget","dialog","resizable","height","width","modal","buttons","location","replace","CTCTNewsletter","submitNewsletter","$ctctNewsWrapper","ctctNewsForm","ctctEmailField","subscribeEndpoint","target","validity","valid","serialize","appendTo","css","CTCT_OptIns","optinNoConn","list","title","optin","instruct","toggleNoConnectionFields","toggleConnectionFields","slideDown","slideUp"],"mappings":"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","file":"ctct-plugin-admin.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"https://testing.test/wp-content/plugins/constant-contact-forms/assets/js/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","import './ajax';\nimport './builder';\nimport './forms';\nimport './modal';\nimport './newsletter';\nimport './optins';\n","window.CTCTAJAX = {};\n\n( function( window, $, that ) {\n\n\t/**\n\t * @constructor\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tthat.init = () => {\n\n\t\t// Trigger any field modifications we need to do.\n\t\tthat.handleOptinAJAX();\n\t\tthat.handleReviewAJAX();\n\t};\n\n\t/**\n\t * We need to manipulate our form builder a bit. We do this here.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tthat.handleOptinAJAX = () => {\n\n\t\t// eslint-disable-next-line no-unused-vars\n\t\t$( '#ctct_admin_notice_tracking_optin' ).on( 'click', ( e ) => {\n\n\t\t\tvar ctctOptinAjax = {\n\t\t\t\t'action': 'constant_contact_optin_ajax_handler',\n\t\t\t\t'optin': ( $( this ).is( ':checked' ) ) ? 'on' : 'off'\n\t\t\t};\n\n\t\t\t$.ajax( {\n\t\t\t\turl: window.ajaxurl,\n\t\t\t\tdata: ctctOptinAjax,\n\t\t\t\tdataType: 'json',\n\t\t\t\tsuccess: ( response ) => {\n\t\t\t\t\t$( document.getElementById( 'ctct-admin-notice-optin_admin_notice' ) ).remove();\n\t\t\t\t},\n\t\t\t\terror: ( x, t, m ) => {\n\t\t\t\t\tif ( window.console ) {\n\t\t\t\t\t\tconsole.log( [ t, m ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t$( '#ctct-privacy-modal' ).toggleClass( 'ctct-modal-open' );\n\t\t} );\n\n\t\t// Opens the privacy modal once clicking on the checkbox to opt in via the admin notice.\n\t\t// eslint-disable-next-line no-unused-vars\n\t\t$( '#ctct-connect-ga-optin a' ).on( 'click', ( e ) => {\n\t\t\tvar ctctOptinAjax = {\n\t\t\t\t'action': 'constant_contact_optin_ajax_handler',\n\t\t\t\t'optin': $( this ).attr( 'data-allow' )\n\t\t\t};\n\n\t\t\t$.ajax( {\n\t\t\t\turl: window.ajaxurl,\n\t\t\t\tdata: ctctOptinAjax,\n\t\t\t\tdataType: 'json',\n\t\t\t\tsuccess: ( response ) => { // eslint-disable-line no-unused-vars\n\t\t\t\t\t$( '.ctct-connected-opt-in' ).hide();\n\t\t\t\t},\n\t\t\t\terror: ( x, t, m ) => {\n\t\t\t\t\tif ( window.console ) {\n\t\t\t\t\t\tconsole.log( [ t, m ] ); // eslint-disable-line no-console\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\n\t\t// eslint-disable-next-line no-unused-vars\n\t\t$( '#_ctct_data_tracking' ).on( 'click', ( e ) => {\n\t\t\t$( '#ctct-privacy-modal' ).toggleClass( 'ctct-modal-open' );\n\t\t} );\n\n\t\t// Unchecks the value if they have closed the privacy modal without agreeing/disagreeing.\n\t\t// eslint-disable-next-line no-unused-vars\n\t\t$( '.ctct-modal-close' ).on( 'click', ( e ) => {\n\t\t\tvar $checkbox = $( '#_ctct_data_tracking' );\n\t\t\tif ( $checkbox.is( ':checked' ) ) {\n\t\t\t\t$checkbox.attr( 'checked', false );\n\t\t\t}\n\t\t} );\n\n\t\t// Handle the agreeing or disagreeing regarding privacy modal.\n\t\t// eslint-disable-next-line no-unused-vars\n\t\t$( '#ctct-modal-footer-privacy a' ).on( 'click', ( e ) => {\n\t\t\tvar ctctPrivacyAjax = {\n\t\t\t\t'action': 'constant_contact_privacy_ajax_handler',\n\t\t\t\t'privacy_agree': $( this ).attr( 'data-agree' )\n\t\t\t};\n\n\t\t\t$.ajax( {\n\t\t\t\turl: window.ajaxurl,\n\t\t\t\tdata: ctctPrivacyAjax,\n\t\t\t\tdataType: 'json',\n\t\t\t\tsuccess: ( response ) => { // eslint-disable-line no-unused-vars\n\t\t\t\t\t$( '#ctct-privacy-modal' ).toggleClass( 'ctct-modal-open' );\n\t\t\t\t\tif ( 'false' === ctctPrivacyAjax.privacy_agree ) {\n\t\t\t\t\t\tvar $checkbox = $( '#_ctct_data_tracking' );\n\t\t\t\t\t\tif ( $checkbox.is( ':checked' ) ) {\n\t\t\t\t\t\t\t$checkbox.attr( 'checked', false );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\terror: ( x, t, m ) => {\n\t\t\t\t\tif ( window.console ) {\n\t\t\t\t\t\tconsole.log( [ t, m ] ); // eslint-disable-line no-console\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t};\n\n\t// Handle saving the decision regarding the review prompt admin notice.\n\tthat.handleReviewAJAX = () => {\n\t\t$( '#ctct-admin-notice-review_request' ).on( 'click', 'a', ( e ) => {\n\n\t\t\tvar ctctAction = 'dismissed';\n\n\t\t\tif ( $( this ).hasClass( 'ctct-review' ) ) {\n\t\t\t\tctctAction = 'reviewed';\n\t\t\t}\n\n\t\t\tvar ctctReviewAjax = {\n\t\t\t\t'action': 'constant_contact_review_ajax_handler',\n\t\t\t\t'ctct-review-action': ctctAction\n\t\t\t};\n\n\t\t\t$.ajax( {\n\t\t\t\turl: window.ajaxurl,\n\t\t\t\tdata: ctctReviewAjax,\n\t\t\t\tdataType: 'json',\n\t\t\t\tsuccess: ( resp ) => {\n\t\t\t\t\tif ( window.console ) {\n\t\t\t\t\t\tconsole.log( resp ); // eslint-disable-line no-console\n\t\t\t\t\t}\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\t$( '#ctct-admin-notice-review_request' ).hide();\n\t\t\t\t},\n\t\t\t\terror: ( x, t, m ) => {\n\t\t\t\t\tif ( window.console ) {\n\t\t\t\t\t\tconsole.log( [ t, m ] ); // eslint-disable-line no-console\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t};\n\n\t$( that.init );\n\n} ( window, jQuery, window.CTCTAJAX ) );\n","window.CTCTBuilder = {};\n\n( function( window, $, that ) {\n\n\t/**\n\t * @constructor\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tthat.init = () => {\n\n\t\t// If we do actually have an email field set, then remove our error.\n\t\tif ( $( '#cmb2-metabox-ctct_2_fields_metabox option[value=\"email\"]:selected' ).length ) {\n\t\t\t$( '#ctct-no-email-error' ).remove();\n\t\t}\n\n\t\t// Cache it all.\n\t\tthat.cache();\n\n\t\t// Bind our events.\n\t\tthat.bindEvents();\n\n\t\t// Bind our select dropdown events.\n\t\tthat.selectBinds();\n\n\t\t// Trigger any field modifications we need to do.\n\t\tthat.modifyFields();\n\n\t\t// Make description non-draggable, so we don't run into weird cmb2 issues.\n\t\t$( '#ctct_0_description_metabox h2.hndle' ).removeClass( 'ui-sortable-handle, hndle' );\n\n\t\t// Inject our new labels for the up/down CMB2 buttons, so they can be properly localized.\n\t\t// Because we're using :after, we can't use .css() to do this, we need to inject a style tag.\n\t\t$( 'head' ).append( '<style> #cmb2-metabox-ctct_2_fields_metabox a.move-up::after { content: \"' + window.ctctTexts.move_up + '\" } #cmb2-metabox-ctct_2_fields_metabox a.move-down::after { content: \"' + window.ctctTexts.move_down + '\" }</style>' );\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\tthat.cache = () => {\n\n\t\tthat.$c = {\n\t\t\twindow: $( window ),\n\t\t\tbody: $( 'body' )\n\t\t};\n\n\t\tthat.isLeaveWarningBound = false;\n\t};\n\n\t// Triggers our leave warning if we modify things in the form.\n\tthat.bindLeaveWarning = () => {\n\n\t\t// Don't double-bind it.\n\t\tif ( ! that.isLeaveWarningBound ) {\n\n\t\t\t// Bind our error that displays before leaving page.\n\t\t\t$( window ).bind( 'beforeunload', () => {\n\t\t\t\treturn window.ctctTexts.leavewarning;\n\t\t\t} );\n\n\t\t\t// Save our state.\n\t\t\tthat.isLeaveWarningBound = true;\n\t\t}\n\t};\n\n\t/**\n\t * Removes our binding of our leave warning.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tthat.unbindLeaveWarning = () => {\n\t\t$( window ).unbind( 'beforeunload' );\n\t};\n\n\t/**\n\t * Attach callbacks to events.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tthat.bindEvents = () => {\n\n\t\t$( '#post' ).submit( () => {\n\n\t\t\t// Make sure our email dropdown reverts from disbled, as CMB2 doesn't save those values.\n\t\t\t$( '.ctct-email-disabled' ).removeClass( 'disabled' ).prop( 'disabled', false );\n\n\t\t\tthat.unbindLeaveWarning();\n\t\t} );\n\n\t\t$( '.cmb2-wrap input, .cmb2-wrap textarea' ).on( 'input', () => {\n\t\t\tif ( 'undefined' !== typeof( tinyMCE ) ) {\n\t\t\t\tthat.bindLeaveWarning();\n\t\t\t}\n\t\t} );\n\n\t\t// Disable email options on row change trigger.\n\t\t$( document ).on( 'cmb2_shift_rows_complete', () => {\n\t\t\tthat.modifyFields();\n\t\t\tthat.bindLeaveWarning();\n\t\t\tthat.removeDuplicateMappings();\n\t\t} );\n\n\t\t// If we get a row added, then do our stuff.\n\t\t$( document ).on( 'cmb2_add_row', ( newRow ) => { // eslint-disable-line no-unused-vars\n\n\t\t\t// Automatically set new rows to be 'custom' field type.\n\t\t\t$( '#custom_fields_group_repeat .postbox' ).last().find( '.map select' ).val( 'none' );\n\n\t\t\tthat.modifyFields();\n\t\t\tthat.selectBinds();\n\t\t\tthat.removeDuplicateMappings();\n\t\t} );\n\n\t\tthat.removeDuplicateMappings();\n\n\t\t$( '#ctct-reset-css' ).on( 'click', ( event ) => {\n\t\t\tevent.preventDefault();\n\n\t\t\tvar selectFields = [\n\t\t\t\t'#_ctct_form_description_font_size',\n\t\t\t\t'#_ctct_form_submit_button_font_size',\n\t\t\t\t'#_ctct_form_label_placement'\n\t\t\t];\n\n\t\t\tvar textFields = [\n\t\t\t\t'#_ctct_form_padding_top',\n\t\t\t\t'#_ctct_form_padding_bottom',\n\t\t\t\t'#_ctct_form_padding_left',\n\t\t\t\t'#_ctct_form_padding_right',\n\t\t\t\t'#_ctct_input_custom_classes'\n\t\t\t];\n\n\t\t\t// Reset color pickers.\n\t\t\t$( '.wp-picker-clear' ).each( function() {\n\t\t\t\t$( this ).click();\n\t\t\t} );\n\n\t\t\tfor ( var i = selectFields.length; i--; ) {\n\t\t\t\tvar firstOption = $( selectFields[i] ).children( 'option' ).first();\n\t\t\t\t$( selectFields[i] ).val( firstOption.val() );\n\t\t\t}\n\n\t\t\tfor ( var i = textFields.length; i--; ) {\n\t\t\t\t$( textFields[i] ).val( '' );\n\t\t\t}\n\t\t} );\n\t};\n\n\t/**\n\t * When .cmb2_select <selects> get changed, do some actions.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tthat.selectBinds = () => {\n\n\t\t// For each fields select.\n\t\t$( '#cmb2-metabox-ctct_2_fields_metabox .cmb2_select' ).change( () => {\n\n\t\t\t// Modify our fields.\n\t\t\tthat.modifyFields();\n\n\t\t\t// Don't allow duplicate mappings in form.\n\t\t\tthat.removeDuplicateMappings();\n\n\t\t\t// Bind our leave warning.\n\t\t\tthat.bindLeaveWarning();\n\t\t} );\n\t};\n\n\t/**\n\t * We need to manipulate our form builder a bit. We do this here.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tthat.modifyFields = () => {\n\n\t\t// Set that we haven't found an email.\n\t\tvar foundEmail = false;\n\n\t\t// Loop through all fields to modify them.\n\t\t$( '#cmb2-metabox-ctct_2_fields_metabox #custom_fields_group_repeat .cmb-repeatable-grouping' ).each( function( key, value ) {\n\n\t\t\t// Set some of our helper paramaters.\n\t\t\tvar $fieldParent = $( this ).find( '.cmb-field-list' );\n\t\t\tvar $button = $( $fieldParent ).find( '.cmb-remove-group-row' );\n\t\t\tvar $required = $( $fieldParent ).find( '.required input[type=checkbox]' );\n\t\t\tvar $requiredRow = $required.closest( '.cmb-row' );\n\t\t\tvar $map = $( $fieldParent ).find( '.map select option:selected' );\n\t\t\tvar $mapName = $map.text();\n\t\t\tvar $fieldTitle = $( this ).find( 'h3' );\n\t\t\tvar $labelField = $( this ).find( 'input[name*=\"_ctct_field_label\"]' );\n\t\t\tvar $descField = $( this ).find( 'input[name*=\"_ctct_field_desc\"]' );\n\n\t\t\t// Set our field row to be the name of the selected option.\n\t\t\t$fieldTitle.text( $mapName );\n\n\t\t\t// If we have a blank field label, then use the name of the field to fill it in.\n\t\t\tif ( 0 === $labelField.val().length ) {\n\t\t\t\t$labelField.val( $mapName ).addClass( 'ctct-label-filled' );\n\t\t\t} else {\n\t\t\t\t$labelField.addClass( 'ctct-label-filled' );\n\t\t\t}\n\n\t\t\t// If we haven't yet found an email field, and this is our email field.\n\t\t\tif ( ! foundEmail && ( 'email' === $( $map ).val() ) ) {\n\n\t\t\t\t// Set that we found an email field.\n\t\t\t\tfoundEmail = true;\n\n\t\t\t\t// Make it required.\n\t\t\t\t$required.prop( 'checked', true );\n\n\t\t\t\t// Set it to be 'disabled'.\n\t\t\t\t$( value ).find( 'select' ).addClass( 'disabled ctct-email-disabled' ).prop( 'disabled', true );\n\n\t\t\t\t// Hide the required row.\n\t\t\t\t$requiredRow.hide();\n\n\t\t\t\t// Hide the remove row button.\n\t\t\t\t$button.hide();\n\n\t\t\t} else {\n\n\t\t\t\t// Verify its not disabled.\n\t\t\t\t$( value ).find( 'select' ).removeClass( 'disabled ctct-email-disabled' ).prop( 'disabled', false );\n\n\t\t\t\t// If we're not an email field, reshow the required field.\n\t\t\t\t$requiredRow.show();\n\n\t\t\t\t// and the remove button.\n\t\t\t\t$button.show();\n\t\t\t}\n\n\t\t\t// Set the placeholder text if there's something to set.\n\t\t\tif ( window.ctct_admin_placeholders ) {\n\t\t\t\tvar placeholder = window.ctct_admin_placeholders[ $( value ).find( 'select' ).val() ];\n\n\t\t\t\t// If we have a valid placeholder, display it or try the fallback.\n\t\t\t\tif ( placeholder && placeholder.length && $descField.length ) {\n\t\t\t\t\t$descField.attr( 'placeholder', 'Example: ' + placeholder );\n\t\t\t\t} else if ( window.ctct_admin_placeholders.default ) {\n\t\t\t\t\t$descField.attr( 'placeholder', window.ctct_admin_placeholders.default );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t};\n\n\t/**\n\t * Go through all dropdowns, and remove used options.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tthat.removeDuplicateMappings = () => {\n\n\t\tvar usedMappings = [];\n\t\tvar dropdowns = '#cmb2-metabox-ctct_2_fields_metabox #custom_fields_group_repeat .cmb-repeatable-grouping select';\n\t\tvar $dropdowns = $( dropdowns );\n\n\t\t// For each dropdown, build up our array of used values.\n\t\t$dropdowns.each( function( key, value ) {\n\t\t\tusedMappings.push( $( value ).val() );\n\t\t} );\n\n\t\t// Re-show all the children options we may have hidden.\n\t\t$dropdowns.children().show();\n\n\t\t// For each of our mappings that we already have, remove them from all selects.\n\t\tusedMappings.forEach( function( value ) {\n\n\t\t\t// But only do it if the value isn't one of our custom ones.\n\t\t\tif ( ( 'custom_text_area' !== value ) && ( 'custom' !== value ) ) {\n\n\t\t\t\t// Remove all options from our dropdowns with the value.\n\t\t\t\t$( dropdowns + ' option[value=' + value + ']:not( :selected )' ).hide();\n\t\t\t}\n\t\t} );\n\t};\n\n\t$( that.init );\n\n} ( window, jQuery, window.CTCTBuilder ) );\n","window.CTCTForms = {};\n\n( function( window, $, that ) {\n\n\t/**\n\t * @constructor\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tthat.init = () => {\n\t\tthat.cache();\n\t\tthat.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\tthat.cache = () => {\n\t\tthat.$c = {\n\t\t\twindow: $( window ),\n\t\t\tbody: $( 'body' ),\n\t\t\tdisconnect: '.ctct-disconnect'\n\t\t};\n\t};\n\n\t/**\n\t * Attach callbacks to events.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tthat.bindEvents = () => {\n\n\t\t$( that.$c.disconnect ).on( 'click', ( e ) => { // eslint-disable-line no-unused-vars\n\t\t\tconfirm( window.ctctTexts.disconnectconfirm );\n\t\t} );\n\t};\n\n\t$( that.init );\n\n} ( window, jQuery, window.CTCTForms ) );\n","window.CTCTModal = {};\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\t\tapp.$c = {\n\t\t\twindow: $( window ),\n\t\t\tmodalSelector: $( '.ctct-modal' ),\n\t\t\tmodalClose: $( '.ctct-modal-close' ),\n\t\t\ttextareaModal: $( '#ctct-custom-textarea-modal' ),\n\t\t\ttextareaLink: $( '#ctct-open-textarea-info' ),\n\t\t\tdeleteLogLink: $( '#deletelog' )\n\t\t};\n\t};\n\n\t/**\n\t * Attach callbacks to events.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tapp.bindEvents = () => {\n\n\t\tapp.$c.modalClose.on( 'click', () => {\n\n\t\t\tapp.$c.modalSelector.removeClass( 'ctct-modal-open' );\n\n\t\t\tif ( app.$c.modalSelector.hasClass( 'ctct-custom-textarea-modal' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$.ajax( {\n\t\t\t\ttype: 'post',\n\t\t\t\tdataType: 'json',\n\t\t\t\turl: window.ajaxurl,\n\t\t\t\tdata: {\n\t\t\t\t\taction: 'ctct_dismiss_first_modal',\n\t\t\t\t\t'ctct_is_dismissed': 'true'\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\n\t\tapp.$c.textareaLink.on( 'click', () => {\n\t\t\tapp.$c.textareaModal.addClass( 'ctct-modal-open' );\n\t\t} );\n\n\t\tapp.$c.deleteLogLink.on( 'click', ( event ) => {\n\t\t\tevent.preventDefault();\n\n\t\t\t// Get the link that was clicked on so we can redirect to it if the user confirms.\n\t\t\tvar deleteLogLink = $( event.currentTarget ).attr( 'href' );\n\n\t\t\t$( '#confirmdelete' ).dialog( {\n\t\t\t\tresizable: false,\n\t\t\t\theight: 'auto',\n\t\t\t\twidth: 400,\n\t\t\t\tmodal: true,\n\t\t\t\tbuttons: {\n\t\t\t\t\t'Yes': () => {\n\n\t\t\t\t\t\t// If the user confirms the action, redirect them to the deletion page.\n\t\t\t\t\t\twindow.location.replace( deleteLogLink );\n\t\t\t\t\t},\n\t\t\t\t\t'Cancel': () => {\n\t\t\t\t\t\t$( '#confirmdelete' ).closest( '.ui-dialog-content' ).dialog( 'close' );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t};\n\n\t$( app.init );\n\n} ( window, jQuery, window.CTCTModal ) );\n","window.CTCTNewsletter = {};\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.submitNewsletter();\n\t};\n\n\t/**\n\t * Handle newsletter signups on the \"Connect\" and \"About\" pages.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tapp.submitNewsletter = () => {\n\n\t\t// Connect page.\n\t\t$( '.ctct-body #subscribe' ).on( 'submit', ( event ) => {\n\t\t\tevent.preventDefault();\n\n\t\t\tvar $ctctNewsWrapper = $( '#subscribe .ctct-call-to-action' );\n\t\t\tvar ctctNewsForm = $( '.ctct-body #subscribe' )[0];\n\t\t\tvar ctctEmailField = $( '.ctct-call-to-action input[type=\"text\"]' )[0];\n\t\t\tvar subscribeEndpoint = event.target.action;\n\n\t\t\tif ( true === ctctEmailField.validity.valid ) {\n\t\t\t\t$( '<iframe>', {\n\t\t\t\t\t'src': subscribeEndpoint + '?' + $( ctctNewsForm ).serialize(),\n\t\t\t\t\t'height': 0,\n\t\t\t\t\t'width': 0,\n\t\t\t\t\t'style': 'display: none;'\n\t\t\t\t} ).appendTo( $ctctNewsWrapper );\n\n\t\t\t\t$( '#subbutton' ).val( 'Thanks for signing up' ).css( { 'background-color': 'rgb(1, 128, 0)', 'color': 'rgb(255,255,255)' } );\n\t\t\t\t$( '#subscribe .ctct-call-to-action-text' ).css( { 'width': '70%' } );\n\t\t\t} else {\n\t\t\t\t$( '#subbutton' ).val( 'Error occurred' );\n\t\t\t}\n\t\t} );\n\n\t\t// About page.\n\t\t$( '.ctct-section #subscribe' ).on( 'submit', ( event ) => {\n\t\t\tevent.preventDefault();\n\n\t\t\tvar $ctctNewsWrapper = $( '.section-marketing-tips' );\n\t\t\tvar ctctNewsForm = $( '.ctct-section #subscribe' )[0];\n\t\t\tvar ctctEmailField = $( '.ctct-section #subscribe input[type=\"text\"]' )[0];\n\t\t\tvar subscribeEndpoint = event.target.action;\n\n\t\t\tif ( true === ctctEmailField.validity.valid ) {\n\t\t\t\t$( '<iframe>', {\n\t\t\t\t\t'src': subscribeEndpoint + '?' + $( ctctNewsForm ).serialize(),\n\t\t\t\t\t'height': 0,\n\t\t\t\t\t'width': 0,\n\t\t\t\t\t'style': 'display: none;'\n\t\t\t\t} ).appendTo( $ctctNewsWrapper );\n\t\t\t\t$( '#subbutton' ).val( 'Thanks for signing up' ).css( { 'background-color': 'rgb(1, 128, 0)' } );\n\t\t\t} else {\n\t\t\t\t$( '#subbutton' ).val( 'Error occurred' );\n\t\t\t}\n\t\t} );\n\t};\n\n\t$( app.init );\n\n} ( window, jQuery, window.CTCTNewsletter ) );\n","window.CTCT_OptIns = {};\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\t\tapp.$c = {\n\t\t\toptinNoConn: $( '#cmb2-metabox-ctct_1_optin_metabox #_ctct_opt_in_not_connected' ),\n\t\t\tlist: $( '#cmb2-metabox-ctct_0_list_metabox #_ctct_list' ),\n\t\t\ttitle: $( '#cmb2-metabox-ctct_1_optin_metabox .cmb2-id-email-optin-title' ),\n\t\t\toptin: $( '#cmb2-metabox-ctct_1_optin_metabox .cmb2-id--ctct-opt-in' ),\n\t\t\tinstruct: $( '#cmb2-metabox-ctct_1_optin_metabox .cmb2-id--ctct-opt-in-instructions' )\n\t\t};\n\t};\n\n\t/**\n\t * Attach callbacks to events.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tapp.bindEvents = () => {\n\n\t\t// Only fire show/hide if we have the normal checkbox.\n\t\tif ( app.$c.optinNoConn.length ) {\n\n\t\t\t// Fire once to get our loaded state set up.\n\t\t\tapp.toggleNoConnectionFields();\n\n\t\t\t// Bind to fire when needed.\n\t\t\tapp.$c.optinNoConn.change( () => {\n\t\t\t\tapp.toggleNoConnectionFields();\n\t\t\t} );\n\t\t}\n\n\t\t// Only fire show/hide if we have the normal checkbox.\n\t\tif ( app.$c.list.length ) {\n\n\t\t\t// Fire once to get our loaded state set up.\n\t\t\tapp.toggleConnectionFields();\n\n\t\t\t// Bind to fire when needed.\n\t\t\tapp.$c.list.change( () => {\n\t\t\t\tapp.toggleConnectionFields();\n\t\t\t} );\n\t\t}\n\t};\n\n\t/**\n\t * Toggle unnecessary, unconnected optin fields if we're not showing the opt-in.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tapp.toggleNoConnectionFields = () => {\n\n\t\tif ( app.$c.optinNoConn.prop( 'checked' ) ) {\n\t\t\tapp.$c.instruct.slideDown();\n\t\t} else {\n\t\t\tapp.$c.instruct.slideUp();\n\t\t}\n\t};\n\n\t/**\n\t * Toggle unnecessary, *connected* optin fields if we're not showing the opt-in.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tapp.toggleConnectionFields = () => {\n\n\t\t// If checked, show them, else hide it.\n\t\tif ( '' !== app.$c.list.val() ) {\n\t\t\tapp.$c.title.slideDown();\n\t\t\tapp.$c.optin.slideDown();\n\t\t\tapp.$c.instruct.slideDown();\n\t\t} else {\n\t\t\tapp.$c.title.slideUp();\n\t\t\tapp.$c.optin.slideUp();\n\t\t\tapp.$c.instruct.slideUp();\n\t\t}\n\t};\n\n\t$( app.init );\n\n} ( window, jQuery, window.CTCT_OptIns ) );\n"],"sourceRoot":""}
1
+ {"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./assets/js/ctct-plugin-admin/index.js","webpack:///./assets/js/ctct-plugin-admin/ajax.js","webpack:///./assets/js/ctct-plugin-admin/builder.js","webpack:///./assets/js/ctct-plugin-admin/forms.js","webpack:///./assets/js/ctct-plugin-admin/modal.js","webpack:///./assets/js/ctct-plugin-admin/newsletter.js","webpack:///./assets/js/ctct-plugin-admin/optins.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","window","CTCTAJAX","$","that","init","handleOptinAJAX","handleReviewAJAX","on","e","ctctOptinAjax","is","ajax","url","ajaxurl","data","dataType","success","response","document","getElementById","remove","error","x","console","log","toggleClass","attr","hide","$checkbox","ctctPrivacyAjax","privacy_agree","ctctAction","hasClass","ctctReviewAjax","resp","preventDefault","jQuery","CTCTBuilder","length","cache","bindEvents","selectBinds","modifyFields","removeClass","append","ctctTexts","move_up","move_down","$c","body","isLeaveWarningBound","bindLeaveWarning","leavewarning","unbindLeaveWarning","unbind","submit","prop","tinyMCE","removeDuplicateMappings","newRow","last","find","val","event","selectFields","textFields","each","this","click","firstOption","children","first","change","foundEmail","$fieldParent","$button","$required","$requiredRow","closest","$map","$mapName","text","$fieldTitle","$labelField","$descField","addClass","show","ctct_admin_placeholders","placeholder","default","usedMappings","dropdowns","$dropdowns","push","forEach","CTCTForms","disconnect","confirm","disconnectconfirm","CTCTModal","app","modalSelector","modalClose","textareaModal","textareaLink","deleteLogLink","type","action","currentTarget","dialog","resizable","height","width","modal","buttons","location","replace","CTCTNewsletter","submitNewsletter","$ctctNewsWrapper","ctctNewsForm","ctctEmailField","subscribeEndpoint","target","validity","valid","serialize","appendTo","css","CTCT_OptIns","optinNoConn","list","title","optin","instruct","toggleNoConnectionFields","toggleConnectionFields","slideDown","slideUp"],"mappings":"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","file":"ctct-plugin-admin.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"https://testing.test/wp-content/plugins/constant-contact-forms/assets/js/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","import './ajax';\nimport './builder';\nimport './forms';\nimport './modal';\nimport './newsletter';\nimport './optins';\n","window.CTCTAJAX = {};\n\n( function( window, $, that ) {\n\n\t/**\n\t * @constructor\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tthat.init = () => {\n\n\t\t// Trigger any field modifications we need to do.\n\t\tthat.handleOptinAJAX();\n\t\tthat.handleReviewAJAX();\n\t};\n\n\t/**\n\t * We need to manipulate our form builder a bit. We do this here.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tthat.handleOptinAJAX = () => {\n\n\t\t// eslint-disable-next-line no-unused-vars\n\t\t$( '#ctct_admin_notice_tracking_optin' ).on( 'click', ( e ) => {\n\n\t\t\tvar ctctOptinAjax = {\n\t\t\t\t'action': 'constant_contact_optin_ajax_handler',\n\t\t\t\t'optin': ( $( this ).is( ':checked' ) ) ? 'on' : 'off'\n\t\t\t};\n\n\t\t\t$.ajax( {\n\t\t\t\turl: window.ajaxurl,\n\t\t\t\tdata: ctctOptinAjax,\n\t\t\t\tdataType: 'json',\n\t\t\t\tsuccess: ( response ) => {\n\t\t\t\t\t$( document.getElementById( 'ctct-admin-notice-optin_admin_notice' ) ).remove();\n\t\t\t\t},\n\t\t\t\terror: ( x, t, m ) => {\n\t\t\t\t\tif ( window.console ) {\n\t\t\t\t\t\tconsole.log( [ t, m ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t$( '#ctct-privacy-modal' ).toggleClass( 'ctct-modal-open' );\n\t\t} );\n\n\t\t// Opens the privacy modal once clicking on the checkbox to opt in via the admin notice.\n\t\t// eslint-disable-next-line no-unused-vars\n\t\t$( '#ctct-connect-ga-optin a' ).on( 'click', ( e ) => {\n\t\t\tvar ctctOptinAjax = {\n\t\t\t\t'action': 'constant_contact_optin_ajax_handler',\n\t\t\t\t'optin': $( this ).attr( 'data-allow' )\n\t\t\t};\n\n\t\t\t$.ajax( {\n\t\t\t\turl: window.ajaxurl,\n\t\t\t\tdata: ctctOptinAjax,\n\t\t\t\tdataType: 'json',\n\t\t\t\tsuccess: ( response ) => { // eslint-disable-line no-unused-vars\n\t\t\t\t\t$( '.ctct-connected-opt-in' ).hide();\n\t\t\t\t},\n\t\t\t\terror: ( x, t, m ) => {\n\t\t\t\t\tif ( window.console ) {\n\t\t\t\t\t\tconsole.log( [ t, m ] ); // eslint-disable-line no-console\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\n\t\t// eslint-disable-next-line no-unused-vars\n\t\t$( '#_ctct_data_tracking' ).on( 'click', ( e ) => {\n\t\t\t$( '#ctct-privacy-modal' ).toggleClass( 'ctct-modal-open' );\n\t\t} );\n\n\t\t// Unchecks the value if they have closed the privacy modal without agreeing/disagreeing.\n\t\t// eslint-disable-next-line no-unused-vars\n\t\t$( '.ctct-modal-close' ).on( 'click', ( e ) => {\n\t\t\tvar $checkbox = $( '#_ctct_data_tracking' );\n\t\t\tif ( $checkbox.is( ':checked' ) ) {\n\t\t\t\t$checkbox.attr( 'checked', false );\n\t\t\t}\n\t\t} );\n\n\t\t// Handle the agreeing or disagreeing regarding privacy modal.\n\t\t// eslint-disable-next-line no-unused-vars\n\t\t$( '#ctct-modal-footer-privacy a' ).on( 'click', ( e ) => {\n\t\t\tvar ctctPrivacyAjax = {\n\t\t\t\t'action': 'constant_contact_privacy_ajax_handler',\n\t\t\t\t'privacy_agree': $( this ).attr( 'data-agree' )\n\t\t\t};\n\n\t\t\t$.ajax( {\n\t\t\t\turl: window.ajaxurl,\n\t\t\t\tdata: ctctPrivacyAjax,\n\t\t\t\tdataType: 'json',\n\t\t\t\tsuccess: ( response ) => { // eslint-disable-line no-unused-vars\n\t\t\t\t\t$( '#ctct-privacy-modal' ).toggleClass( 'ctct-modal-open' );\n\t\t\t\t\tif ( 'false' === ctctPrivacyAjax.privacy_agree ) {\n\t\t\t\t\t\tvar $checkbox = $( '#_ctct_data_tracking' );\n\t\t\t\t\t\tif ( $checkbox.is( ':checked' ) ) {\n\t\t\t\t\t\t\t$checkbox.attr( 'checked', false );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\terror: ( x, t, m ) => {\n\t\t\t\t\tif ( window.console ) {\n\t\t\t\t\t\tconsole.log( [ t, m ] ); // eslint-disable-line no-console\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t};\n\n\t// Handle saving the decision regarding the review prompt admin notice.\n\tthat.handleReviewAJAX = () => {\n\t\t$( '#ctct-admin-notice-review_request' ).on( 'click', 'a', ( e ) => {\n\n\t\t\tvar ctctAction = 'dismissed';\n\n\t\t\tif ( $( this ).hasClass( 'ctct-review' ) ) {\n\t\t\t\tctctAction = 'reviewed';\n\t\t\t}\n\n\t\t\tvar ctctReviewAjax = {\n\t\t\t\t'action': 'constant_contact_review_ajax_handler',\n\t\t\t\t'ctct-review-action': ctctAction\n\t\t\t};\n\n\t\t\t$.ajax( {\n\t\t\t\turl: window.ajaxurl,\n\t\t\t\tdata: ctctReviewAjax,\n\t\t\t\tdataType: 'json',\n\t\t\t\tsuccess: ( resp ) => {\n\t\t\t\t\tif ( window.console ) {\n\t\t\t\t\t\tconsole.log( resp ); // eslint-disable-line no-console\n\t\t\t\t\t}\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\t$( '#ctct-admin-notice-review_request' ).hide();\n\t\t\t\t},\n\t\t\t\terror: ( x, t, m ) => {\n\t\t\t\t\tif ( window.console ) {\n\t\t\t\t\t\tconsole.log( [ t, m ] ); // eslint-disable-line no-console\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t};\n\n\t$( that.init );\n\n} ( window, jQuery, window.CTCTAJAX ) );\n","window.CTCTBuilder = {};\n\n( function( window, $, that ) {\n\n\t/**\n\t * @constructor\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tthat.init = () => {\n\n\t\t// If we do actually have an email field set, then remove our error.\n\t\tif ( $( '#cmb2-metabox-ctct_2_fields_metabox option[value=\"email\"]:selected' ).length ) {\n\t\t\t$( '#ctct-no-email-error' ).remove();\n\t\t}\n\n\t\t// Cache it all.\n\t\tthat.cache();\n\n\t\t// Bind our events.\n\t\tthat.bindEvents();\n\n\t\t// Bind our select dropdown events.\n\t\tthat.selectBinds();\n\n\t\t// Trigger any field modifications we need to do.\n\t\tthat.modifyFields();\n\n\t\t// Make description non-draggable, so we don't run into weird cmb2 issues.\n\t\t$( '#ctct_0_description_metabox h2.hndle' ).removeClass( 'ui-sortable-handle, hndle' );\n\n\t\t// Inject our new labels for the up/down CMB2 buttons, so they can be properly localized.\n\t\t// Because we're using :after, we can't use .css() to do this, we need to inject a style tag.\n\t\t$( 'head' ).append( '<style> #cmb2-metabox-ctct_2_fields_metabox a.move-up::after { content: \"' + window.ctctTexts.move_up + '\" } #cmb2-metabox-ctct_2_fields_metabox a.move-down::after { content: \"' + window.ctctTexts.move_down + '\" }</style>' );\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\tthat.cache = () => {\n\n\t\tthat.$c = {\n\t\t\twindow: $( window ),\n\t\t\tbody: $( 'body' )\n\t\t};\n\n\t\tthat.isLeaveWarningBound = false;\n\t};\n\n\t// Triggers our leave warning if we modify things in the form.\n\tthat.bindLeaveWarning = () => {\n\n\t\t// Don't double-bind it.\n\t\tif ( ! that.isLeaveWarningBound ) {\n\n\t\t\t// Bind our error that displays before leaving page.\n\t\t\t$( window ).bind( 'beforeunload', () => {\n\t\t\t\treturn window.ctctTexts.leavewarning;\n\t\t\t} );\n\n\t\t\t// Save our state.\n\t\t\tthat.isLeaveWarningBound = true;\n\t\t}\n\t};\n\n\t/**\n\t * Removes our binding of our leave warning.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tthat.unbindLeaveWarning = () => {\n\t\t$( window ).unbind( 'beforeunload' );\n\t};\n\n\t/**\n\t * Attach callbacks to events.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tthat.bindEvents = () => {\n\n\t\t$( '#post' ).submit( () => {\n\n\t\t\t// Make sure our email dropdown reverts from disbled, as CMB2 doesn't save those values.\n\t\t\t$( '.ctct-email-disabled' ).removeClass( 'disabled' ).prop( 'disabled', false );\n\n\t\t\tthat.unbindLeaveWarning();\n\t\t} );\n\n\t\t$( '.cmb2-wrap input, .cmb2-wrap textarea' ).on( 'input', () => {\n\t\t\tif ( 'undefined' !== typeof( tinyMCE ) ) {\n\t\t\t\tthat.bindLeaveWarning();\n\t\t\t}\n\t\t} );\n\n\t\t// Disable email options on row change trigger.\n\t\t$( document ).on( 'cmb2_shift_rows_complete', () => {\n\t\t\tthat.modifyFields();\n\t\t\tthat.bindLeaveWarning();\n\t\t\tthat.removeDuplicateMappings();\n\t\t} );\n\n\t\t// If we get a row added, then do our stuff.\n\t\t$( document ).on( 'cmb2_add_row', ( newRow ) => { // eslint-disable-line no-unused-vars\n\n\t\t\t// Automatically set new rows to be 'custom' field type.\n\t\t\t$( '#custom_fields_group_repeat .postbox' ).last().find( '.map select' ).val( 'none' );\n\n\t\t\tthat.modifyFields();\n\t\t\tthat.selectBinds();\n\t\t\tthat.removeDuplicateMappings();\n\t\t} );\n\n\t\tthat.removeDuplicateMappings();\n\n\t\t$( '#ctct-reset-css' ).on( 'click', ( event ) => {\n\t\t\tevent.preventDefault();\n\n\t\t\tvar selectFields = [\n\t\t\t\t'#_ctct_form_description_font_size',\n\t\t\t\t'#_ctct_form_submit_button_font_size',\n\t\t\t\t'#_ctct_form_label_placement'\n\t\t\t];\n\n\t\t\tvar textFields = [\n\t\t\t\t'#_ctct_form_padding_top',\n\t\t\t\t'#_ctct_form_padding_bottom',\n\t\t\t\t'#_ctct_form_padding_left',\n\t\t\t\t'#_ctct_form_padding_right',\n\t\t\t\t'#_ctct_input_custom_classes'\n\t\t\t];\n\n\t\t\t// Reset color pickers.\n\t\t\t$( '.wp-picker-clear' ).each( function() {\n\t\t\t\t$( this ).click();\n\t\t\t} );\n\n\t\t\tfor ( var i = selectFields.length; i--; ) {\n\t\t\t\tvar firstOption = $( selectFields[i] ).children( 'option' ).first();\n\t\t\t\t$( selectFields[i] ).val( firstOption.val() );\n\t\t\t}\n\n\t\t\tfor ( var i = textFields.length; i--; ) {\n\t\t\t\t$( textFields[i] ).val( '' );\n\t\t\t}\n\t\t} );\n\t};\n\n\t/**\n\t * When .cmb2_select <selects> get changed, do some actions.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tthat.selectBinds = () => {\n\n\t\t// For each fields select.\n\t\t$( '#cmb2-metabox-ctct_2_fields_metabox .cmb2_select' ).change( () => {\n\n\t\t\t// Modify our fields.\n\t\t\tthat.modifyFields();\n\n\t\t\t// Don't allow duplicate mappings in form.\n\t\t\tthat.removeDuplicateMappings();\n\n\t\t\t// Bind our leave warning.\n\t\t\tthat.bindLeaveWarning();\n\t\t} );\n\t};\n\n\t/**\n\t * We need to manipulate our form builder a bit. We do this here.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tthat.modifyFields = () => {\n\n\t\t// Set that we haven't found an email.\n\t\tvar foundEmail = false;\n\n\t\t// Loop through all fields to modify them.\n\t\t$( '#cmb2-metabox-ctct_2_fields_metabox #custom_fields_group_repeat .cmb-repeatable-grouping' ).each( function( key, value ) {\n\n\t\t\t// Set some of our helper paramaters.\n\t\t\tvar $fieldParent = $( this ).find( '.cmb-field-list' );\n\t\t\tvar $button = $( $fieldParent ).find( '.cmb-remove-group-row' );\n\t\t\tvar $required = $( $fieldParent ).find( '.required input[type=checkbox]' );\n\t\t\tvar $requiredRow = $required.closest( '.cmb-row' );\n\t\t\tvar $map = $( $fieldParent ).find( '.map select option:selected' );\n\t\t\tvar $mapName = $map.text();\n\t\t\tvar $fieldTitle = $( this ).find( 'h3' );\n\t\t\tvar $labelField = $( this ).find( 'input[name*=\"_ctct_field_label\"]' );\n\t\t\tvar $descField = $( this ).find( 'input[name*=\"_ctct_field_desc\"]' );\n\n\t\t\t// Set our field row to be the name of the selected option.\n\t\t\t$fieldTitle.text( $mapName );\n\n\t\t\t// If we have a blank field label, then use the name of the field to fill it in.\n\t\t\tif ( 0 === $labelField.val().length ) {\n\t\t\t\t$labelField.val( $mapName ).addClass( 'ctct-label-filled' );\n\t\t\t} else {\n\t\t\t\t$labelField.addClass( 'ctct-label-filled' );\n\t\t\t}\n\n\t\t\t// If we haven't yet found an email field, and this is our email field.\n\t\t\tif ( ! foundEmail && ( 'email' === $( $map ).val() ) ) {\n\n\t\t\t\t// Set that we found an email field.\n\t\t\t\tfoundEmail = true;\n\n\t\t\t\t// Make it required.\n\t\t\t\t$required.prop( 'checked', true );\n\n\t\t\t\t// Set it to be 'disabled'.\n\t\t\t\t$( value ).find( 'select' ).addClass( 'disabled ctct-email-disabled' ).prop( 'disabled', true );\n\n\t\t\t\t// Hide the required row.\n\t\t\t\t$requiredRow.hide();\n\n\t\t\t\t// Hide the remove row button.\n\t\t\t\t$button.hide();\n\n\t\t\t} else {\n\n\t\t\t\t// Verify its not disabled.\n\t\t\t\t$( value ).find( 'select' ).removeClass( 'disabled ctct-email-disabled' ).prop( 'disabled', false );\n\n\t\t\t\t// If we're not an email field, reshow the required field.\n\t\t\t\t$requiredRow.show();\n\n\t\t\t\t// and the remove button.\n\t\t\t\t$button.show();\n\t\t\t}\n\n\t\t\t// Set the placeholder text if there's something to set.\n\t\t\tif ( window.ctct_admin_placeholders ) {\n\t\t\t\tvar placeholder = window.ctct_admin_placeholders[ $( value ).find( 'select' ).val() ];\n\n\t\t\t\t// If we have a valid placeholder, display it or try the fallback.\n\t\t\t\tif ( placeholder && placeholder.length && $descField.length ) {\n\t\t\t\t\t$descField.attr( 'placeholder', 'Example: ' + placeholder );\n\t\t\t\t} else if ( window.ctct_admin_placeholders.default ) {\n\t\t\t\t\t$descField.attr( 'placeholder', window.ctct_admin_placeholders.default );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t};\n\n\t/**\n\t * Go through all dropdowns, and remove used options.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tthat.removeDuplicateMappings = () => {\n\n\t\tvar usedMappings = [];\n\t\tvar dropdowns = '#cmb2-metabox-ctct_2_fields_metabox #custom_fields_group_repeat .cmb-repeatable-grouping select';\n\t\tvar $dropdowns = $( dropdowns );\n\n\t\t// For each dropdown, build up our array of used values.\n\t\t$dropdowns.each( function( key, value ) {\n\t\t\tusedMappings.push( $( value ).val() );\n\t\t} );\n\n\t\t// Re-show all the children options we may have hidden.\n\t\t$dropdowns.children().show();\n\n\t\t// For each of our mappings that we already have, remove them from all selects.\n\t\tusedMappings.forEach( function( value ) {\n\n\t\t\t// But only do it if the value isn't one of our custom ones.\n\t\t\tif ( ( 'custom_text_area' !== value ) && ( 'custom' !== value ) ) {\n\n\t\t\t\t// Remove all options from our dropdowns with the value.\n\t\t\t\t$( dropdowns + ' option[value=' + value + ']:not( :selected )' ).hide();\n\t\t\t}\n\t\t} );\n\t};\n\n\t$( that.init );\n\n} ( window, jQuery, window.CTCTBuilder ) );\n","window.CTCTForms = {};\n\n( function( window, $, that ) {\n\n\t/**\n\t * @constructor\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tthat.init = () => {\n\t\tthat.cache();\n\t\tthat.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\tthat.cache = () => {\n\t\tthat.$c = {\n\t\t\twindow: $( window ),\n\t\t\tbody: $( 'body' ),\n\t\t\tdisconnect: '.ctct-disconnect'\n\t\t};\n\t};\n\n\t/**\n\t * Attach callbacks to events.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tthat.bindEvents = () => {\n\n\t\t$( that.$c.disconnect ).on( 'click', ( e ) => { // eslint-disable-line no-unused-vars\n\t\t\tconfirm( window.ctctTexts.disconnectconfirm );\n\t\t} );\n\t};\n\n\t$( that.init );\n\n} ( window, jQuery, window.CTCTForms ) );\n","window.CTCTModal = {};\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\t\tapp.$c = {\n\t\t\twindow: $( window ),\n\t\t\tmodalSelector: $( '.ctct-modal' ),\n\t\t\tmodalClose: $( '.ctct-modal-close' ),\n\t\t\ttextareaModal: $( '#ctct-custom-textarea-modal' ),\n\t\t\ttextareaLink: $( '#ctct-open-textarea-info' ),\n\t\t\tdeleteLogLink: $( '#deletelog' )\n\t\t};\n\t};\n\n\t/**\n\t * Attach callbacks to events.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tapp.bindEvents = () => {\n\n\t\tapp.$c.modalClose.on( 'click', () => {\n\n\t\t\tapp.$c.modalSelector.removeClass( 'ctct-modal-open' );\n\n\t\t\tif ( app.$c.modalSelector.hasClass( 'ctct-custom-textarea-modal' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$.ajax( {\n\t\t\t\ttype: 'post',\n\t\t\t\tdataType: 'json',\n\t\t\t\turl: window.ajaxurl,\n\t\t\t\tdata: {\n\t\t\t\t\taction: 'ctct_dismiss_first_modal',\n\t\t\t\t\t'ctct_is_dismissed': 'true'\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\n\t\tapp.$c.textareaLink.on( 'click', () => {\n\t\t\tapp.$c.textareaModal.addClass( 'ctct-modal-open' );\n\t\t} );\n\n\t\tapp.$c.deleteLogLink.on( 'click', ( event ) => {\n\t\t\tevent.preventDefault();\n\n\t\t\t// Get the link that was clicked on so we can redirect to it if the user confirms.\n\t\t\tvar deleteLogLink = $( event.currentTarget ).attr( 'href' );\n\n\t\t\t$( '#confirmdelete' ).dialog( {\n\t\t\t\tresizable: false,\n\t\t\t\theight: 'auto',\n\t\t\t\twidth: 400,\n\t\t\t\tmodal: true,\n\t\t\t\tbuttons: {\n\t\t\t\t\t'Yes': () => {\n\n\t\t\t\t\t\t// If the user confirms the action, redirect them to the deletion page.\n\t\t\t\t\t\twindow.location.replace( deleteLogLink );\n\t\t\t\t\t},\n\t\t\t\t\t'Cancel': () => {\n\t\t\t\t\t\t$( '#confirmdelete' ).closest( '.ui-dialog-content' ).dialog( 'close' );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t};\n\n\t$( app.init );\n\n} ( window, jQuery, window.CTCTModal ) );\n","window.CTCTNewsletter = {};\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.submitNewsletter();\n\t};\n\n\t/**\n\t * Handle newsletter signups on the \"Connect\" and \"About\" pages.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tapp.submitNewsletter = () => {\n\n\t\t// Connect page.\n\t\t$( '.ctct-body #subscribe' ).on( 'submit', ( event ) => {\n\t\t\tevent.preventDefault();\n\n\t\t\tvar $ctctNewsWrapper = $( '#subscribe .ctct-call-to-action' );\n\t\t\tvar ctctNewsForm = $( '.ctct-body #subscribe' )[0];\n\t\t\tvar ctctEmailField = $( '.ctct-call-to-action input[type=\"text\"]' )[0];\n\t\t\tvar subscribeEndpoint = event.target.action;\n\n\t\t\tif ( true === ctctEmailField.validity.valid ) {\n\t\t\t\t$( '<iframe>', {\n\t\t\t\t\t'src': subscribeEndpoint + '?' + $( ctctNewsForm ).serialize(),\n\t\t\t\t\t'height': 0,\n\t\t\t\t\t'width': 0,\n\t\t\t\t\t'style': 'display: none;'\n\t\t\t\t} ).appendTo( $ctctNewsWrapper );\n\n\t\t\t\t$( '#subbutton' ).val( 'Thanks for signing up' ).css( { 'background-color': 'rgb(1, 128, 0)', 'color': 'rgb(255,255,255)' } );\n\t\t\t\t$( '#subscribe .ctct-call-to-action-text' ).css( { 'width': '70%' } );\n\t\t\t} else {\n\t\t\t\t$( '#subbutton' ).val( 'Error occurred' );\n\t\t\t}\n\t\t} );\n\n\t\t// About page.\n\t\t$( '.ctct-section #subscribe' ).on( 'submit', ( event ) => {\n\t\t\tevent.preventDefault();\n\n\t\t\tvar $ctctNewsWrapper = $( '.section-marketing-tips' );\n\t\t\tvar ctctNewsForm = $( '.ctct-section #subscribe' )[0];\n\t\t\tvar ctctEmailField = $( '.ctct-section #subscribe input[type=\"text\"]' )[0];\n\t\t\tvar subscribeEndpoint = event.target.action;\n\n\t\t\tif ( true === ctctEmailField.validity.valid ) {\n\t\t\t\t$( '<iframe>', {\n\t\t\t\t\t'src': subscribeEndpoint + '?' + $( ctctNewsForm ).serialize(),\n\t\t\t\t\t'height': 0,\n\t\t\t\t\t'width': 0,\n\t\t\t\t\t'style': 'display: none;'\n\t\t\t\t} ).appendTo( $ctctNewsWrapper );\n\t\t\t\t$( '#subbutton' ).val( 'Thanks for signing up' ).css( { 'background-color': 'rgb(1, 128, 0)' } );\n\t\t\t} else {\n\t\t\t\t$( '#subbutton' ).val( 'Error occurred' );\n\t\t\t}\n\t\t} );\n\t};\n\n\t$( app.init );\n\n} ( window, jQuery, window.CTCTNewsletter ) );\n","window.CTCT_OptIns = {};\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\t\tapp.$c = {\n\t\t\toptinNoConn: $( '#cmb2-metabox-ctct_1_optin_metabox #_ctct_opt_in_not_connected' ),\n\t\t\tlist: $( '#cmb2-metabox-ctct_0_list_metabox [name=\"_ctct_list[]\"]' ),\n\t\t\ttitle: $( '#cmb2-metabox-ctct_1_optin_metabox .cmb2-id-email-optin-title' ),\n\t\t\toptin: $( '#cmb2-metabox-ctct_1_optin_metabox .cmb2-id--ctct-opt-in' ),\n\t\t\tinstruct: $( '#cmb2-metabox-ctct_1_optin_metabox .cmb2-id--ctct-opt-in-instructions' )\n\t\t};\n\t};\n\n\t/**\n\t * Attach callbacks to events.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tapp.bindEvents = () => {\n\n\t\t// Only fire show/hide if we have the normal checkbox.\n\t\tif ( app.$c.optinNoConn.length ) {\n\n\t\t\t// Fire once to get our loaded state set up.\n\t\t\tapp.toggleNoConnectionFields();\n\n\t\t\t// Bind to fire when needed.\n\t\t\tapp.$c.optinNoConn.change( () => {\n\t\t\t\tapp.toggleNoConnectionFields();\n\t\t\t} );\n\t\t}\n\n\t\t// Only fire show/hide if we have the normal checkbox.\n\t\tif ( app.$c.list.length ) {\n\n\t\t\t// Fire once to get our loaded state set up.\n\t\t\tapp.toggleConnectionFields();\n\n\t\t\t// Bind to fire when needed.\n\t\t\tapp.$c.list.change( () => {\n\t\t\t\tapp.toggleConnectionFields();\n\t\t\t} );\n\t\t}\n\t};\n\n\t/**\n\t * Toggle unnecessary, unconnected optin fields if we're not showing the opt-in.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tapp.toggleNoConnectionFields = () => {\n\n\t\tif ( app.$c.optinNoConn.prop( 'checked' ) ) {\n\t\t\tapp.$c.instruct.slideDown();\n\t\t} else {\n\t\t\tapp.$c.instruct.slideUp();\n\t\t}\n\t};\n\n\t/**\n\t * Toggle unnecessary, *connected* optin fields if we're not showing the opt-in.\n\t *\n\t * @author Constant Contact\n\t * @since 1.0.0\n\t */\n\tapp.toggleConnectionFields = () => {\n\n\t\t// If checked, show them, else hide it.\n\t\tif ( '' !== app.$c.list.val() ) {\n\t\t\tapp.$c.title.slideDown();\n\t\t\tapp.$c.optin.slideDown();\n\t\t\tapp.$c.instruct.slideDown();\n\t\t} else {\n\t\t\tapp.$c.title.slideUp();\n\t\t\tapp.$c.optin.slideUp();\n\t\t\tapp.$c.instruct.slideUp();\n\t\t}\n\t};\n\n\t$( app.init );\n\n} ( window, jQuery, window.CTCT_OptIns ) );\n"],"sourceRoot":""}
assets/js/ctct-plugin-admin/optins.js CHANGED
@@ -22,7 +22,7 @@ window.CTCT_OptIns = {};
22
  app.cache = () => {
23
  app.$c = {
24
  optinNoConn: $( '#cmb2-metabox-ctct_1_optin_metabox #_ctct_opt_in_not_connected' ),
25
- list: $( '#cmb2-metabox-ctct_0_list_metabox #_ctct_list' ),
26
  title: $( '#cmb2-metabox-ctct_1_optin_metabox .cmb2-id-email-optin-title' ),
27
  optin: $( '#cmb2-metabox-ctct_1_optin_metabox .cmb2-id--ctct-opt-in' ),
28
  instruct: $( '#cmb2-metabox-ctct_1_optin_metabox .cmb2-id--ctct-opt-in-instructions' )
22
  app.cache = () => {
23
  app.$c = {
24
  optinNoConn: $( '#cmb2-metabox-ctct_1_optin_metabox #_ctct_opt_in_not_connected' ),
25
+ list: $( '#cmb2-metabox-ctct_0_list_metabox [name="_ctct_list[]"]' ),
26
  title: $( '#cmb2-metabox-ctct_1_optin_metabox .cmb2-id-email-optin-title' ),
27
  optin: $( '#cmb2-metabox-ctct_1_optin_metabox .cmb2-id--ctct-opt-in' ),
28
  instruct: $( '#cmb2-metabox-ctct_1_optin_metabox .cmb2-id--ctct-opt-in-instructions' )
assets/sass/_admin-forms.scss CHANGED
@@ -230,6 +230,23 @@ body.post-type-ctct_forms #titlediv #title {
230
  }
231
  }
232
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
233
  //--------------------------------------------------------------
234
  // TinyMCE Tweaks
235
  //--------------------------------------------------------------
230
  }
231
  }
232
 
233
+ .cmb2-id--ctct-list {
234
+
235
+ .cmb2-list {
236
+ background:
237
+ linear-gradient($color-white 33%, transparent),
238
+ linear-gradient(transparent, $color-white 66%) 0 100%,
239
+ radial-gradient(farthest-side at 50% 0, $color-black-translucent, transparent),
240
+ radial-gradient(farthest-side at 50% 100%, $color-black-translucent, transparent) 0 100%;
241
+ background-attachment: local, local, scroll, scroll;
242
+ background-color: $color-white;
243
+ background-repeat: no-repeat;
244
+ background-size: 100% 30px, 100% 30px, 100% 10px, 100% 10px;
245
+ max-height: 10rem;
246
+ overflow-y: auto;
247
+ }
248
+ }
249
+
250
  //--------------------------------------------------------------
251
  // TinyMCE Tweaks
252
  //--------------------------------------------------------------
assets/sass/_forms.scss CHANGED
@@ -40,4 +40,17 @@
40
  .ctct-submit {
41
  cursor: pointer;
42
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
43
  }
40
  .ctct-submit {
41
  cursor: pointer;
42
  }
43
+
44
+ .ctct-form-field-checkbox {
45
+
46
+ fieldset {
47
+ border: none;
48
+ padding: 0;
49
+
50
+ legend {
51
+ font-weight: normal;
52
+ padding: 0;
53
+ }
54
+ }
55
+ }
56
  }
assets/sass/_inputs.scss CHANGED
@@ -64,6 +64,10 @@
64
  display: inline-block;
65
  margin-right: 5%;
66
  width: 75%;
 
 
 
 
67
  }
68
 
69
  span.ctct-label-right {
64
  display: inline-block;
65
  margin-right: 5%;
66
  width: 75%;
67
+
68
+ &[type="checkbox"] {
69
+ width: auto;
70
+ }
71
  }
72
 
73
  span.ctct-label-right {
assets/sass/_variables.scss CHANGED
@@ -15,6 +15,7 @@ $color-gray: #aaa;
15
  $color-silver: #ddd;
16
  $color-light-gray: #e9e9e9;
17
  $color-white: #fff;
 
18
 
19
  // Theming
20
  $color-error: $color-red;
15
  $color-silver: #ddd;
16
  $color-light-gray: #e9e9e9;
17
  $color-white: #fff;
18
+ $color-black-translucent: rgba(0,0,0, 0.5);
19
 
20
  // Theming
21
  $color-error: $color-red;
constant-contact-forms.php CHANGED
@@ -12,7 +12,7 @@
12
  * Plugin Name: Constant Contact Forms for WordPress
13
  * Plugin URI: https://www.constantcontact.com
14
  * Description: Be a better marketer. All it takes is Constant Contact email marketing.
15
- * Version: 1.8.8
16
  * Author: Constant Contact
17
  * Author URI: https://www.constantcontact.com/index?pn=miwordpress
18
  * License: GPLv3
@@ -72,7 +72,7 @@ class Constant_Contact {
72
  * @since 1.0.0
73
  * @var string
74
  */
75
- const VERSION = '1.8.8';
76
 
77
  /**
78
  * URL of plugin directory.
@@ -366,6 +366,8 @@ class Constant_Contact {
366
  * Sets up our plugin.
367
  *
368
  * @since 1.0.0
 
 
369
  */
370
  protected function __construct() {
371
 
@@ -373,9 +375,9 @@ class Constant_Contact {
373
  $this->plugin_name = esc_html__( 'Constant Contact', 'constant-contact-forms' );
374
 
375
  // Set up some helper properties.
376
- $this->basename = plugin_basename( __FILE__ );
377
- $this->url = plugin_dir_url( __FILE__ );
378
- $this->path = plugin_dir_path( __FILE__ );
379
 
380
  if ( ! $this->meets_php_requirements() ) {
381
  add_action( 'admin_notices', array( $this, 'minimum_version' ) );
@@ -394,6 +396,9 @@ class Constant_Contact {
394
 
395
  // Include compatibility fixes to address conflicts with other plug-ins.
396
  self::include_file( 'compatibility', false );
 
 
 
397
  }
398
 
399
  /**
@@ -449,6 +454,8 @@ class Constant_Contact {
449
  * Add hooks and filters.
450
  *
451
  * @since 1.0.0
 
 
452
  */
453
  public function hooks() {
454
  if ( ! $this->meets_php_requirements() ) {
@@ -462,11 +469,6 @@ class Constant_Contact {
462
 
463
  $this->load_libs();
464
 
465
- // Our vendor files will do a check for ISSSL, so we want to set it to be that. See Guzzle for more info and usage of this.
466
- if ( is_ssl() || ! defined( 'ISSSL' ) ) {
467
- define( 'ISSSL', true );
468
- }
469
-
470
  add_filter( 'widget_text', 'do_shortcode' );
471
  add_action( 'admin_enqueue_scripts', [ $this, 'register_admin_assets' ], 1 );
472
  add_action( 'wp_enqueue_scripts', [ $this, 'register_front_assets' ], 1 );
12
  * Plugin Name: Constant Contact Forms for WordPress
13
  * Plugin URI: https://www.constantcontact.com
14
  * Description: Be a better marketer. All it takes is Constant Contact email marketing.
15
+ * Version: 1.9.0
16
  * Author: Constant Contact
17
  * Author URI: https://www.constantcontact.com/index?pn=miwordpress
18
  * License: GPLv3
72
  * @since 1.0.0
73
  * @var string
74
  */
75
+ const VERSION = '1.9.0';
76
 
77
  /**
78
  * URL of plugin directory.
366
  * Sets up our plugin.
367
  *
368
  * @since 1.0.0
369
+ *
370
+ * @return void
371
  */
372
  protected function __construct() {
373
 
375
  $this->plugin_name = esc_html__( 'Constant Contact', 'constant-contact-forms' );
376
 
377
  // Set up some helper properties.
378
+ $this->basename = plugin_basename( __FILE__ );
379
+ $this->url = plugin_dir_url( __FILE__ );
380
+ $this->path = plugin_dir_path( __FILE__ );
381
 
382
  if ( ! $this->meets_php_requirements() ) {
383
  add_action( 'admin_notices', array( $this, 'minimum_version' ) );
396
 
397
  // Include compatibility fixes to address conflicts with other plug-ins.
398
  self::include_file( 'compatibility', false );
399
+
400
+ // Include deprecated functions.
401
+ self::include_file( 'deprecated', false );
402
  }
403
 
404
  /**
454
  * Add hooks and filters.
455
  *
456
  * @since 1.0.0
457
+ *
458
+ * @return void
459
  */
460
  public function hooks() {
461
  if ( ! $this->meets_php_requirements() ) {
469
 
470
  $this->load_libs();
471
 
 
 
 
 
 
472
  add_filter( 'widget_text', 'do_shortcode' );
473
  add_action( 'admin_enqueue_scripts', [ $this, 'register_admin_assets' ], 1 );
474
  add_action( 'wp_enqueue_scripts', [ $this, 'register_front_assets' ], 1 );
includes/class-admin.php CHANGED
@@ -284,7 +284,8 @@ class ConstantContact_Admin {
284
  return;
285
  }
286
 
287
- $table_list_id = get_post_meta( $post_id, '_ctct_list', true );
 
288
 
289
  switch ( $column ) {
290
  case 'shortcodes':
@@ -294,16 +295,26 @@ class ConstantContact_Admin {
294
  echo wp_kses_post( wpautop( get_post_meta( $post_id, '_ctct_description', true ) ) );
295
  break;
296
  case 'ctct_list':
297
- $list = $this->get_associated_list_by_id( $table_list_id );
298
- if ( ! empty( $list ) ) {
299
- printf(
300
- '<a href="%s">%s</a>',
301
- esc_url( get_edit_post_link( $list->ID ) ),
302
- esc_html( get_the_title( $list->ID ) )
303
- );
304
- } else {
 
 
 
 
 
 
 
305
  esc_html_e( 'No associated list', 'constant-contact-forms' );
 
306
  }
 
 
307
  break;
308
  }
309
  }
@@ -440,7 +451,7 @@ class ConstantContact_Admin {
440
 
441
  global $pagenow;
442
 
443
- $debug = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG === true );
444
  $suffix = ( true === $debug ) ? '' : '.min';
445
 
446
  wp_register_script(
284
  return;
285
  }
286
 
287
+ $table_list_ids = get_post_meta( $post_id, '_ctct_list', true );
288
+ $table_list_ids = is_array( $table_list_ids ) ? $table_list_ids : [ $table_list_ids ];
289
 
290
  switch ( $column ) {
291
  case 'shortcodes':
295
  echo wp_kses_post( wpautop( get_post_meta( $post_id, '_ctct_description', true ) ) );
296
  break;
297
  case 'ctct_list':
298
+ $list_html = [];
299
+
300
+ foreach ( $table_list_ids as $list_id ) {
301
+ $list = $this->get_associated_list_by_id( $list_id );
302
+
303
+ if ( ! empty( $list ) ) {
304
+ $list_html[] = sprintf(
305
+ '<a href="%s">%s</a>',
306
+ esc_url( get_edit_post_link( $list->ID ) ),
307
+ esc_html( get_the_title( $list->ID ) )
308
+ );
309
+ }
310
+ }
311
+
312
+ if ( empty( $list_html ) ) {
313
  esc_html_e( 'No associated list', 'constant-contact-forms' );
314
+ break;
315
  }
316
+
317
+ echo wp_kses_post( implode( ', ', $list_html ) );
318
  break;
319
  }
320
  }
451
 
452
  global $pagenow;
453
 
454
+ $debug = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG === true );
455
  $suffix = ( true === $debug ) ? '' : '.min';
456
 
457
  wp_register_script(
includes/class-api.php CHANGED
@@ -128,8 +128,8 @@ class ConstantContact_API {
128
  }
129
  } catch ( CtctException $ex ) {
130
  add_filter( 'constant_contact_force_logging', '__return_true' );
131
- $extra = constant_contact_location_and_line( __METHOD__, __LINE__ );
132
- $errors = $ex->getErrors();
133
  $our_errors[] = $extra . ' - ' . $errors[0]->error_key . ' - ' . $errors[0]->error_message;
134
  $this->log_errors( $our_errors );
135
  constant_contact_set_has_exceptions();
@@ -173,8 +173,8 @@ class ConstantContact_API {
173
 
174
  } catch ( CtctException $ex ) {
175
  add_filter( 'constant_contact_force_logging', '__return_true' );
176
- $extra = constant_contact_location_and_line( __METHOD__, __LINE__ );
177
- $errors = $ex->getErrors();
178
  $our_errors[] = $extra . ' - ' . $errors[0]->error_key . ' - ' . $errors[0]->error_message;
179
  $this->log_errors( $our_errors );
180
  constant_contact_set_has_exceptions();
@@ -226,14 +226,14 @@ class ConstantContact_API {
226
  }
227
  } catch ( CtctException $ex ) {
228
  add_filter( 'constant_contact_force_logging', '__return_true' );
229
- $extra = constant_contact_location_and_line( __METHOD__, __LINE__ );
230
- $errors = $ex->getErrors();
231
  $our_errors[] = $extra . ' - ' . $errors[0]->error_key . ' - ' . $errors[0]->error_message;
232
  $this->log_errors( $our_errors );
233
  constant_contact_set_has_exceptions();
234
  } catch ( Exception $ex ) {
235
- $error = new stdClass();
236
- $error->error_key = get_class( $ex );
237
  $error->error_message = $ex->getMessage();
238
 
239
  add_filter( 'constant_contact_force_logging', '__return_true' );
@@ -277,8 +277,8 @@ class ConstantContact_API {
277
  return $list;
278
  } catch ( CtctException $ex ) {
279
  add_filter( 'constant_contact_force_logging', '__return_true' );
280
- $extra = constant_contact_location_and_line( __METHOD__, __LINE__ );
281
- $errors = $ex->getErrors();
282
  $our_errors[] = $extra . ' - ' . $errors[0]->error_key . ' - ' . $errors[0]->error_message;
283
  $this->log_errors( $our_errors );
284
  constant_contact_set_has_exceptions();
@@ -320,8 +320,8 @@ class ConstantContact_API {
320
  $list = $this->cc()->listService->getList( $this->get_api_token(), esc_attr( $new_list['id'] ) );
321
  } catch ( CtctException $ex ) {
322
  add_filter( 'constant_contact_force_logging', '__return_true' );
323
- $extra = constant_contact_location_and_line( __METHOD__, __LINE__ );
324
- $errors = $ex->getErrors();
325
  $our_errors[] = $extra . ' - ' . $errors[0]->error_key . ' - ' . $errors[0]->error_message;
326
  $this->log_errors( $our_errors );
327
  constant_contact_set_has_exceptions();
@@ -361,8 +361,8 @@ class ConstantContact_API {
361
 
362
  } catch ( CtctException $ex ) {
363
  add_filter( 'constant_contact_force_logging', '__return_true' );
364
- $extra = constant_contact_location_and_line( __METHOD__, __LINE__ );
365
- $errors = $ex->getErrors();
366
  $our_errors[] = $extra . ' - ' . $errors[0]->error_key . ' - ' . $errors[0]->error_message;
367
  $this->log_errors( $our_errors );
368
  constant_contact_set_has_exceptions();
@@ -414,8 +414,8 @@ class ConstantContact_API {
414
 
415
  } catch ( CtctException $ex ) {
416
  add_filter( 'constant_contact_force_logging', '__return_true' );
417
- $extra = constant_contact_location_and_line( __METHOD__, __LINE__ );
418
- $errors = $ex->getErrors();
419
  $our_errors[] = $extra . ' - ' . $errors[0]->error_key . ' - ' . $errors[0]->error_message;
420
  $this->log_errors( $our_errors );
421
  constant_contact_set_has_exceptions();
@@ -455,8 +455,8 @@ class ConstantContact_API {
455
  $list = $this->cc()->listService->deleteList( $this->get_api_token(), $updated_list['id'] );
456
  } catch ( CtctException $ex ) {
457
  add_filter( 'constant_contact_force_logging', '__return_true' );
458
- $extra = constant_contact_location_and_line( __METHOD__, __LINE__ );
459
- $errors = $ex->getErrors();
460
  $our_errors[] = $extra . ' - ' . $errors[0]->error_key . ' - ' . $errors[0]->error_message;
461
  $this->log_errors( $our_errors );
462
  constant_contact_set_has_exceptions();
@@ -482,7 +482,7 @@ class ConstantContact_API {
482
  * @since 1.0.0
483
  * @since 1.3.0 Added $form_id parameter.
484
  *
485
- * @throws Exception
486
  *
487
  * @param array $new_contact New contact data.
488
  * @param int $form_id ID of the form being processed.
@@ -502,7 +502,7 @@ class ConstantContact_API {
502
  $email = sanitize_email( $new_contact['email'] );
503
 
504
  // Set our list data. If we didn't get passed a list and got this far, just generate a random ID.
505
- $list = isset( $new_contact['list'] ) ? esc_attr( $new_contact['list'] ) : 'cc_' . wp_generate_password( 15, false );
506
 
507
  $return_contact = false;
508
 
@@ -524,8 +524,8 @@ class ConstantContact_API {
524
  }
525
  } catch ( CtctException $ex ) {
526
  add_filter( 'constant_contact_force_logging', '__return_true' );
527
- $extra = constant_contact_location_and_line( __METHOD__, __LINE__ );
528
- $errors = $ex->getErrors();
529
  $our_errors[] = $extra . ' - ' . $errors[0]->error_key . ' - ' . $errors[0]->error_message;
530
  $this->log_errors( $our_errors );
531
  if ( 400 !== $ex->getCode() || false !== strpos( 'Bad Request', $ex->getMessage() ) ) {
@@ -566,7 +566,7 @@ class ConstantContact_API {
566
  if ( is_array( $contact_value ) ) {
567
  $clean[ $contact_key ] = $this->clear_email( $contact_value );
568
  } elseif ( is_email( $contact_value ) ) {
569
- $email_parts = explode( '@', $contact_value );
570
  $clean[ $contact_key ] = implode( '@', [ '***', $email_parts[1] ] );
571
  } else {
572
  $clean[ $contact_key ] = $contact_value;
@@ -581,25 +581,25 @@ class ConstantContact_API {
581
  * @since 1.0.0
582
  * @since 1.3.0 Added $form_id parameter.
583
  *
584
- * @param string $api_token Token.
585
- * @param string $list List name.
586
- * @param string $email Email address.
587
- * @param array $user_data User data.
588
- * @param string $form_id ID of the form being processed.
589
- * @return mixed Response from API.
590
  */
591
  public function create_contact( $api_token, $list, $email, $user_data, $form_id ) {
592
-
593
  $contact = new Contact();
 
594
  $contact->addEmail( sanitize_text_field( $email ) );
595
- $contact->addList( esc_attr( $list ) );
596
 
597
  try {
598
  $contact = $this->set_contact_properties( $contact, $user_data, $form_id );
599
  } catch ( CtctException $ex ) {
600
  add_filter( 'constant_contact_force_logging', '__return_true' );
601
- $extra = constant_contact_location_and_line( __METHOD__, __LINE__ );
602
- $errors = $ex->getErrors();
603
  $our_errors[] = $extra . ' - ' . $errors[0]->error_key . ' - ' . $errors[0]->error_message;
604
  $this->log_errors( $our_errors );
605
  constant_contact_set_has_exceptions();
@@ -635,12 +635,12 @@ class ConstantContact_API {
635
  *
636
  * @throws CtctException API exception.
637
  *
638
- * @param array $response Response from api call.
639
- * @param string $api_token Token.
640
- * @param string $list List name.
641
- * @param array $user_data User data.
642
- * @param string $form_id Form ID being processed.
643
- * @return mixed Response from API.
644
  */
645
  public function update_contact( $response, $api_token, $list, $user_data, $form_id ) {
646
 
@@ -649,16 +649,16 @@ class ConstantContact_API {
649
  isset( $response->results[0] ) &&
650
  ( $response->results[0] instanceof Contact )
651
  ) {
652
-
653
  $contact = $response->results[0];
654
- $contact->addList( esc_attr( $list ) );
 
655
 
656
  try {
657
  $contact = $this->set_contact_properties( $contact, $user_data, $form_id, true );
658
  } catch ( CtctException $ex ) {
659
  add_filter( 'constant_contact_force_logging', '__return_true' );
660
- $extra = constant_contact_location_and_line( __METHOD__, __LINE__ );
661
- $errors = $ex->getErrors();
662
  $our_errors[] = $extra . ' - ' . $errors[0]->error_key . ' - ' . $errors[0]->error_message;
663
  $this->log_errors( $our_errors );
664
  constant_contact_set_has_exceptions();
@@ -823,8 +823,8 @@ class ConstantContact_API {
823
  try {
824
  $contact->$key = $value;
825
  } catch ( Exception $e ) {
826
- $errors = [];
827
- $extra = constant_contact_location_and_line( __METHOD__, __LINE__ );
828
  $errors[] = $extra . $e->getErrors();
829
  $this->log_errors( $errors );
830
  constant_contact_set_has_exceptions();
@@ -847,7 +847,7 @@ class ConstantContact_API {
847
  *
848
  * @since 1.0.0
849
  *
850
- * @throws Exception
851
  *
852
  * @param array $errors Errors from API.
853
  */
@@ -868,7 +868,7 @@ class ConstantContact_API {
868
  * @since 1.0.0
869
  * @since 1.8.6 Deprected
870
  *
871
- * @throws Exception
872
  *
873
  * @param array $error API error repsonse.
874
  * @return mixed
@@ -985,8 +985,8 @@ class ConstantContact_API {
985
  }
986
 
987
  $disclosure = [
988
- 'name' => empty( $account_info->organization_name ) ? ctct_get_settings_option( '_ctct_disclose_name', '' ) : $account_info->organization_name,
989
- 'address' => ctct_get_settings_option( '_ctct_disclose_address', '' ),
990
  ];
991
 
992
  if ( empty( $disclosure['name'] ) ) {
@@ -1020,6 +1020,28 @@ class ConstantContact_API {
1020
 
1021
  return $as_parts ? $disclosure : implode( ', ', array_values( $disclosure ) );
1022
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1023
  }
1024
 
1025
  /**
128
  }
129
  } catch ( CtctException $ex ) {
130
  add_filter( 'constant_contact_force_logging', '__return_true' );
131
+ $extra = constant_contact_location_and_line( __METHOD__, __LINE__ );
132
+ $errors = $ex->getErrors();
133
  $our_errors[] = $extra . ' - ' . $errors[0]->error_key . ' - ' . $errors[0]->error_message;
134
  $this->log_errors( $our_errors );
135
  constant_contact_set_has_exceptions();
173
 
174
  } catch ( CtctException $ex ) {
175
  add_filter( 'constant_contact_force_logging', '__return_true' );
176
+ $extra = constant_contact_location_and_line( __METHOD__, __LINE__ );
177
+ $errors = $ex->getErrors();
178
  $our_errors[] = $extra . ' - ' . $errors[0]->error_key . ' - ' . $errors[0]->error_message;
179
  $this->log_errors( $our_errors );
180
  constant_contact_set_has_exceptions();
226
  }
227
  } catch ( CtctException $ex ) {
228
  add_filter( 'constant_contact_force_logging', '__return_true' );
229
+ $extra = constant_contact_location_and_line( __METHOD__, __LINE__ );
230
+ $errors = $ex->getErrors();
231
  $our_errors[] = $extra . ' - ' . $errors[0]->error_key . ' - ' . $errors[0]->error_message;
232
  $this->log_errors( $our_errors );
233
  constant_contact_set_has_exceptions();
234
  } catch ( Exception $ex ) {
235
+ $error = new stdClass();
236
+ $error->error_key = get_class( $ex );
237
  $error->error_message = $ex->getMessage();
238
 
239
  add_filter( 'constant_contact_force_logging', '__return_true' );
277
  return $list;
278
  } catch ( CtctException $ex ) {
279
  add_filter( 'constant_contact_force_logging', '__return_true' );
280
+ $extra = constant_contact_location_and_line( __METHOD__, __LINE__ );
281
+ $errors = $ex->getErrors();
282
  $our_errors[] = $extra . ' - ' . $errors[0]->error_key . ' - ' . $errors[0]->error_message;
283
  $this->log_errors( $our_errors );
284
  constant_contact_set_has_exceptions();
320
  $list = $this->cc()->listService->getList( $this->get_api_token(), esc_attr( $new_list['id'] ) );
321
  } catch ( CtctException $ex ) {
322
  add_filter( 'constant_contact_force_logging', '__return_true' );
323
+ $extra = constant_contact_location_and_line( __METHOD__, __LINE__ );
324
+ $errors = $ex->getErrors();
325
  $our_errors[] = $extra . ' - ' . $errors[0]->error_key . ' - ' . $errors[0]->error_message;
326
  $this->log_errors( $our_errors );
327
  constant_contact_set_has_exceptions();
361
 
362
  } catch ( CtctException $ex ) {
363
  add_filter( 'constant_contact_force_logging', '__return_true' );
364
+ $extra = constant_contact_location_and_line( __METHOD__, __LINE__ );
365
+ $errors = $ex->getErrors();
366
  $our_errors[] = $extra . ' - ' . $errors[0]->error_key . ' - ' . $errors[0]->error_message;
367
  $this->log_errors( $our_errors );
368
  constant_contact_set_has_exceptions();
414
 
415
  } catch ( CtctException $ex ) {
416
  add_filter( 'constant_contact_force_logging', '__return_true' );
417
+ $extra = constant_contact_location_and_line( __METHOD__, __LINE__ );
418
+ $errors = $ex->getErrors();
419
  $our_errors[] = $extra . ' - ' . $errors[0]->error_key . ' - ' . $errors[0]->error_message;
420
  $this->log_errors( $our_errors );
421
  constant_contact_set_has_exceptions();
455
  $list = $this->cc()->listService->deleteList( $this->get_api_token(), $updated_list['id'] );
456
  } catch ( CtctException $ex ) {
457
  add_filter( 'constant_contact_force_logging', '__return_true' );
458
+ $extra = constant_contact_location_and_line( __METHOD__, __LINE__ );
459
+ $errors = $ex->getErrors();
460
  $our_errors[] = $extra . ' - ' . $errors[0]->error_key . ' - ' . $errors[0]->error_message;
461
  $this->log_errors( $our_errors );
462
  constant_contact_set_has_exceptions();
482
  * @since 1.0.0
483
  * @since 1.3.0 Added $form_id parameter.
484
  *
485
+ * @throws Exception Throws Exception if encountered while attempting to save contact.
486
  *
487
  * @param array $new_contact New contact data.
488
  * @param int $form_id ID of the form being processed.
502
  $email = sanitize_email( $new_contact['email'] );
503
 
504
  // Set our list data. If we didn't get passed a list and got this far, just generate a random ID.
505
+ $list = isset( $new_contact['list'] ) ? $new_contact['list'] : 'cc_' . wp_generate_password( 15, false );
506
 
507
  $return_contact = false;
508
 
524
  }
525
  } catch ( CtctException $ex ) {
526
  add_filter( 'constant_contact_force_logging', '__return_true' );
527
+ $extra = constant_contact_location_and_line( __METHOD__, __LINE__ );
528
+ $errors = $ex->getErrors();
529
  $our_errors[] = $extra . ' - ' . $errors[0]->error_key . ' - ' . $errors[0]->error_message;
530
  $this->log_errors( $our_errors );
531
  if ( 400 !== $ex->getCode() || false !== strpos( 'Bad Request', $ex->getMessage() ) ) {
566
  if ( is_array( $contact_value ) ) {
567
  $clean[ $contact_key ] = $this->clear_email( $contact_value );
568
  } elseif ( is_email( $contact_value ) ) {
569
+ $email_parts = explode( '@', $contact_value );
570
  $clean[ $contact_key ] = implode( '@', [ '***', $email_parts[1] ] );
571
  } else {
572
  $clean[ $contact_key ] = $contact_value;
581
  * @since 1.0.0
582
  * @since 1.3.0 Added $form_id parameter.
583
  *
584
+ * @param string $api_token Token.
585
+ * @param string|array $list List name(s).
586
+ * @param string $email Email address.
587
+ * @param array $user_data User data.
588
+ * @param string $form_id ID of the form being processed.
589
+ * @return mixed Response from API.
590
  */
591
  public function create_contact( $api_token, $list, $email, $user_data, $form_id ) {
 
592
  $contact = new Contact();
593
+
594
  $contact->addEmail( sanitize_text_field( $email ) );
595
+ $this->add_to_list( $contact, $list );
596
 
597
  try {
598
  $contact = $this->set_contact_properties( $contact, $user_data, $form_id );
599
  } catch ( CtctException $ex ) {
600
  add_filter( 'constant_contact_force_logging', '__return_true' );
601
+ $extra = constant_contact_location_and_line( __METHOD__, __LINE__ );
602
+ $errors = $ex->getErrors();
603
  $our_errors[] = $extra . ' - ' . $errors[0]->error_key . ' - ' . $errors[0]->error_message;
604
  $this->log_errors( $our_errors );
605
  constant_contact_set_has_exceptions();
635
  *
636
  * @throws CtctException API exception.
637
  *
638
+ * @param array $response Response from api call.
639
+ * @param string $api_token Token.
640
+ * @param string|array $list List name(s).
641
+ * @param array $user_data User data.
642
+ * @param string $form_id Form ID being processed.
643
+ * @return mixed Response from API.
644
  */
645
  public function update_contact( $response, $api_token, $list, $user_data, $form_id ) {
646
 
649
  isset( $response->results[0] ) &&
650
  ( $response->results[0] instanceof Contact )
651
  ) {
 
652
  $contact = $response->results[0];
653
+
654
+ $this->add_to_list( $contact, $list );
655
 
656
  try {
657
  $contact = $this->set_contact_properties( $contact, $user_data, $form_id, true );
658
  } catch ( CtctException $ex ) {
659
  add_filter( 'constant_contact_force_logging', '__return_true' );
660
+ $extra = constant_contact_location_and_line( __METHOD__, __LINE__ );
661
+ $errors = $ex->getErrors();
662
  $our_errors[] = $extra . ' - ' . $errors[0]->error_key . ' - ' . $errors[0]->error_message;
663
  $this->log_errors( $our_errors );
664
  constant_contact_set_has_exceptions();
823
  try {
824
  $contact->$key = $value;
825
  } catch ( Exception $e ) {
826
+ $errors = [];
827
+ $extra = constant_contact_location_and_line( __METHOD__, __LINE__ );
828
  $errors[] = $extra . $e->getErrors();
829
  $this->log_errors( $errors );
830
  constant_contact_set_has_exceptions();
847
  *
848
  * @since 1.0.0
849
  *
850
+ * @throws Exception Throws Exception if encountered while attempting to log errors.
851
  *
852
  * @param array $errors Errors from API.
853
  */
868
  * @since 1.0.0
869
  * @since 1.8.6 Deprected
870
  *
871
+ * @throws Exception Throws Exception if encountered while attempting to process error message.
872
  *
873
  * @param array $error API error repsonse.
874
  * @return mixed
985
  }
986
 
987
  $disclosure = [
988
+ 'name' => empty( $account_info->organization_name ) ? constant_contact_get_option( '_ctct_disclose_name', '' ) : $account_info->organization_name,
989
+ 'address' => constant_contact_get_option( '_ctct_disclose_address', '' ),
990
  ];
991
 
992
  if ( empty( $disclosure['name'] ) ) {
1020
 
1021
  return $as_parts ? $disclosure : implode( ', ', array_values( $disclosure ) );
1022
  }
1023
+
1024
+ /**
1025
+ * Add contact to one or more lists.
1026
+ *
1027
+ * @author Rebekah Van Epps <rebekah.vanepps@webdevstudios.com>
1028
+ * @since 1.9.0
1029
+ *
1030
+ * @param Contact $contact Contact object.
1031
+ * @param string|array $list Single list ID or array of lists.
1032
+ * @return void
1033
+ */
1034
+ private function add_to_list( $contact, $list ) {
1035
+ if ( empty( $list ) ) {
1036
+ return;
1037
+ }
1038
+
1039
+ $list = is_array( $list ) ? $list : [ $list ];
1040
+
1041
+ foreach ( $list as $list_id ) {
1042
+ $contact->addList( esc_attr( $list_id ) );
1043
+ }
1044
+ }
1045
  }
1046
 
1047
  /**
includes/class-builder-fields.php CHANGED
@@ -149,7 +149,7 @@ class ConstantContact_Builder_Fields {
149
  ],
150
  'website' => [
151
  'option' => esc_html__( 'Website', 'constant-contact-forms' ),
152
- 'placeholder' => esc_html__( 'http://www.example.com', 'constant-contact-form' ),
153
  ],
154
  'custom' => [
155
  'option' => esc_html__( 'Custom Text Field', 'constant-contact-forms' ),
@@ -219,12 +219,10 @@ class ConstantContact_Builder_Fields {
219
 
220
  if ( $lists ) {
221
  $list_metabox->add_field( [
222
- 'name' => esc_html__( 'Add subscribers to', 'constant-contact-forms' ),
223
- 'id' => $this->prefix . 'list',
224
- 'type' => 'select',
225
- 'show_option_none' => esc_html__( 'No List Selected', 'constant-contact-forms' ),
226
- 'default' => 'none',
227
- 'options' => $lists,
228
  ] );
229
  }
230
  }
@@ -451,7 +449,7 @@ class ConstantContact_Builder_Fields {
451
  'id' => 'form-padding-title',
452
  'description' => esc_html__(
453
  'Enter padding values in number of pixels. Padding will be applied to four sides of the form.',
454
- 'constant-contact-form' ),
455
  ] );
456
 
457
  $custom_css_metabox->add_field( [
149
  ],
150
  'website' => [
151
  'option' => esc_html__( 'Website', 'constant-contact-forms' ),
152
+ 'placeholder' => esc_html__( 'http://www.example.com', 'constant-contact-forms' ),
153
  ],
154
  'custom' => [
155
  'option' => esc_html__( 'Custom Text Field', 'constant-contact-forms' ),
219
 
220
  if ( $lists ) {
221
  $list_metabox->add_field( [
222
+ 'name' => esc_html__( 'Allow subscribers to select from lists', 'constant-contact-forms' ),
223
+ 'id' => $this->prefix . 'list',
224
+ 'type' => 'multicheck',
225
+ 'options' => $lists,
 
 
226
  ] );
227
  }
228
  }
449
  'id' => 'form-padding-title',
450
  'description' => esc_html__(
451
  'Enter padding values in number of pixels. Padding will be applied to four sides of the form.',
452
+ 'constant-contact-forms' ),
453
  ] );
454
 
455
  $custom_css_metabox->add_field( [
includes/class-check.php CHANGED
@@ -177,6 +177,8 @@ class ConstantContact_Check {
177
  $sslverify = version_compare( $wp_version, 4.0, '<' );
178
  $doing_wp_cron = sprintf( '%.22F', microtime( true ) );
179
 
 
 
180
  $cron_request = apply_filters( 'cron_request', [
181
  'url' => site_url( 'wp-cron.php?doing_wp_cron=' . $doing_wp_cron ),
182
  'key' => $doing_wp_cron,
@@ -186,6 +188,7 @@ class ConstantContact_Check {
186
  'sslverify' => apply_filters( 'https_local_ssl_verify', $sslverify ),
187
  ],
188
  ] );
 
189
 
190
  $cron_request['args']['blocking'] = true;
191
 
177
  $sslverify = version_compare( $wp_version, 4.0, '<' );
178
  $doing_wp_cron = sprintf( '%.22F', microtime( true ) );
179
 
180
+ // phpcs:disable WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound -- Filters defined in WP Core.
181
+ /* This filter is documented in wp-includes/cron.php */
182
  $cron_request = apply_filters( 'cron_request', [
183
  'url' => site_url( 'wp-cron.php?doing_wp_cron=' . $doing_wp_cron ),
184
  'key' => $doing_wp_cron,
188
  'sslverify' => apply_filters( 'https_local_ssl_verify', $sslverify ),
189
  ],
190
  ] );
191
+ // phpcs:enable WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound
192
 
193
  $cron_request['args']['blocking'] = true;
194
 
includes/class-connect.php CHANGED
@@ -320,7 +320,7 @@ class ConstantContact_Connect {
320
  *
321
  * @since 1.0.0
322
  *
323
- * @throws Exception
324
  *
325
  * @return boolean
326
  */
@@ -359,7 +359,7 @@ class ConstantContact_Connect {
359
  *
360
  * @since 1.0.0
361
  *
362
- * @throws Exception
363
  *
364
  * @param string $check_key key to save to.
365
  * @param boolean $fallback_to_ctct_opt Fall back maybe.
@@ -444,7 +444,7 @@ class ConstantContact_Connect {
444
  *
445
  * @since 1.0.0
446
  *
447
- * @throws Exception
448
  *
449
  * @return string Token.
450
  */
@@ -508,8 +508,8 @@ class ConstantContact_Connect {
508
  return 'ctct_key';
509
  }
510
 
511
- $key = Key::createNewRandomKey();
512
- $key = $key->saveToAsciiSafeString();
513
  $updated = update_option( 'ctct_key', $key );
514
 
515
  if ( ! $updated || $first_try ) {
320
  *
321
  * @since 1.0.0
322
  *
323
+ * @throws Exception Throw Exception if encountered during disconnection.
324
  *
325
  * @return boolean
326
  */
359
  *
360
  * @since 1.0.0
361
  *
362
+ * @throws Exception Throws Exception if encountered while attempting to retrieve encrypted value.
363
  *
364
  * @param string $check_key key to save to.
365
  * @param boolean $fallback_to_ctct_opt Fall back maybe.
444
  *
445
  * @since 1.0.0
446
  *
447
+ * @throws Exception Throws Exception if encountered while attempting to save API token.
448
  *
449
  * @return string Token.
450
  */
508
  return 'ctct_key';
509
  }
510
 
511
+ $key = Key::createNewRandomKey();
512
+ $key = $key->saveToAsciiSafeString();
513
  $updated = update_option( 'ctct_key', $key );
514
 
515
  if ( ! $updated || $first_try ) {
includes/class-cpts.php CHANGED
@@ -179,19 +179,24 @@ class ConstantContact_CPTS {
179
  * @return array appended update messages with custom post types.
180
  */
181
  public function post_updated_messages( $messages ) {
182
-
183
  global $post;
184
 
 
 
185
  $messages['ctct_lists'] = [
186
  0 => '', // Unused. Messages start at index 1.
187
  1 => __( 'List updated.', 'constant-contact-forms' ),
188
  2 => __( 'Custom field updated.', 'constant-contact-forms' ),
189
  3 => __( 'Custom field deleted.', 'constant-contact-forms' ),
190
  4 => __( 'List updated.', 'constant-contact-forms' ),
191
- 5 => isset( $_GET['revision'] ) ? sprintf( __( 'List restored to revision from %s', 'constant-contact-forms' ), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,
 
 
 
192
  6 => __( 'List published.', 'constant-contact-forms' ),
193
  7 => __( 'List saved.', 'constant-contact-forms' ),
194
  8 => __( 'List submitted.', 'constant-contact-forms' ),
 
195
  9 => __( 'List scheduled for: <strong>%1$s</strong>.', 'constant-contact-forms' ),
196
  date_i18n( 'M j, Y @ G:i', strtotime( $post->post_date ) ),
197
  10 => __( 'List draft updated.', 'constant-contact-forms' ),
@@ -203,10 +208,18 @@ class ConstantContact_CPTS {
203
  2 => __( 'Custom field updated.', 'constant-contact-forms' ),
204
  3 => __( 'Custom field deleted.', 'constant-contact-forms' ),
205
  4 => __( 'Form updated.', 'constant-contact-forms' ),
206
- 5 => isset( $_GET['revision'] ) ? sprintf( __( 'Form restored to revision from %s', 'constant-contact-forms' ), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,
207
- 6 => sprintf( __( "Success! Here's the shortcode: %s. Just paste it into a post or page editor to publish", 'constant-contact-forms' ), '<strong>' . constant_contact_display_shortcode( $post->ID ) . '</strong>' ),
 
 
 
 
 
 
 
208
  7 => __( 'Form saved.', 'constant-contact-forms' ),
209
  8 => __( 'Form submitted.', 'constant-contact-forms' ),
 
210
  9 => __( 'Form scheduled for: <strong>%1$s</strong>.', 'constant-contact-forms' ),
211
  date_i18n( 'M j, Y @ G:i', strtotime( $post->post_date ) ),
212
  10 => __( 'Form draft updated.', 'constant-contact-forms' ),
179
  * @return array appended update messages with custom post types.
180
  */
181
  public function post_updated_messages( $messages ) {
 
182
  global $post;
183
 
184
+ $revision = filter_input( INPUT_GET, 'revision', FILTER_SANITIZE_NUMBER_INT );
185
+
186
  $messages['ctct_lists'] = [
187
  0 => '', // Unused. Messages start at index 1.
188
  1 => __( 'List updated.', 'constant-contact-forms' ),
189
  2 => __( 'Custom field updated.', 'constant-contact-forms' ),
190
  3 => __( 'Custom field deleted.', 'constant-contact-forms' ),
191
  4 => __( 'List updated.', 'constant-contact-forms' ),
192
+ 5 => ! empty( $revision ) ?
193
+ /* translators: formatted revision timestamp. */
194
+ sprintf( __( 'List restored to revision from %s', 'constant-contact-forms' ), wp_post_revision_title( $revision, false ) ) :
195
+ false,
196
  6 => __( 'List published.', 'constant-contact-forms' ),
197
  7 => __( 'List saved.', 'constant-contact-forms' ),
198
  8 => __( 'List submitted.', 'constant-contact-forms' ),
199
+ /* translators: formatted post date timestamp. */
200
  9 => __( 'List scheduled for: <strong>%1$s</strong>.', 'constant-contact-forms' ),
201
  date_i18n( 'M j, Y @ G:i', strtotime( $post->post_date ) ),
202
  10 => __( 'List draft updated.', 'constant-contact-forms' ),
208
  2 => __( 'Custom field updated.', 'constant-contact-forms' ),
209
  3 => __( 'Custom field deleted.', 'constant-contact-forms' ),
210
  4 => __( 'Form updated.', 'constant-contact-forms' ),
211
+ 5 => ! empty( $revision ) ?
212
+ /* translators: formatted revision timestamp. */
213
+ sprintf( __( 'Form restored to revision from %s', 'constant-contact-forms' ), wp_post_revision_title( $revision, false ) ) :
214
+ false,
215
+ 6 => sprintf(
216
+ /* translators: form shortcode. */
217
+ __( "Success! Here's the shortcode: %s. Just paste it into a post or page editor to publish", 'constant-contact-forms' ),
218
+ '<strong>' . constant_contact_display_shortcode( $post->ID ) . '</strong>'
219
+ ),
220
  7 => __( 'Form saved.', 'constant-contact-forms' ),
221
  8 => __( 'Form submitted.', 'constant-contact-forms' ),
222
+ /* translators: formatted post date timestamp. */
223
  9 => __( 'Form scheduled for: <strong>%1$s</strong>.', 'constant-contact-forms' ),
224
  date_i18n( 'M j, Y @ G:i', strtotime( $post->post_date ) ),
225
  10 => __( 'Form draft updated.', 'constant-contact-forms' ),
includes/class-display-shortcode.php CHANGED
@@ -127,7 +127,7 @@ class ConstantContact_Display_Shortcode {
127
  * @param bool $show_title If true, show the title.
128
  */
129
  public function display_form( $form_id, $show_title = false ) {
130
- echo $this->get_form( absint( $form_id ), $show_title ); // WPCS: XSS Ok.
131
  }
132
 
133
  /**
127
  * @param bool $show_title If true, show the title.
128
  */
129
  public function display_form( $form_id, $show_title = false ) {
130
+ echo $this->get_form( absint( $form_id ), $show_title ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- XSS OK.
131
  }
132
 
133
  /**
includes/class-display.php CHANGED
@@ -110,12 +110,12 @@ class ConstantContact_Display {
110
 
111
  $global_form_css = [];
112
 
113
- $global_form_classes = ctct_get_settings_option( '_ctct_form_custom_classes' );
114
  if ( $global_form_classes ) {
115
  $global_form_css['global_form_classes'] = $global_form_classes;
116
  }
117
 
118
- $global_label_placement = ctct_get_settings_option( 'ctct_form_label_placement' );
119
  if ( $global_label_placement ) {
120
  $global_form_css['global_label_placement'] = $global_label_placement;
121
  }
@@ -328,14 +328,28 @@ class ConstantContact_Display {
328
  }
329
 
330
  ob_start();
 
331
  /**
332
  * Fires before the start of the form tag.
333
  *
 
 
334
  * @since 1.4.0
335
  *
336
  * @param int $form_id Current form ID.
337
  */
338
- do_action( 'ctct_before_form', $form_id );
 
 
 
 
 
 
 
 
 
 
 
339
  $return .= ob_get_clean();
340
 
341
  $return .= '<form class="' . esc_attr( $form_classes ) . '" id="' . $rf_id . '" ';
@@ -349,7 +363,7 @@ class ConstantContact_Display {
349
  $return .= $this->build_form_fields( $form_data, $old_values, $req_errors, $instance );
350
 
351
  if ( ! $disable_recaptcha && ConstantContact_reCAPTCHA::has_recaptcha_keys() ) {
352
- $recaptcha_version = ctct_get_settings_option( '_ctct_recaptcha_version', '' );
353
  if ( 'v2' === $recaptcha_version ) {
354
  $return .= $this->build_recaptcha( $form_id );
355
  }
@@ -372,14 +386,28 @@ class ConstantContact_Display {
372
  $return .= '</form>';
373
 
374
  ob_start();
 
375
  /**
376
  * Fires after the end of the form tag.
377
  *
 
 
378
  * @since 1.4.0
379
  *
380
  * @param int $form_id Current form ID.
381
  */
382
- do_action( 'ctct_after_form', $form_id );
 
 
 
 
 
 
 
 
 
 
 
383
  $return .= ob_get_clean();
384
 
385
  $return .= '<script type="text/javascript">';
@@ -438,14 +466,14 @@ class ConstantContact_Display {
438
  return false;
439
  }
440
 
441
- $return = $this->input( 'hidden', 'ctct-id', 'ctct-id', $form_id, '', '', true );
442
 
443
  // If we have saved a verify value, add that to our field as well. this is to double-check
444
  // that we have the correct form id for processing later.
445
  $verify_key = get_post_meta( $form_id, '_ctct_verify_key', true );
446
 
447
  if ( $verify_key ) {
448
- $return .= $this->input( 'hidden', 'ctct-verify', 'ctct-verify', $verify_key, '', '', true );
449
  }
450
 
451
  return $return;
@@ -487,7 +515,16 @@ class ConstantContact_Display {
487
  }
488
  }
489
 
490
- if ( isset( $form_data['options'] ) ) {
 
 
 
 
 
 
 
 
 
491
  $return .= $this->opt_in( $form_data['options'], $instance );
492
  }
493
 
@@ -634,7 +671,8 @@ class ConstantContact_Display {
634
  $map = sanitize_text_field( $field['map_to'] );
635
  $desc = sanitize_text_field( isset( $field['description'] ) ? $field['description'] : '' );
636
  $type = sanitize_text_field( isset( $field['type'] ) ? $field['type'] : 'text_field' );
637
- $value = sanitize_text_field( isset( $field['value'] ) ? $field['value'] : false );
 
638
  $req = isset( $field['required'] ) ? $field['required'] : false;
639
 
640
  // phpcs:disable WordPress.PHP.DiscouragedPHPFunctions -- Okay use of serialize() here.
@@ -688,9 +726,9 @@ class ConstantContact_Display {
688
  case 'email':
689
  return $this->input( 'email', $name, $map, $value, $desc, $req, false, $field_error, $form_id, $label_placement, $instance );
690
  case 'hidden':
691
- return $this->input( 'hidden', $name, $map, $value, $desc, $req );
692
  case 'checkbox':
693
- return $this->checkbox( $name, $map, $value, $desc, $instance );
694
  case 'submit':
695
  return $this->input( 'submit', $name, $map, $value, $desc, $req, false, $field_error );
696
  case 'address':
@@ -729,6 +767,7 @@ class ConstantContact_Display {
729
  foreach ( $submitted_vals as $post ) {
730
 
731
  if ( isset( $post['key'] ) && $post['key'] ) {
 
732
 
733
  if ( 'address' === $field['name'] ) {
734
 
@@ -737,23 +776,15 @@ class ConstantContact_Display {
737
  $addr_key = explode( '___', $post['key'] );
738
 
739
  if ( isset( $addr_key[0] ) && $addr_key[0] ) {
740
-
741
- $post_key = '';
742
-
743
- // phpcs:disable WordPress.Security.NonceVerification.NoNonceVerification -- Okay accessing of $_POST value.
744
- if ( isset( $_POST[ esc_attr( $post['key'] ) ] ) ) {
745
- $post_key = sanitize_text_field( wp_unslash( $_POST[ esc_attr( $post['key'] ) ] ) );
746
- }
747
- // phpcs:enable WordPress.Security.NonceVerification.NoNonceVerification
748
 
749
  $return[ esc_attr( $addr_key[0] ) ] = $post_key;
750
  }
751
  }
752
- // phpcs:disable WordPress.Security.NonceVerification.NoNonceVerification -- Okay accessing of $_POST value.
753
- } elseif ( $post['key'] === $map && isset( $_POST[ esc_attr( $map ) ] ) ) {
754
- return sanitize_text_field( wp_unslash( $_POST[ esc_attr( $map ) ] ) );
755
  }
756
- // phpcs:enable WordPress.Security.NonceVerification.NoNonceVerification
757
  }
758
  }
759
 
@@ -837,17 +868,19 @@ class ConstantContact_Display {
837
  /**
838
  * Helper method to display label for form field + field starting markup.
839
  *
840
- * @since 1.0.0
841
- *
842
- * @param string $type Type of field.
843
- * @param string $name Name / id of field.
844
- * @param string $f_id Field ID.
845
- * @param string $label Label text for field.
846
- * @param boolean $req If this field required.
847
- * @param boolean $use_label Whether or not to use label.
 
 
848
  * @return string HTML markup.
849
  */
850
- public function field_top( $type = '', $name = '', $f_id = '', $label = '', $req = false, $use_label = true ) {
851
 
852
  $classes = [
853
  'ctct-form-field',
@@ -857,7 +890,7 @@ class ConstantContact_Display {
857
  $classes[] = 'ctct-form-field-required';
858
  }
859
 
860
- $markup = '<p class="' . implode( ' ', $classes ) . '">';
861
 
862
  if ( ! $use_label ) {
863
  $markup .= '<span class="ctct-input-container">';
@@ -869,15 +902,17 @@ class ConstantContact_Display {
869
  /**
870
  * Bottom of field markup.
871
  *
872
- * @since 1.0.0
873
- * @since 1.3.5 Added $use_label
 
874
  *
875
- * @param string $name Field name.
876
- * @param string $field_label Field label.
877
- * @param bool $use_label Whether or not to include label markup.
 
878
  * @return string HTML markup
879
  */
880
- public function field_bottom( $name = '', $field_label = '', $use_label = true ) {
881
 
882
  $markup = '';
883
  if ( ! empty( $name ) && ! empty( $field_label ) ) {
@@ -888,7 +923,7 @@ class ConstantContact_Display {
888
  $markup .= '</span>';
889
  }
890
 
891
- return $markup . '</p>';
892
  }
893
 
894
  /**
@@ -957,7 +992,7 @@ class ConstantContact_Display {
957
  public function input( $type = 'text', $name = '', $id = '', $value = '', $label = '', $req = false, $f_only = false, $field_error = false, $form_id = 0, $label_placement = '', $instance = 0 ) {
958
  $name = sanitize_text_field( $name );
959
  $field_key = sanitize_title( $id );
960
- $field_id = "{$field_key}_$instance";
961
  $input_inline_styles = '';
962
  $label_placement_class = 'ctct-label-' . $label_placement;
963
  $specific_form_styles = $this->specific_form_styles;
@@ -979,7 +1014,7 @@ class ConstantContact_Display {
979
  if ( $req ) {
980
  $req_label = $this->display_required_indicator();
981
  }
982
- if ( ( 'top' === $label_placement || 'left' === $label_placement || 'hidden' === $label_placement ) && ( 'submit' !== $type ) && ( 'hidden' !== $type ) ) {
983
  if ( $inline_font_styles ) {
984
  $markup .= '<span class="' . $label_placement_class . '" style="' . $inline_font_styles . '">';
985
  } else {
@@ -1019,6 +1054,8 @@ class ConstantContact_Display {
1019
  $max_length = '';
1020
  if ( false !== strpos( $id, 'custom___' ) ) {
1021
  $max_length = $truncate_max_length ? $this->get_max_length_attr( $name ) : $this->get_max_length_attr();
 
 
1022
  }
1023
 
1024
  if ( $field_error ) {
@@ -1032,8 +1069,8 @@ class ConstantContact_Display {
1032
  $class_attr = 'class="' . implode( ' ', $classes ) . '"';
1033
  }
1034
 
1035
- /* translators: 1: Required text, 2: Field type, 3: Field name, 4: Inline styles, 5: Field value, 6: Max length, 7: Placeholder (non-hidden fields only), 8: Field class(es), 9: Field ID (non-hidden fields only), 10: Tabindex (hidden fields only). */
1036
- $field = '<input %1$s type="%2$s" name="%3$s" %4$s value="%5$s" %6$s %7$s %8$s %9$s %10$s />';
1037
  $markup .= sprintf(
1038
  $field,
1039
  $req_text,
@@ -1042,16 +1079,15 @@ class ConstantContact_Display {
1042
  $input_inline_styles,
1043
  $value,
1044
  $max_length,
1045
- 'hidden' !== $type ? "placeholder=\"{$label}\"" : '',
1046
  $class_attr,
1047
- 'hidden' !== $type ? "id=\"{$field_id}\"" : '',
1048
- 'hidden' === $type ? 'tabindex="-1"' : ''
1049
  );
1050
 
1051
  // Reassign because if we want "field only", like for hidden inputs, we need to still pass a value that went through sprintf().
1052
  $field = $markup;
1053
 
1054
- if ( ( 'bottom' === $label_placement || 'right' === $label_placement ) && ( 'submit' !== $type ) && ( 'hidden' !== $type ) ) {
1055
  $markup .= '<span class="' . $label_placement_class . '">';
1056
  $markup .= $this->get_label( $field_id, $name . ' ' . $req_label );
1057
  $markup .= '</span>';
@@ -1070,40 +1106,132 @@ class ConstantContact_Display {
1070
  return $markup;
1071
  }
1072
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1073
  /**
1074
  * Checkbox field helper method.
1075
  *
1076
  * @since 1.0.0
1077
- *
1078
- * @param string $name Name/it of field.
1079
- * @param string $f_id Field ID.
1080
- * @param string $value Value of field.
1081
- * @param string $label Label / desc text.
1082
- * @param int $instance Current form instance.
1083
- * @return string HTML markup for checkbox.
 
 
 
 
 
1084
  */
1085
- public function checkbox( $name = '', $f_id = '', $value = '', $label = '', $instance = 0 ) {
1086
- $name = sanitize_text_field( $name );
1087
- $field_key = sanitize_title( $field_key );
1088
- $field_id = "{$field_key}_{$instance}";
1089
- $value = sanitize_text_field( $value );
1090
- $label = esc_attr( $label );
1091
- $type = 'checkbox';
1092
- $classes = [ 'ctct-' . esc_attr( $type ) ];
 
 
 
 
 
1093
 
1094
  /**
1095
  * Filter to add classes for the rendering input.
1096
  *
1097
  * @since 1.2.0
1098
- * @param array $classes Array of classes to apply to the field.
1099
- * @param string $type The field type being rendered.
 
 
1100
  * @return array
1101
  */
1102
- $classes = apply_filters( 'constant_contact_input_classes', $classes, $type ); // @todo if/when we start using the checkbox field type, pass in a $form_id and $field_key value.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1103
 
1104
- $markup = $this->field_top( $type, $name, $field_id, $label, false, false );
1105
- $markup .= '<input type="' . $type . '" name="' . $field_key . '" id="' . $field_id . '" value="' . $value . '" class="' . implode( ' ', $classes ) . '" />';
1106
- $markup .= $this->field_bottom( $name, ' ' . $label );
 
 
 
 
 
 
 
 
 
 
 
 
1107
 
1108
  return $markup;
1109
  }
@@ -1180,7 +1308,6 @@ class ConstantContact_Display {
1180
  public function optin_display( $optin, $instance = 0 ) {
1181
 
1182
  $label = sanitize_text_field( isset( $optin['instructions'] ) ? $optin['instructions'] : '' );
1183
- $value = sanitize_text_field( isset( $optin['list'] ) ? $optin['list'] : '' );
1184
 
1185
  $show = false;
1186
  if ( isset( $optin['show'] ) && 'on' === $optin['show'] ) {
@@ -1193,7 +1320,7 @@ class ConstantContact_Display {
1193
  $markup = '<div class="ctct-optin-hide" style="display:none;">';
1194
  }
1195
 
1196
- $markup .= $this->get_optin_markup( $label, $value, $show, $instance );
1197
 
1198
  if ( ! $show ) {
1199
  $markup .= '</div><!--.ctct-optin-hide -->';
@@ -1818,7 +1945,6 @@ class ConstantContact_Display {
1818
  * @return string HTML markup for instance field.
1819
  */
1820
  protected function create_instance_field( $instance ) {
1821
- $instance = absint( $instance );
1822
- return $this->input( 'hidden', 'ctct-instance', 'ctct-instance', $instance, '', false, true );
1823
  }
1824
  }
110
 
111
  $global_form_css = [];
112
 
113
+ $global_form_classes = constant_contact_get_option( '_ctct_form_custom_classes' );
114
  if ( $global_form_classes ) {
115
  $global_form_css['global_form_classes'] = $global_form_classes;
116
  }
117
 
118
+ $global_label_placement = constant_contact_get_option( 'ctct_form_label_placement' );
119
  if ( $global_label_placement ) {
120
  $global_form_css['global_label_placement'] = $global_label_placement;
121
  }
328
  }
329
 
330
  ob_start();
331
+
332
  /**
333
  * Fires before the start of the form tag.
334
  *
335
+ * @deprecated 1.9.0 Deprecated in favor of properly-prefixed hookname.
336
+ *
337
  * @since 1.4.0
338
  *
339
  * @param int $form_id Current form ID.
340
  */
341
+ do_action_deprecated( 'ctct_before_form', [ $form_id ], '1.9.0', 'constant_contact_before_form' );
342
+
343
+ /**
344
+ * Fires before the opening form tag.
345
+ *
346
+ * @author Rebekah Van Epps <rebekah.vanepp@webdevstudios.com>
347
+ * @since 1.9.0
348
+ *
349
+ * @param int $form_id Current form ID.
350
+ */
351
+ do_action( 'constant_contact_before_form', $form_id );
352
+
353
  $return .= ob_get_clean();
354
 
355
  $return .= '<form class="' . esc_attr( $form_classes ) . '" id="' . $rf_id . '" ';
363
  $return .= $this->build_form_fields( $form_data, $old_values, $req_errors, $instance );
364
 
365
  if ( ! $disable_recaptcha && ConstantContact_reCAPTCHA::has_recaptcha_keys() ) {
366
+ $recaptcha_version = constant_contact_get_option( '_ctct_recaptcha_version', '' );
367
  if ( 'v2' === $recaptcha_version ) {
368
  $return .= $this->build_recaptcha( $form_id );
369
  }
386
  $return .= '</form>';
387
 
388
  ob_start();
389
+
390
  /**
391
  * Fires after the end of the form tag.
392
  *
393
+ * @deprecated 1.9.0 Deprecated in favor of properly-prefixed hookname.
394
+ *
395
  * @since 1.4.0
396
  *
397
  * @param int $form_id Current form ID.
398
  */
399
+ do_action_deprecated( 'ctct_after_form', [ $form_id ], '1.9.0', 'constant_contact_after_form' );
400
+
401
+ /**
402
+ * Fires after the closing form tag.
403
+ *
404
+ * @author Rebekah Van Epps <rebekah.vanepp@webdevstudios.com>
405
+ * @since 1.9.0
406
+ *
407
+ * @param int $form_id Current form ID.
408
+ */
409
+ do_action( 'constant_contact_after_form', $form_id );
410
+
411
  $return .= ob_get_clean();
412
 
413
  $return .= '<script type="text/javascript">';
466
  return false;
467
  }
468
 
469
+ $return = $this->input_hidden( 'ctct-id', $form_id );
470
 
471
  // If we have saved a verify value, add that to our field as well. this is to double-check
472
  // that we have the correct form id for processing later.
473
  $verify_key = get_post_meta( $form_id, '_ctct_verify_key', true );
474
 
475
  if ( $verify_key ) {
476
+ $return .= $this->input_hidden( 'ctct-verify', $verify_key );
477
  }
478
 
479
  return $return;
515
  }
516
  }
517
 
518
+ if ( constant_contact()->api->is_connected() && isset( $form_data['options'] ) ) {
519
+ $lists = maybe_unserialize( isset( $form_data['options']['optin']['list'] ) ? $form_data['options']['optin']['list'] : '' );
520
+
521
+ $return .= $this->field( [
522
+ 'name' => __( 'Select list(s) to subscribe to', 'constant-contact-forms' ),
523
+ 'map_to' => 'lists',
524
+ 'type' => 'checkbox',
525
+ 'required' => true,
526
+ 'value' => $lists,
527
+ ], $old_values, $req_errors, $form_id, $label_placement, $instance );
528
  $return .= $this->opt_in( $form_data['options'], $instance );
529
  }
530
 
671
  $map = sanitize_text_field( $field['map_to'] );
672
  $desc = sanitize_text_field( isset( $field['description'] ) ? $field['description'] : '' );
673
  $type = sanitize_text_field( isset( $field['type'] ) ? $field['type'] : 'text_field' );
674
+ $value = isset( $field['value'] ) ? $field['value'] : false;
675
+ $value = is_array( $value ) ? array_map( 'sanitize_text_field', $value ) : sanitize_text_field( $value );
676
  $req = isset( $field['required'] ) ? $field['required'] : false;
677
 
678
  // phpcs:disable WordPress.PHP.DiscouragedPHPFunctions -- Okay use of serialize() here.
726
  case 'email':
727
  return $this->input( 'email', $name, $map, $value, $desc, $req, false, $field_error, $form_id, $label_placement, $instance );
728
  case 'hidden':
729
+ return $this->input_hidden( $name, $value );
730
  case 'checkbox':
731
+ return $this->checkbox( $name, $map, $value, $desc, $req, $field_error, $form_id, $label_placement, $instance );
732
  case 'submit':
733
  return $this->input( 'submit', $name, $map, $value, $desc, $req, false, $field_error );
734
  case 'address':
767
  foreach ( $submitted_vals as $post ) {
768
 
769
  if ( isset( $post['key'] ) && $post['key'] ) {
770
+ $post_map = filter_input( INPUT_POST, esc_attr( $map ), FILTER_SANITIZE_STRING );
771
 
772
  if ( 'address' === $field['name'] ) {
773
 
776
  $addr_key = explode( '___', $post['key'] );
777
 
778
  if ( isset( $addr_key[0] ) && $addr_key[0] ) {
779
+ $post_key = filter_input( INPUT_POST, esc_attr( $post['key'] ), FILTER_SANITIZE_STRING );
780
+ $post_key = empty( $post_key ) ? '' : sanitize_text_field( wp_unslash( $post_key ) );
 
 
 
 
 
 
781
 
782
  $return[ esc_attr( $addr_key[0] ) ] = $post_key;
783
  }
784
  }
785
+ } elseif ( $post['key'] === $map && ! empty( $post_map ) ) {
786
+ return sanitize_text_field( wp_unslash( $post_map ) );
 
787
  }
 
788
  }
789
  }
790
 
868
  /**
869
  * Helper method to display label for form field + field starting markup.
870
  *
871
+ * @since 1.0.0
872
+ * @since 1.9.0 Added $tag
873
+ *
874
+ * @param string $type Type of field.
875
+ * @param string $name Name / id of field.
876
+ * @param string $f_id Field ID.
877
+ * @param string $label Label text for field.
878
+ * @param boolean $req If this field required.
879
+ * @param boolean $use_label Whether or not to use label.
880
+ * @param string $tag HTML tag for field.
881
  * @return string HTML markup.
882
  */
883
+ public function field_top( $type = '', $name = '', $f_id = '', $label = '', $req = false, $use_label = true, $tag = 'p' ) {
884
 
885
  $classes = [
886
  'ctct-form-field',
890
  $classes[] = 'ctct-form-field-required';
891
  }
892
 
893
+ $markup = '<' . $tag . ' class="' . implode( ' ', $classes ) . '">';
894
 
895
  if ( ! $use_label ) {
896
  $markup .= '<span class="ctct-input-container">';
902
  /**
903
  * Bottom of field markup.
904
  *
905
+ * @since 1.0.0
906
+ * @since 1.3.5 Added $use_label
907
+ * @since 1.9.0 Added $tag
908
  *
909
+ * @param string $name Field name.
910
+ * @param string $field_label Field label.
911
+ * @param bool $use_label Whether or not to include label markup.
912
+ * @param string $tag HTML tag for field.
913
  * @return string HTML markup
914
  */
915
+ public function field_bottom( $name = '', $field_label = '', $use_label = true, $tag = 'p' ) {
916
 
917
  $markup = '';
918
  if ( ! empty( $name ) && ! empty( $field_label ) ) {
923
  $markup .= '</span>';
924
  }
925
 
926
+ return $markup . "</{$tag}>";
927
  }
928
 
929
  /**
992
  public function input( $type = 'text', $name = '', $id = '', $value = '', $label = '', $req = false, $f_only = false, $field_error = false, $form_id = 0, $label_placement = '', $instance = 0 ) {
993
  $name = sanitize_text_field( $name );
994
  $field_key = sanitize_title( $id );
995
+ $field_id = "{$field_key}_{$instance}";
996
  $input_inline_styles = '';
997
  $label_placement_class = 'ctct-label-' . $label_placement;
998
  $specific_form_styles = $this->specific_form_styles;
1014
  if ( $req ) {
1015
  $req_label = $this->display_required_indicator();
1016
  }
1017
+ if ( ( 'top' === $label_placement || 'left' === $label_placement || 'hidden' === $label_placement ) && ( 'submit' !== $type ) ) {
1018
  if ( $inline_font_styles ) {
1019
  $markup .= '<span class="' . $label_placement_class . '" style="' . $inline_font_styles . '">';
1020
  } else {
1054
  $max_length = '';
1055
  if ( false !== strpos( $id, 'custom___' ) ) {
1056
  $max_length = $truncate_max_length ? $this->get_max_length_attr( $name ) : $this->get_max_length_attr();
1057
+ } elseif ( false !== strpos( $id, 'first_name___' ) || false !== strpos( $id, 'last_name___' ) ) {
1058
+ $max_length = 'maxlength="50"';
1059
  }
1060
 
1061
  if ( $field_error ) {
1069
  $class_attr = 'class="' . implode( ' ', $classes ) . '"';
1070
  }
1071
 
1072
+ /* translators: 1: Required text, 2: Field type, 3: Field name, 4: Inline styles, 5: Field value, 6: Max length, 7: Placeholder, 8: Field class(es), 9: Field ID. */
1073
+ $field = '<input %1$s type="%2$s" name="%3$s" %4$s value="%5$s" %6$s %7$s %8$s %9$s />';
1074
  $markup .= sprintf(
1075
  $field,
1076
  $req_text,
1079
  $input_inline_styles,
1080
  $value,
1081
  $max_length,
1082
+ "placeholder=\"{$label}\"",
1083
  $class_attr,
1084
+ "id=\"{$field_id}\""
 
1085
  );
1086
 
1087
  // Reassign because if we want "field only", like for hidden inputs, we need to still pass a value that went through sprintf().
1088
  $field = $markup;
1089
 
1090
+ if ( ( 'bottom' === $label_placement || 'right' === $label_placement ) && ( 'submit' !== $type ) ) {
1091
  $markup .= '<span class="' . $label_placement_class . '">';
1092
  $markup .= $this->get_label( $field_id, $name . ' ' . $req_label );
1093
  $markup .= '</span>';
1106
  return $markup;
1107
  }
1108
 
1109
+ /**
1110
+ * Display hidden input field.
1111
+ *
1112
+ * @author Rebekah Van Epps <rebekah.vanepps@webdevstudios.com>
1113
+ * @since 1.9.0
1114
+ *
1115
+ * @param string $name Field name.
1116
+ * @param string $value Field value.
1117
+ * @return string HTML markup for field.
1118
+ */
1119
+ public function input_hidden( $name = '', $value = '' ) {
1120
+ return sprintf(
1121
+ /* translators: 1: Field name, 2: Field value. */
1122
+ '<input type="hidden" name="%1$s" value="%2$s" />',
1123
+ sanitize_text_field( $name ),
1124
+ sanitize_text_field( $value )
1125
+ );
1126
+ }
1127
+
1128
  /**
1129
  * Checkbox field helper method.
1130
  *
1131
  * @since 1.0.0
1132
+ * @since 1.9.0 Updated params to mirror text inputs and updated output to work with multicheck.
1133
+ *
1134
+ * @param string $name ID of form field.
1135
+ * @param string $id ID attribute value.
1136
+ * @param string|array $value Value of field.
1137
+ * @param string $label label text for input.
1138
+ * @param boolean $req If field required.
1139
+ * @param boolean $field_error Field error.
1140
+ * @param int $form_id Current form ID.
1141
+ * @param string $label_placement Where to place the label.
1142
+ * @param int $instance Current form instance.
1143
+ * @return string HTML markup for checkbox.
1144
  */
1145
+ public function checkbox( $name = '', $id = '', $value = '', $label = '', $req = false, $field_error = false, $form_id = 0, $label_placement = '', $instance = 0 ) {
1146
+ $name = sanitize_text_field( $name );
1147
+ $field_key = sanitize_title( $id );
1148
+ $field_id = "{$field_key}_{$instance}";
1149
+ $label_placement_class = 'ctct-label-top';
1150
+ $value = is_array( $value ) ? array_map( 'sanitize_text_field', $value ) : sanitize_text_field( $value );
1151
+ $value = is_array( $value ) ? $value : [ $value ];
1152
+ $label = esc_attr( $label );
1153
+ $type = 'checkbox';
1154
+ $classes = [
1155
+ 'ctct-' . esc_attr( $type ),
1156
+ 'ctct-label-right',
1157
+ ];
1158
 
1159
  /**
1160
  * Filter to add classes for the rendering input.
1161
  *
1162
  * @since 1.2.0
1163
+ * @param array $classes Array of classes to apply to the field.
1164
+ * @param string $type The field type being rendered.
1165
+ * @param int $form_id Form ID.
1166
+ * @param int $field_key Field ID.
1167
  * @return array
1168
  */
1169
+ $classes = apply_filters( 'constant_contact_input_classes', $classes, $type, $form_id, $field_key );
1170
+
1171
+ $markup = $this->field_top( $type, $name, $field_key, $label, $req, true, 'div' );
1172
+ $class_attr = 'class="' . implode( ' ', $classes ) . '"';
1173
+
1174
+ $markup .= '<fieldset>';
1175
+ $markup .= '<legend class="' . $label_placement_class . '">';
1176
+ $markup .= $name;
1177
+ $markup .= '</legend>';
1178
+
1179
+ $key_pieces = explode( '___', $field_key );
1180
+ $total = count( $value );
1181
+ $count = 0;
1182
+
1183
+ for ( $i = 0; $i < $total; $i++ ) {
1184
+ $input_label = $value[ $i ];
1185
+
1186
+ // Retrieve list names for label.
1187
+ if ( 'lists' === $key_pieces[0] ) {
1188
+ $list = get_posts( [
1189
+ 'numberposts' => 1,
1190
+ 'post_type' => 'ctct_lists',
1191
+ 'meta_key' => '_ctct_list_id',
1192
+ 'meta_value' => $input_label,
1193
+ ] );
1194
+
1195
+ // Skip list IDs that don't have corresponding post.
1196
+ if ( empty( $list ) ) {
1197
+ continue;
1198
+ }
1199
+
1200
+ $input_label = reset( $list )->post_title;
1201
+ }
1202
+
1203
+ $markup .= sprintf(
1204
+ '<input type="%s" name="%s[]" id="%s" value="%s" %s %s />',
1205
+ $type,
1206
+ $field_key,
1207
+ "{$field_id}_{$i}",
1208
+ $value[ $i ],
1209
+ $class_attr,
1210
+ 0 === $count ? 'checked' : ''
1211
+ );
1212
+ $markup .= '<span class="ctct-label-right">';
1213
+ $markup .= $this->get_label( "{$field_id}_{$i}", $input_label );
1214
+ $markup .= '</span>';
1215
+
1216
+ if ( $i < ( count( $value ) - 1 ) ) {
1217
+ $markup .= '<br />';
1218
+ }
1219
 
1220
+ $count++;
1221
+ }
1222
+
1223
+ $markup .= '</fieldset>';
1224
+
1225
+ if ( $field_error ) {
1226
+ $markup .= $this->field_bottom( $field_id, $field_error, true, 'div' );
1227
+ } else {
1228
+ $markup .= $this->field_bottom( '', '', true, 'div' );
1229
+ }
1230
+
1231
+ // If only one list displayed, hide input.
1232
+ if ( 'lists' === $key_pieces[0] && $count <= 1 ) {
1233
+ $markup = "<div style='display:none;'>{$markup}</div>";
1234
+ }
1235
 
1236
  return $markup;
1237
  }
1308
  public function optin_display( $optin, $instance = 0 ) {
1309
 
1310
  $label = sanitize_text_field( isset( $optin['instructions'] ) ? $optin['instructions'] : '' );
 
1311
 
1312
  $show = false;
1313
  if ( isset( $optin['show'] ) && 'on' === $optin['show'] ) {
1320
  $markup = '<div class="ctct-optin-hide" style="display:none;">';
1321
  }
1322
 
1323
+ $markup .= $this->get_optin_markup( $label, true, $show, $instance );
1324
 
1325
  if ( ! $show ) {
1326
  $markup .= '</div><!--.ctct-optin-hide -->';
1945
  * @return string HTML markup for instance field.
1946
  */
1947
  protected function create_instance_field( $instance ) {
1948
+ return $this->input_hidden( 'ctct-instance', absint( $instance ) );
 
1949
  }
1950
  }
includes/class-gutenberg.php CHANGED
@@ -85,7 +85,7 @@ class ConstantContact_Gutenberg {
85
  }
86
 
87
  ob_start();
88
- echo constant_contact_get_form( absint( $attributes['selectedForm'] ) ); // WPCS: XSS OK.
89
  return ob_get_clean();
90
  }
91
  }
85
  }
86
 
87
  ob_start();
88
+ echo constant_contact_get_form( absint( $attributes['selectedForm'] ) ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- XSS OK.
89
  return ob_get_clean();
90
  }
91
  }
includes/class-lists.php CHANGED
@@ -348,11 +348,23 @@ class ConstantContact_Lists {
348
  /**
349
  * Hook when a ctct list is updated.
350
  *
 
 
351
  * @since 1.0.0
352
  *
353
  * @param array $lists_to_insert CTCT returned list data.
354
  */
355
- do_action( 'ctct_sync_lists', $lists_to_insert );
 
 
 
 
 
 
 
 
 
 
356
  }
357
 
358
  /**
@@ -474,13 +486,27 @@ class ConstantContact_Lists {
474
  /**
475
  * Hook when a ctct list is saved.
476
  *
 
 
477
  * @since 1.0.0
478
  *
479
  * @param integer $post_id CPT post id.
480
  * @param integer $list_id Ctct list id.
481
  * @param array $list Ctct returned list data.
482
  */
483
- do_action( 'ctct_update_list', $ctct_list->ID, $list_id, $list );
 
 
 
 
 
 
 
 
 
 
 
 
484
 
485
  return is_object( $list ) && isset( $list->id );
486
  }
@@ -623,15 +649,11 @@ class ConstantContact_Lists {
623
  ]
624
  );
625
 
626
- /**
627
- * Hook when a ctct list is updated.
628
- *
629
- * @since 1.0.0
630
- * @param integer $post_id CPT post id.
631
- * @param integer $list_id Ctct list id.
632
- * @param array $list Ctct returned list data.
633
- */
634
- do_action( 'ctct_update_list', $ctct_list->ID, $list_id, $list );
635
 
636
  return is_object( $list ) && isset( $list->id );
637
  }
@@ -667,12 +689,25 @@ class ConstantContact_Lists {
667
  /**
668
  * Hook when a ctct list is deleted.
669
  *
 
 
670
  * @since 1.0.0
671
  *
672
  * @param integer $post_id Form list ID that was deleted.
673
  * @param integer $list_id Constant Contact list ID.
674
  */
675
- do_action( 'ctct_delete_list', $post_id, $list_id );
 
 
 
 
 
 
 
 
 
 
 
676
 
677
  return $list;
678
  }
348
  /**
349
  * Hook when a ctct list is updated.
350
  *
351
+ * @deprecated 1.9.0 Deprecated in favor of properly-prefixed hookname.
352
+ *
353
  * @since 1.0.0
354
  *
355
  * @param array $lists_to_insert CTCT returned list data.
356
  */
357
+ do_action_deprecated( 'ctct_sync_lists', [ $lists_to_insert ], '1.9.0', 'constant_contact_sync_lists' );
358
+
359
+ /**
360
+ * Fires after lists synced.
361
+ *
362
+ * @author Rebekah Van Epps <rebekah.vanepp@webdevstudios.com>
363
+ * @since 1.9.0
364
+ *
365
+ * @param array $lists_to_insert Synced Constant Contact lists.
366
+ */
367
+ do_action( 'constant_contact_sync_lists', $lists_to_insert );
368
  }
369
 
370
  /**
486
  /**
487
  * Hook when a ctct list is saved.
488
  *
489
+ * @deprecated 1.9.0 Deprecated in favor of properly-prefixed hookname.
490
+ *
491
  * @since 1.0.0
492
  *
493
  * @param integer $post_id CPT post id.
494
  * @param integer $list_id Ctct list id.
495
  * @param array $list Ctct returned list data.
496
  */
497
+ do_action_deprecated( 'ctct_update_list', [ $ctct_list->ID, $list_id, $list ], '1.9.0', 'constant_contact_update_list' );
498
+
499
+ /**
500
+ * Fires when a list is updated.
501
+ *
502
+ * @author Rebekah Van Epps <rebekah.vanepp@webdevstudios.com>
503
+ * @since 1.9.0
504
+ *
505
+ * @param integer $post_id Form post ID.
506
+ * @param integer $list_id CTCT list ID.
507
+ * @param array $list CTCT list data.
508
+ */
509
+ do_action( 'constant_contact_update_list', $ctct_list->ID, $list_id, $list );
510
 
511
  return is_object( $list ) && isset( $list->id );
512
  }
649
  ]
650
  );
651
 
652
+ /* This deprecated filter is documented in includes/class-lists.php */
653
+ do_action_deprecated( 'ctct_update_list', [ $ctct_list->ID, $list_id, $list ], '1.9.0', 'constant_contact_update_list' );
654
+
655
+ /* This filter is documented in includes/class-lists.php */
656
+ do_action( 'constant_contact_update_list', $ctct_list->ID, $list_id, $list );
 
 
 
 
657
 
658
  return is_object( $list ) && isset( $list->id );
659
  }
689
  /**
690
  * Hook when a ctct list is deleted.
691
  *
692
+ * @deprecated 1.9.0 Deprecated in favor of properly-prefixed hookname.
693
+ *
694
  * @since 1.0.0
695
  *
696
  * @param integer $post_id Form list ID that was deleted.
697
  * @param integer $list_id Constant Contact list ID.
698
  */
699
+ do_action_deprecated( 'ctct_delete_list', [ $post_id, $list_id ], '1.9.0', 'constant_contact_delete_list' );
700
+
701
+ /**
702
+ * Fires when a list is deleted.
703
+ *
704
+ * @author Rebekah Van Epps <rebekah.vanepp@webdevstudios.com>
705
+ * @since 1.9.0
706
+ *
707
+ * @param integer $post_id Form post ID.
708
+ * @param integer $list_id CTCT list ID.
709
+ */
710
+ do_action( 'constant_contact_delete_list', $post_id, $list_id );
711
 
712
  return $list;
713
  }
includes/class-logging.php CHANGED
@@ -166,7 +166,7 @@ class ConstantContact_Logging {
166
  */
167
  public function add_options_page() {
168
 
169
- $debugging_enabled = ctct_get_settings_option( '_ctct_logging', '' );
170
 
171
  if ( 'on' !== $debugging_enabled ) {
172
  return;
@@ -185,6 +185,12 @@ class ConstantContact_Logging {
185
  );
186
  }
187
 
 
 
 
 
 
 
188
  public function set_file_system() {
189
  global $wp_filesystem;
190
  WP_Filesystem();
@@ -226,8 +232,7 @@ class ConstantContact_Logging {
226
  }
227
 
228
  if ( is_file( $this->log_location_file ) && is_readable( $this->log_location_file ) ) {
229
- // phpcs:ignore -- Not reading over network, it's on the filesystem.
230
- $contents .= file_get_contents( $this->log_location_file );
231
  }
232
 
233
  ?>
@@ -441,6 +446,7 @@ class ConstantContact_Logging {
441
  * @author Rebekah Van Epps <rebekah.vanepps@webdevstudios.com>
442
  * @since 1.8.2
443
  *
 
444
  * @return void
445
  */
446
  protected function delete_log_dir( $dir = '' ) {
166
  */
167
  public function add_options_page() {
168
 
169
+ $debugging_enabled = constant_contact_get_option( '_ctct_logging', '' );
170
 
171
  if ( 'on' !== $debugging_enabled ) {
172
  return;
185
  );
186
  }
187
 
188
+ /**
189
+ * Set file system.
190
+ *
191
+ * @author Michael Beckwith <michael@webdevstudios.com>
192
+ * @since 1.4.5
193
+ */
194
  public function set_file_system() {
195
  global $wp_filesystem;
196
  WP_Filesystem();
232
  }
233
 
234
  if ( is_file( $this->log_location_file ) && is_readable( $this->log_location_file ) ) {
235
+ $contents .= file_get_contents( $this->log_location_file ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents -- Not reading over network, it's on the filesystem.
 
236
  }
237
 
238
  ?>
446
  * @author Rebekah Van Epps <rebekah.vanepps@webdevstudios.com>
447
  * @since 1.8.2
448
  *
449
+ * @param string $dir Directory path.
450
  * @return void
451
  */
452
  protected function delete_log_dir( $dir = '' ) {
includes/class-mail.php CHANGED
@@ -65,7 +65,7 @@ class ConstantContact_Mail {
65
 
66
  if ( $add_to_opt_in && constant_contact()->api->is_connected() ) {
67
 
68
- $maybe_bypass = ctct_get_settings_option( '_ctct_bypass_cron', '' );
69
 
70
  if ( 'on' !== $maybe_bypass ) {
71
  /**
@@ -88,6 +88,7 @@ class ConstantContact_Mail {
88
  $submission_details['form_id'] = $values['ctct-id']['value'];
89
  $submission_details['submitted_email'] = $this->get_user_email_from_submission( $values );
90
 
 
91
  $values = constant_contact()->process_form->pretty_values( $values );
92
 
93
  $email_values = $this->format_values_for_email( $values, $submission_details['form_id'] );
@@ -108,13 +109,9 @@ class ConstantContact_Mail {
108
  // phpcs:enable WordPress.Security.NonceVerification
109
  }
110
 
111
- // This would allow for setting each sections error and also allow for returning early again for cases
112
- // like having a list, but not needing to opt in.
113
- $has_list = get_post_meta( $submission_details['form_id'], '_ctct_list', true );
114
-
115
  $emails_disabled = constant_contact_emails_disabled( $submission_details['form_id'] );
116
 
117
- if ( ( ! constant_contact()->api->is_connected() || empty( $has_list ) ) && $emails_disabled ) {
118
 
119
  // If we're not connected or have no list set AND we've disabled. Override.
120
  $submission_details['list-available'] = 'no';
@@ -136,8 +133,8 @@ class ConstantContact_Mail {
136
  *
137
  * @since 1.0.0
138
  *
139
- * @param array $values Submitted values.
140
- * @return object|null Response from API.
141
  */
142
  public function opt_in_user( $values ) {
143
 
@@ -146,24 +143,29 @@ class ConstantContact_Mail {
146
  $orig = sanitize_text_field( isset( $val['orig_key'] ) ? $val['orig_key'] : '' );
147
  $val = sanitize_text_field( isset( $val['value'] ) ? $val['value'] : '' );
148
 
149
- if ( $key && ( 'ctct-opt-in' !== $key ) && ( 'ctct-id' !== $key ) ) {
 
 
150
 
151
- $args[ $orig ] = [
152
- 'key' => $key,
153
- 'val' => $val,
154
- ];
155
 
156
- if ( 'email' === $key ) {
157
- $args['email'] = $val;
158
- }
159
  }
160
  }
161
 
162
- if ( isset( $values['ctct-opt-in'] ) && isset( $values['ctct-opt-in']['value'] ) ) {
163
- $args['list'] = sanitize_text_field( $values['ctct-opt-in']['value'] );
164
-
165
- return constantcontact_api()->add_contact( $args, $values['ctct-id']['value'] );
166
  }
 
 
 
 
 
 
167
  }
168
 
169
  /**
@@ -237,7 +239,7 @@ class ConstantContact_Mail {
237
  * @since 1.0.0
238
  * @since 1.3.6 Added $was_forced.
239
  *
240
- * @throws Exception
241
  *
242
  * @param string $destination_email Intended mail address.
243
  * @param string $content Data from clean values.
@@ -248,7 +250,7 @@ class ConstantContact_Mail {
248
  public function mail( $destination_email, $content, $submission_details, $was_forced = false ) {
249
 
250
  static $last_sent = false;
251
- $screen = '';
252
 
253
  if ( function_exists( 'get_current_screen' ) ) {
254
  $screen = get_current_screen();
@@ -267,7 +269,7 @@ class ConstantContact_Mail {
267
  } else {
268
  if ( false !== strpos( $destination_email, ',' ) ) {
269
  // Use trim to handle cases of ", ".
270
- $partials = array_map( 'trim', explode( ',', $destination_email ) );
271
  $partial_email = array_map( [ $this, 'get_email_part' ], $partials );
272
  $partial_email = implode( ',', $partial_email );
273
  } else {
@@ -448,7 +450,7 @@ class ConstantContact_Mail {
448
 
449
  return sprintf(
450
  /* Translators: placeholders simply meant for `<strong>` html tags */
451
- '<p>' . esc_html__( '%1\$sNote:%2\$s You have disabled admin email notifications under the plugin settings, but are receiving this email because of the following reason.', 'constant-contact-forms' ) . '</p>',
452
  '<strong>*',
453
  '</strong>'
454
  );
65
 
66
  if ( $add_to_opt_in && constant_contact()->api->is_connected() ) {
67
 
68
+ $maybe_bypass = constant_contact_get_option( '_ctct_bypass_cron', '' );
69
 
70
  if ( 'on' !== $maybe_bypass ) {
71
  /**
88
  $submission_details['form_id'] = $values['ctct-id']['value'];
89
  $submission_details['submitted_email'] = $this->get_user_email_from_submission( $values );
90
 
91
+ $lists = isset( $values['ctct-lists'] ) ? $values['ctct-lists'] : [];
92
  $values = constant_contact()->process_form->pretty_values( $values );
93
 
94
  $email_values = $this->format_values_for_email( $values, $submission_details['form_id'] );
109
  // phpcs:enable WordPress.Security.NonceVerification
110
  }
111
 
 
 
 
 
112
  $emails_disabled = constant_contact_emails_disabled( $submission_details['form_id'] );
113
 
114
+ if ( ( ! constant_contact()->api->is_connected() || empty( $lists ) ) && $emails_disabled ) {
115
 
116
  // If we're not connected or have no list set AND we've disabled. Override.
117
  $submission_details['list-available'] = 'no';
133
  *
134
  * @since 1.0.0
135
  *
136
+ * @param array $values Submitted values.
137
+ * @return array|void Response from API.
138
  */
139
  public function opt_in_user( $values ) {
140
 
143
  $orig = sanitize_text_field( isset( $val['orig_key'] ) ? $val['orig_key'] : '' );
144
  $val = sanitize_text_field( isset( $val['value'] ) ? $val['value'] : '' );
145
 
146
+ if ( empty( $key ) || in_array( $key, [ 'ctct-opt-in', 'ctct-id', 'ctct-lists' ], true ) ) {
147
+ continue;
148
+ }
149
 
150
+ $args[ $orig ] = [
151
+ 'key' => $key,
152
+ 'val' => $val,
153
+ ];
154
 
155
+ if ( 'email' === $key ) {
156
+ $args['email'] = $val;
 
157
  }
158
  }
159
 
160
+ if ( ! isset( $values['ctct-opt-in'] ) || ! isset( $values['ctct-lists'] ) || empty( $values['ctct-lists'] ) ) {
161
+ return;
 
 
162
  }
163
+
164
+ $lists = isset( $values['ctct-lists'] ) ? $values['ctct-lists'] : [];
165
+ $lists = isset( $lists['value'] ) ? $lists['value'] : [];
166
+ $args['list'] = is_array( $lists ) ? array_map( 'sanitize_text_field', $lists ) : sanitize_text_field( $lists );
167
+
168
+ return constantcontact_api()->add_contact( $args, $values['ctct-id']['value'] );
169
  }
170
 
171
  /**
239
  * @since 1.0.0
240
  * @since 1.3.6 Added $was_forced.
241
  *
242
+ * @throws Exception Throws Exception if encountered while attempting to send email.
243
  *
244
  * @param string $destination_email Intended mail address.
245
  * @param string $content Data from clean values.
250
  public function mail( $destination_email, $content, $submission_details, $was_forced = false ) {
251
 
252
  static $last_sent = false;
253
+ $screen = '';
254
 
255
  if ( function_exists( 'get_current_screen' ) ) {
256
  $screen = get_current_screen();
269
  } else {
270
  if ( false !== strpos( $destination_email, ',' ) ) {
271
  // Use trim to handle cases of ", ".
272
+ $partials = array_map( 'trim', explode( ',', $destination_email ) );
273
  $partial_email = array_map( [ $this, 'get_email_part' ], $partials );
274
  $partial_email = implode( ',', $partial_email );
275
  } else {
450
 
451
  return sprintf(
452
  /* Translators: placeholders simply meant for `<strong>` html tags */
453
+ '<p>' . esc_html__( '%1$sNote:%2$s You have disabled admin email notifications under the plugin settings, but are receiving this email because of the following reason.', 'constant-contact-forms' ) . '</p>',
454
  '<strong>*',
455
  '</strong>'
456
  );
includes/class-middleware.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
  /**
 
 
3
  * @package ConstantContact
4
  * @subpackage Middleware
5
  * @author Constant Contact
@@ -58,8 +60,8 @@ class ConstantContact_Middleware {
58
  *
59
  * @since 1.0.0
60
  *
61
- * @param string $proof Proof key
62
- * @return string Signup/connect url.
63
  */
64
  public function do_signup_url( $proof = '' ) {
65
  return $this->do_connect_url( $proof, [ 'new_signup' => true ] );
@@ -129,19 +131,24 @@ class ConstantContact_Middleware {
129
  /**
130
  * Verify a returned request from the auth server, and save the returned token.
131
  *
132
- * @throws Exception
 
 
133
  *
134
  * @return boolean Is valid?
135
  */
136
  public function verify_and_save_access_token_return() {
 
 
 
137
 
138
  // If we get this, we'll want to start our process of
139
  // verifying the proof that the middleware server gives us
140
  // so that we can ignore any malicious entries that are sent to us
141
- // Sanitize our expected data
142
- $proof = isset( $_GET['proof'] ) ? sanitize_text_field( wp_unslash( $_GET['proof'] ) ) : false;
143
- $token = isset( $_GET['token'] ) ? sanitize_text_field( wp_unslash( $_GET['token'] ) ) : false;
144
- $key = isset( $_GET['key'] ) ? sanitize_text_field( wp_unslash( $_GET['key'] ) ) : false;
145
 
146
  // If we're missing any piece of data, we failed.
147
  if ( ! $proof || ! $token || ! $key ) {
@@ -156,7 +163,7 @@ class ConstantContact_Middleware {
156
 
157
  constant_contact_maybe_log_it( 'Authentication', 'Authorization verification succeeded.' );
158
 
159
- constant_contact()->connect->update_token( sanitize_text_field( $token ) );
160
  constant_contact()->connect->e_set( '_ctct_api_key', sanitize_text_field( $key ) );
161
  return true;
162
  }
1
  <?php
2
  /**
3
+ * Constant Contact Middleware.
4
+ *
5
  * @package ConstantContact
6
  * @subpackage Middleware
7
  * @author Constant Contact
60
  *
61
  * @since 1.0.0
62
  *
63
+ * @param string $proof Proof key.
64
+ * @return string Signup/connect url.
65
  */
66
  public function do_signup_url( $proof = '' ) {
67
  return $this->do_connect_url( $proof, [ 'new_signup' => true ] );
131
  /**
132
  * Verify a returned request from the auth server, and save the returned token.
133
  *
134
+ * @since 1.0.0
135
+ *
136
+ * @throws Exception Throws Exception if encountered while attempting to verify request.
137
  *
138
  * @return boolean Is valid?
139
  */
140
  public function verify_and_save_access_token_return() {
141
+ $proof = filter_input( INPUT_GET, 'proof', FILTER_SANITIZE_STRING );
142
+ $token = filter_input( INPUT_GET, 'token', FILTER_SANITIZE_STRING );
143
+ $key = filter_input( INPUT_GET, 'key', FILTER_SANITIZE_STRING );
144
 
145
  // If we get this, we'll want to start our process of
146
  // verifying the proof that the middleware server gives us
147
  // so that we can ignore any malicious entries that are sent to us
148
+ // Sanitize our expected data.
149
+ $proof = ! empty( $proof ) ? sanitize_text_field( $proof ) : false;
150
+ $token = ! empty( $token ) ? sanitize_text_field( $token ) : false;
151
+ $key = ! empty( $key ) ? sanitize_text_field( $key ) : false;
152
 
153
  // If we're missing any piece of data, we failed.
154
  if ( ! $proof || ! $token || ! $key ) {
163
 
164
  constant_contact_maybe_log_it( 'Authentication', 'Authorization verification succeeded.' );
165
 
166
+ constant_contact()->connect->update_token( sanitize_text_field( $token ) );
167
  constant_contact()->connect->e_set( '_ctct_api_key', sanitize_text_field( $key ) );
168
  return true;
169
  }
includes/class-notification-content.php CHANGED
@@ -53,9 +53,9 @@ class ConstantContact_Notification_Content {
53
  <?php
54
  printf(
55
 
56
- // translators: Placeholder will hold "Constan Contact Forms" with <strong> tags.
57
  esc_attr__( 'Get the most out of the %s plugin &mdash; use it with an active Constant Contact account.', 'constant-contact-forms' ),
58
- '<strong>' . esc_attr__( 'Constant Contact Forms' ) . '</strong>'
59
  );
60
  ?>
61
  </p>
@@ -228,7 +228,7 @@ class ConstantContact_Notification_Content {
228
  );
229
 
230
  $reference_keys = array_keys( $references );
231
- $last_key = array_pop( $reference_keys );
232
 
233
  array_walk( $references, function( $value, $key, $last_key ) {
234
  if ( 'post' === $value['type'] ) {
@@ -240,7 +240,7 @@ class ConstantContact_Notification_Content {
240
  esc_html( $value['id'] ),
241
  esc_html( $key === $last_key ? '' : ', ' )
242
  );
243
- } else if ( 'widget' === $value['type'] ) {
244
  printf(
245
  /* Translators: 1: URL to widgets admin screen, 2: current widget name, 3: generic widget text, 4: current widget title, 5: preposition, 6: specific sidebar name, 7: separator between links. */
246
  '<a href="%1$s">%2$s %3$s "%4$s" %5$s %6$s</a>%7$s',
53
  <?php
54
  printf(
55
 
56
+ // translators: Placeholder will hold "Constant Contact Forms" with <strong> tags.
57
  esc_attr__( 'Get the most out of the %s plugin &mdash; use it with an active Constant Contact account.', 'constant-contact-forms' ),
58
+ '<strong>' . esc_attr__( 'Constant Contact Forms', 'constant-contact-forms' ) . '</strong>'
59
  );
60
  ?>
61
  </p>
228
  );
229
 
230
  $reference_keys = array_keys( $references );
231
+ $last_key = array_pop( $reference_keys );
232
 
233
  array_walk( $references, function( $value, $key, $last_key ) {
234
  if ( 'post' === $value['type'] ) {
240
  esc_html( $value['id'] ),
241
  esc_html( $key === $last_key ? '' : ', ' )
242
  );
243
+ } elseif ( 'widget' === $value['type'] ) {
244
  printf(
245
  /* Translators: 1: URL to widgets admin screen, 2: current widget name, 3: generic widget text, 4: current widget title, 5: preposition, 6: specific sidebar name, 7: separator between links. */
246
  '<a href="%1$s">%2$s %3$s "%4$s" %5$s %6$s</a>%7$s',
includes/class-notifications.php CHANGED
@@ -342,7 +342,7 @@ class ConstantContact_Notifications {
342
 
343
  $is_true = ( ( 'true' === $option ) || ( '1' === $option ) );
344
 
345
- return $is_true ?: false ;
346
  }
347
 
348
  /**
342
 
343
  $is_true = ( ( 'true' === $option ) || ( '1' === $option ) );
344
 
345
+ return $is_true ?: false;
346
  }
347
 
348
  /**
includes/class-process-form.php CHANGED
@@ -54,20 +54,18 @@ class ConstantContact_Process_Form {
54
  * A wrapper to process our form via AJAX.
55
  *
56
  * @since 1.0.0
 
 
57
  */
58
  public function process_form_ajax_wrapper() {
59
 
60
  // See if we're passed in data.
61
- //
62
- // We set to ignore this from PHPCS, as our nonce is handled elsewhere
63
- // @codingStandardsIgnoreLine
64
- if ( isset( $_POST['data'] ) ) { // Input var okay.
65
 
66
- // Form data comes over serialzied, so break it apart
67
- //
68
- // We set to ignore this from PHPCS, as our nonce is handled elsewhere
69
- // @codingStandardsIgnoreLine
70
- $data = explode( '&', $_POST['data'] );
71
 
72
  // Finish converting that ajax data to something we can use.
73
  $json_data = [];
@@ -75,6 +73,10 @@ class ConstantContact_Process_Form {
75
  if ( is_array( $data ) ) {
76
  foreach ( $data as $field ) {
77
 
 
 
 
 
78
  // @codingStandardsIgnoreStart
79
  // Our data looks like this:
80
  // Array (
@@ -87,8 +89,19 @@ class ConstantContact_Process_Form {
87
  $exp_fields = explode( '=', $field, 2 );
88
 
89
  if ( isset( $exp_fields[0] ) && $exp_fields[0] ) {
90
- $value = urldecode( isset( $exp_fields[1] ) ? $exp_fields[1] : '' );
91
- $json_data[ esc_attr( $exp_fields[0] ) ] = sanitize_text_field( $value );
 
 
 
 
 
 
 
 
 
 
 
92
  }
93
  }
94
  }
@@ -110,10 +123,13 @@ class ConstantContact_Process_Form {
110
  switch ( $status ) {
111
 
112
  case 'success':
 
 
 
 
 
113
  /** This filter is documented in includes/class-process-form.php */
114
- $message = esc_html ( apply_filters( 'ctct_process_form_success',
115
- __( 'Your information has been submitted.', 'constant-contact-forms' ),
116
- (int) $json_data['ctct-id'] ) );
117
  break;
118
 
119
  case 'error':
@@ -149,9 +165,10 @@ class ConstantContact_Process_Form {
149
  /**
150
  * Process submitted form data.
151
  *
 
152
  * @since 1.0.0
153
  *
154
- * @throws Exception
155
  *
156
  * @param array $data Form data.
157
  * @param bool $is_ajax Whether or not processing via AJAX.
@@ -209,19 +226,35 @@ class ConstantContact_Process_Form {
209
  $keys = $ctctrecaptcha->get_recaptcha_keys();
210
  $ctctrecaptcha->set_recaptcha_class( new ReCaptcha( $keys['secret_key'], $method ) );
211
 
212
- $ctctrecaptcha->recaptcha->setExpectedHostname( parse_url( home_url(), PHP_URL_HOST ) );
213
  if ( 'v3' === $ctctrecaptcha->get_recaptcha_version() ) {
 
214
  /**
215
  * Filters the default float value for the score threshold.
216
  *
217
  * This value should be between 0.0 and 1.0.
218
  *
 
 
219
  * @since 1.7.0
220
  *
221
  * @param float $value Threshold to require for submission approval.
222
  * @param string $value The ID of the form that was submitted.
223
  */
224
- $threshold = (float) apply_filters( 'ctct_recaptcha_threshold', 0.5, $data['ctct-id'] );
 
 
 
 
 
 
 
 
 
 
 
 
 
225
 
226
  $ctctrecaptcha->recaptcha->setScoreThreshold( $threshold );
227
  $ctctrecaptcha->recaptcha->setExpectedAction( 'constantcontactsubmit' );
@@ -248,6 +281,7 @@ class ConstantContact_Process_Form {
248
  /**
249
  * Filters whether or not we think an entry is spam.
250
  *
 
251
  * @since 1.3.2
252
  *
253
  * @param bool $value Whether or not we thing an entry is spam. Default not spam.
@@ -298,7 +332,7 @@ class ConstantContact_Process_Form {
298
 
299
  foreach ( $data as $key => $value ) {
300
 
301
- if ( ! is_string( $value ) ) {
302
  continue;
303
  }
304
 
@@ -308,7 +342,7 @@ class ConstantContact_Process_Form {
308
 
309
  $return['values'][] = [
310
  'key' => sanitize_text_field( $key ),
311
- 'value' => sanitize_text_field( $value ),
312
  ];
313
  }
314
 
@@ -316,7 +350,17 @@ class ConstantContact_Process_Form {
316
  return;
317
  }
318
 
319
- $field_errors = $this->get_field_errors( $this->clean_values( $return['values'] ), $is_ajax );
 
 
 
 
 
 
 
 
 
 
320
 
321
  if ( is_array( $field_errors ) && ! empty( $field_errors ) ) {
322
 
@@ -332,7 +376,7 @@ class ConstantContact_Process_Form {
332
  } else {
333
 
334
  // No need to check for opt in status because we would have returned early by now if false.
335
- $maybe_bypass = ctct_get_settings_option( '_ctct_bypass_cron', '' );
336
 
337
  if ( constant_contact()->api->is_connected() && 'on' === $maybe_bypass ) {
338
  constant_contact()->mail->submit_form_values( $return['values'] ); // Emails but doesn't schedule cron.
@@ -362,6 +406,7 @@ class ConstantContact_Process_Form {
362
  /**
363
  * Pretty our values up.
364
  *
 
365
  * @since 1.0.0
366
  *
367
  * @param array $values Original values.
@@ -434,6 +479,7 @@ class ConstantContact_Process_Form {
434
  /**
435
  * Gets our original field from a form id.
436
  *
 
437
  * @since 1.0.0
438
  *
439
  * @param int $form_id Form id.
@@ -467,38 +513,40 @@ class ConstantContact_Process_Form {
467
  'required' => isset( $field['_ctct_required_field'] ) && $field['_ctct_required_field'],
468
  ];
469
 
 
 
470
  switch ( $field['_ctct_map_select'] ) {
471
  case 'address':
472
- $return[ 'street_address___' . md5( serialize( $field_key ) ) ] = $field_key;
473
- $return[ 'street_address___' . md5( serialize( $field_key ) ) ]['_ctct_map_select'] = 'street';
474
 
475
- $return[ 'line_2_address___' . md5( serialize( $field_key ) ) ] = $field_key;
476
- $return[ 'line_2_address___' . md5( serialize( $field_key ) ) ]['_ctct_map_select'] = 'line_2';
477
 
478
- $return[ 'city_address___' . md5( serialize( $field_key ) ) ] = $field_key;
479
- $return[ 'city_address___' . md5( serialize( $field_key ) ) ]['_ctct_map_select'] = 'city';
480
 
481
- $return[ 'state_address___' . md5( serialize( $field_key ) ) ] = $field_key;
482
- $return[ 'state_address___' . md5( serialize( $field_key ) ) ]['_ctct_map_select'] = 'state';
483
 
484
- $return[ 'zip_address___' . md5( serialize( $field_key ) ) ] = $field_key;
485
- $return[ 'zip_address___' . md5( serialize( $field_key ) ) ]['_ctct_map_select'] = 'zip';
486
 
487
  break;
488
  case 'anniversery':
489
  case 'birthday':
490
- $return[ 'month___' . md5( serialize( $field_key ) ) ] = $field_key;
491
- $return[ 'month___' . md5( serialize( $field_key ) ) ]['_ctct_map_select'] = 'month';
492
 
493
- $return[ 'day___' . md5( serialize( $field_key ) ) ] = $field_key;
494
- $return[ 'day___' . md5( serialize( $field_key ) ) ]['_ctct_map_select'] = 'day';
495
 
496
- $return[ 'year___' . md5( serialize( $field_key ) ) ] = $field_key;
497
- $return[ 'year___' . md5( serialize( $field_key ) ) ]['_ctct_map_select'] = 'year';
498
 
499
  break;
500
  default:
501
- $return[ $field['_ctct_map_select'] . '___' . md5( serialize( $field_key ) ) ] = $field_key;
502
  break;
503
  }
504
  }
@@ -509,6 +557,7 @@ class ConstantContact_Process_Form {
509
  /**
510
  * Get field requirement errors.
511
  *
 
512
  * @since 1.0.0
513
  *
514
  * @param array $values Values.
@@ -568,6 +617,7 @@ class ConstantContact_Process_Form {
568
  /**
569
  * Clean our values from form submission.
570
  *
 
571
  * @since 1.0.0
572
  *
573
  * @param array $values Values to clean.
@@ -594,9 +644,12 @@ class ConstantContact_Process_Form {
594
  continue;
595
  }
596
 
597
- $return_values[ sanitize_text_field( $value['key'] ) ] = [
598
- 'key' => sanitize_text_field( $key_break[0] ),
599
- 'value' => sanitize_text_field( $value['value'] ),
 
 
 
600
  'orig_key' => $value['key'],
601
  ];
602
  }
@@ -607,9 +660,10 @@ class ConstantContact_Process_Form {
607
  /**
608
  * Form submit success/error messages.
609
  *
 
610
  * @since 1.0.0
611
  *
612
- * @throws Exception
613
  *
614
  * @param array $form_data Form data to process.
615
  * @param string|int $form_id Form ID being processed.
@@ -617,13 +671,14 @@ class ConstantContact_Process_Form {
617
  * @return false|array
618
  */
619
  public function process_wrapper( $form_data = [], $form_id = 0, $instance = 0 ) {
 
620
 
621
- if ( empty( $_POST['ctct-id'] ) ) {
622
  return false;
623
  }
624
 
625
  // @todo Utilize $form_data.
626
- if ( isset( $_POST['ctct-id'] ) && $form_id !== absint( $_POST['ctct-id'] ) ) {
627
  return false;
628
  }
629
 
@@ -648,12 +703,26 @@ class ConstantContact_Process_Form {
648
  /**
649
  * Filters the message for the successful processed form.
650
  *
651
- * @since 1.3.0
 
 
 
652
  *
653
- * @param string $value Success message.
654
- * @param string/int $form_id ID of the Constant Contact form being submitted to.
655
  */
656
- $message = esc_html ( apply_filters( 'ctct_process_form_success', __( 'Your information has been submitted.', 'constant-contact-forms' ), $form_id ) );
 
 
 
 
 
 
 
 
 
 
 
657
  break;
658
 
659
  case 'error':
@@ -686,6 +755,7 @@ class ConstantContact_Process_Form {
686
  /**
687
  * Increment a counter for processed form submissions.
688
  *
 
689
  * @since 1.2.2
690
  */
691
  public function increment_processed_form_count() {
@@ -697,6 +767,7 @@ class ConstantContact_Process_Form {
697
  /**
698
  * Check if we have all the required fields for a given form.
699
  *
 
700
  * @since 1.3.5
701
  *
702
  * @param int $form_id ID of form to verify.
@@ -727,6 +798,7 @@ class ConstantContact_Process_Form {
727
  /**
728
  * Gets the non-human error messeage dispalyed when we think there's a bot.
729
  *
 
730
  * @since 1.5.0
731
  * @param int $post_id The ID of the current post.
732
  * @return string
@@ -737,11 +809,26 @@ class ConstantContact_Process_Form {
737
  /**
738
  * Filter the error message displayed for suspected non-humans.
739
  *
 
 
 
740
  * @since 1.5.0
741
  * @param string $error The error message dispalyed.
742
  * @param mixed $post_id The ID of the current post.
743
  * @return string
744
  */
745
- return apply_filters( 'ctct_custom_spam_message', $error, $post_id );
 
 
 
 
 
 
 
 
 
 
 
 
746
  }
747
  }
54
  * A wrapper to process our form via AJAX.
55
  *
56
  * @since 1.0.0
57
+ *
58
+ * @return void|array Return array of error data if error encountered, void otherwise.
59
  */
60
  public function process_form_ajax_wrapper() {
61
 
62
  // See if we're passed in data.
63
+ // We set to ignore this from PHPCS, as our nonce is handled elsewhere.
64
+ if ( isset( $_POST['data'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
 
 
65
 
66
+ // Form data comes over serialzied, so break it apart.
67
+ // We set to ignore this from PHPCS, as our nonce is handled elsewhere.
68
+ $data = explode( '&', $_POST['data'] ); // phpcs:ignore WordPress.Security.NonceVerification.Missing
 
 
69
 
70
  // Finish converting that ajax data to something we can use.
71
  $json_data = [];
73
  if ( is_array( $data ) ) {
74
  foreach ( $data as $field ) {
75
 
76
+ // Decode characters in field string.
77
+ // Used to recover array field values.
78
+ $field = urldecode( $field );
79
+
80
  // @codingStandardsIgnoreStart
81
  // Our data looks like this:
82
  // Array (
89
  $exp_fields = explode( '=', $field, 2 );
90
 
91
  if ( isset( $exp_fields[0] ) && $exp_fields[0] ) {
92
+ $value = urldecode( isset( $exp_fields[1] ) ? $exp_fields[1] : '' );
93
+ $field_key = $exp_fields[0];
94
+
95
+ if ( stristr( $field_key, '[]' ) ) {
96
+ $field_key = explode( '[]', $field_key );
97
+ $field_key = $field_key[0];
98
+
99
+ $json_data[ esc_attr( $field_key ) ][] = sanitize_text_field( $value );
100
+
101
+ continue;
102
+ }
103
+
104
+ $json_data[ esc_attr( $field_key ) ] = sanitize_text_field( $value );
105
  }
106
  }
107
  }
123
  switch ( $status ) {
124
 
125
  case 'success':
126
+ $form_id = (int) $json_data['ctct-id'];
127
+
128
+ /* This deprecated filter is documented in includes/class-process-form.php */
129
+ $message = apply_filters_deprecated( 'ctct_process_form_success', [ __( 'Your information has been submitted.', 'constant-contact-forms' ), $form_id ], '1.9.0', 'constant_contact_process_form_success' );
130
+
131
  /** This filter is documented in includes/class-process-form.php */
132
+ $message = esc_html( apply_filters( 'constant_contact_process_form_success', $message, $form_id ) );
 
 
133
  break;
134
 
135
  case 'error':
165
  /**
166
  * Process submitted form data.
167
  *
168
+ * @author Brad Parbs <bradparbs@webdevstudios.com>
169
  * @since 1.0.0
170
  *
171
+ * @throws Exception Throws Exception if encountered while attempting to process form.
172
  *
173
  * @param array $data Form data.
174
  * @param bool $is_ajax Whether or not processing via AJAX.
226
  $keys = $ctctrecaptcha->get_recaptcha_keys();
227
  $ctctrecaptcha->set_recaptcha_class( new ReCaptcha( $keys['secret_key'], $method ) );
228
 
229
+ $ctctrecaptcha->recaptcha->setExpectedHostname( wp_parse_url( home_url(), PHP_URL_HOST ) );
230
  if ( 'v3' === $ctctrecaptcha->get_recaptcha_version() ) {
231
+
232
  /**
233
  * Filters the default float value for the score threshold.
234
  *
235
  * This value should be between 0.0 and 1.0.
236
  *
237
+ * @deprecated 1.9.0 Deprecated in favor of properly-prefixed hookname.
238
+ *
239
  * @since 1.7.0
240
  *
241
  * @param float $value Threshold to require for submission approval.
242
  * @param string $value The ID of the form that was submitted.
243
  */
244
+ $threshold = apply_filters_deprecated( 'ctct_recaptcha_threshold', [ 0.5, $data['ctct-id'] ], '1.9.0', 'constant_contact_recaptcha_threshold' );
245
+
246
+ /**
247
+ * Filters the default float value for the score threshold.
248
+ *
249
+ * This value should be between 0.0 and 1.0.
250
+ *
251
+ * @author Rebekah Van Epps <rebekah.vanepp@webdevstudios.com>
252
+ * @since 1.9.0
253
+ *
254
+ * @param float $value Required threshold value.
255
+ * @param string $value Form ID.
256
+ */
257
+ $threshold = (float) apply_filters( 'constant_contact_recaptcha_threshold', $threshold, $data['ctct-id'] );
258
 
259
  $ctctrecaptcha->recaptcha->setScoreThreshold( $threshold );
260
  $ctctrecaptcha->recaptcha->setExpectedAction( 'constantcontactsubmit' );
281
  /**
282
  * Filters whether or not we think an entry is spam.
283
  *
284
+ * @author Michael Beckwith <michael@webdevstudios.com>
285
  * @since 1.3.2
286
  *
287
  * @param bool $value Whether or not we thing an entry is spam. Default not spam.
332
 
333
  foreach ( $data as $key => $value ) {
334
 
335
+ if ( ! is_string( $value ) && ! is_array( $value ) ) {
336
  continue;
337
  }
338
 
342
 
343
  $return['values'][] = [
344
  'key' => sanitize_text_field( $key ),
345
+ 'value' => is_array( $value ) ? array_map( 'sanitize_text_field', $value ) : sanitize_text_field( $value ),
346
  ];
347
  }
348
 
350
  return;
351
  }
352
 
353
+ $cleaned_values = $this->clean_values( $return['values'] );
354
+
355
+ // Require at least one list to be selected.
356
+ if ( constant_contact()->api->is_connected() && ( ! isset( $cleaned_values['ctct-lists'] ) || empty( $cleaned_values['ctct-lists'] ) ) ) {
357
+ return [
358
+ 'status' => 'named_error',
359
+ 'error' => __( 'Please select at least one list to subscribe to.', 'constant-contact-forms' ),
360
+ ];
361
+ }
362
+
363
+ $field_errors = $this->get_field_errors( $cleaned_values, $is_ajax );
364
 
365
  if ( is_array( $field_errors ) && ! empty( $field_errors ) ) {
366
 
376
  } else {
377
 
378
  // No need to check for opt in status because we would have returned early by now if false.
379
+ $maybe_bypass = constant_contact_get_option( '_ctct_bypass_cron', '' );
380
 
381
  if ( constant_contact()->api->is_connected() && 'on' === $maybe_bypass ) {
382
  constant_contact()->mail->submit_form_values( $return['values'] ); // Emails but doesn't schedule cron.
406
  /**
407
  * Pretty our values up.
408
  *
409
+ * @author Brad Parbs <bradparbs@webdevstudios.com>
410
  * @since 1.0.0
411
  *
412
  * @param array $values Original values.
479
  /**
480
  * Gets our original field from a form id.
481
  *
482
+ * @author Brad Parbs <bradparbs@webdevstudios.com>
483
  * @since 1.0.0
484
  *
485
  * @param int $form_id Form id.
513
  'required' => isset( $field['_ctct_required_field'] ) && $field['_ctct_required_field'],
514
  ];
515
 
516
+ $hashed_key = md5( serialize( $field_key ) ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_serialize -- OK use of serialize().
517
+
518
  switch ( $field['_ctct_map_select'] ) {
519
  case 'address':
520
+ $return[ 'street_address___' . $hashed_key ] = $field_key;
521
+ $return[ 'street_address___' . $hashed_key ]['_ctct_map_select'] = 'street';
522
 
523
+ $return[ 'line_2_address___' . $hashed_key ] = $field_key;
524
+ $return[ 'line_2_address___' . $hashed_key ]['_ctct_map_select'] = 'line_2';
525
 
526
+ $return[ 'city_address___' . $hashed_key ] = $field_key;
527
+ $return[ 'city_address___' . $hashed_key ]['_ctct_map_select'] = 'city';
528
 
529
+ $return[ 'state_address___' . $hashed_key ] = $field_key;
530
+ $return[ 'state_address___' . $hashed_key ]['_ctct_map_select'] = 'state';
531
 
532
+ $return[ 'zip_address___' . $hashed_key ] = $field_key;
533
+ $return[ 'zip_address___' . $hashed_key ]['_ctct_map_select'] = 'zip';
534
 
535
  break;
536
  case 'anniversery':
537
  case 'birthday':
538
+ $return[ 'month___' . $hashed_key ] = $field_key;
539
+ $return[ 'month___' . $hashed_key ]['_ctct_map_select'] = 'month';
540
 
541
+ $return[ 'day___' . $hashed_key ] = $field_key;
542
+ $return[ 'day___' . $hashed_key ]['_ctct_map_select'] = 'day';
543
 
544
+ $return[ 'year___' . $hashed_key ] = $field_key;
545
+ $return[ 'year___' . $hashed_key ]['_ctct_map_select'] = 'year';
546
 
547
  break;
548
  default:
549
+ $return[ $field['_ctct_map_select'] . '___' . $hashed_key ] = $field_key;
550
  break;
551
  }
552
  }
557
  /**
558
  * Get field requirement errors.
559
  *
560
+ * @author Brad Parbs <bradparbs@webdevstudios.com>
561
  * @since 1.0.0
562
  *
563
  * @param array $values Values.
617
  /**
618
  * Clean our values from form submission.
619
  *
620
+ * @author Brad Parbs <bradparbs@webdevstudios.com>
621
  * @since 1.0.0
622
  *
623
  * @param array $values Values to clean.
644
  continue;
645
  }
646
 
647
+ $clean_key = $key_break[0];
648
+ $field_key = 'lists' === $clean_key ? 'ctct-lists' : $value['key'];
649
+
650
+ $return_values[ sanitize_text_field( $field_key ) ] = [
651
+ 'key' => sanitize_text_field( $clean_key ),
652
+ 'value' => is_array( $value['value'] ) ? array_map( 'sanitize_text_field', $value['value'] ) : sanitize_text_field( $value['value'] ),
653
  'orig_key' => $value['key'],
654
  ];
655
  }
660
  /**
661
  * Form submit success/error messages.
662
  *
663
+ * @author Brad Parbs <bradparbs@webdevstudios.com>
664
  * @since 1.0.0
665
  *
666
+ * @throws Exception Throws Exception if encountered while attempting to process form wrapper.
667
  *
668
  * @param array $form_data Form data to process.
669
  * @param string|int $form_id Form ID being processed.
671
  * @return false|array
672
  */
673
  public function process_wrapper( $form_data = [], $form_id = 0, $instance = 0 ) {
674
+ $ctct_id = absint( filter_input( INPUT_POST, 'ctct-id', FILTER_SANITIZE_NUMBER_INT ) );
675
 
676
+ if ( empty( $ctct_id ) ) {
677
  return false;
678
  }
679
 
680
  // @todo Utilize $form_data.
681
+ if ( $ctct_id !== $form_id ) {
682
  return false;
683
  }
684
 
703
  /**
704
  * Filters the message for the successful processed form.
705
  *
706
+ * @deprecated 1.9.0 Deprecated in favor of properly-prefixed hookname.
707
+ *
708
+ * @author Michael Beckwith <michael@webdevstudios.com>
709
+ * @since 1.3.0
710
  *
711
+ * @param string $value Success message.
712
+ * @param string/int $form_id ID of the Constant Contact form being submitted to.
713
  */
714
+ $message = apply_filters_deprecated( 'ctct_process_form_success', [ __( 'Your information has been submitted.', 'constant-contact-forms' ), $form_id ], '1.9.0', 'constant_contact_process_form_success' );
715
+
716
+ /**
717
+ * Filters the message for the successful processed form.
718
+ *
719
+ * @author Rebekah Van Epps <rebekah.vanepp@webdevstudios.com>
720
+ * @since 1.9.0
721
+ *
722
+ * @param string $value Success message.
723
+ * @param string|int $form_id Constant Contact form ID.
724
+ */
725
+ $message = esc_html( apply_filters( 'constant_contact_process_form_success', $message, $form_id ) );
726
  break;
727
 
728
  case 'error':
755
  /**
756
  * Increment a counter for processed form submissions.
757
  *
758
+ * @author Michael Beckwith <michael@webdevstudios.com>
759
  * @since 1.2.2
760
  */
761
  public function increment_processed_form_count() {
767
  /**
768
  * Check if we have all the required fields for a given form.
769
  *
770
+ * @author Michael Beckwith <michael@webdevstudios.com>
771
  * @since 1.3.5
772
  *
773
  * @param int $form_id ID of form to verify.
798
  /**
799
  * Gets the non-human error messeage dispalyed when we think there's a bot.
800
  *
801
+ * @author Michael Beckwith <michael@webdevstudios.com>
802
  * @since 1.5.0
803
  * @param int $post_id The ID of the current post.
804
  * @return string
809
  /**
810
  * Filter the error message displayed for suspected non-humans.
811
  *
812
+ * @deprecated 1.9.0 Deprecated in favor of properly-prefixed hookname.
813
+ *
814
+ * @author Michael Beckwith <michael@webdevstudios.com>
815
  * @since 1.5.0
816
  * @param string $error The error message dispalyed.
817
  * @param mixed $post_id The ID of the current post.
818
  * @return string
819
  */
820
+ $error = apply_filters_deprecated( 'ctct_custom_spam_message', [ $error, $post_id ], '1.9.0', 'constant_contact_custom_spam_message' );
821
+
822
+ /**
823
+ * Filters error message for suspected spam entries.
824
+ *
825
+ * @author Rebekah Van Epps <rebekah.vanepp@webdevstudios.com>
826
+ * @since 1.9.0
827
+ *
828
+ * @param string $error Error message.
829
+ * @param int|string $post_id Current post ID.
830
+ * @return string Error message.
831
+ */
832
+ return apply_filters( 'constant_contact_custom_spam_message', $error, $post_id );
833
  }
834
  }
includes/class-recaptcha-v2.php CHANGED
@@ -11,6 +11,8 @@
11
  * phpcs:disable WebDevStudios.All.RequireAuthor -- Don't require author tag in docblocks.
12
  */
13
 
 
 
14
  /**
15
  * Class ConstantContact_reCAPTCHA_v2
16
  *
@@ -30,8 +32,6 @@ class ConstantContact_reCAPTCHA_v2 extends ConstantContact_reCAPTCHA {
30
  * Retrieve inline scripts for the reCAPTCHA form instance.
31
  *
32
  * @since 1.7.0
33
- *
34
- * @return string
35
  */
36
  public function enqueue_scripts() {
37
  $debug = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG === true );
@@ -86,6 +86,16 @@ class ConstantContact_reCAPTCHA_v2 extends ConstantContact_reCAPTCHA {
86
  $this->recaptcha_size = $size;
87
  }
88
 
 
 
 
 
 
 
 
 
 
 
89
  public function add_script_attributes( $tag, $handle ) {
90
  if ( 'recaptcha-lib-v2' !== $handle ) {
91
  return $tag;
11
  * phpcs:disable WebDevStudios.All.RequireAuthor -- Don't require author tag in docblocks.
12
  */
13
 
14
+ // phpcs:disable PEAR.NamingConventions.ValidClassName.Invalid -- OK classname.
15
+
16
  /**
17
  * Class ConstantContact_reCAPTCHA_v2
18
  *
32
  * Retrieve inline scripts for the reCAPTCHA form instance.
33
  *
34
  * @since 1.7.0
 
 
35
  */
36
  public function enqueue_scripts() {
37
  $debug = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG === true );
86
  $this->recaptcha_size = $size;
87
  }
88
 
89
+ /**
90
+ * Add script attributes.
91
+ *
92
+ * @author Michael Beckwith <michael@webdevstudios.com>
93
+ * @since 1.8.3
94
+ *
95
+ * @param string $tag Script tag.
96
+ * @param string $handle Script handle.
97
+ * @return string Script tag.
98
+ */
99
  public function add_script_attributes( $tag, $handle ) {
100
  if ( 'recaptcha-lib-v2' !== $handle ) {
101
  return $tag;
includes/class-recaptcha-v3.php CHANGED
@@ -11,6 +11,8 @@
11
  * phpcs:disable WebDevStudios.All.RequireAuthor -- Don't require author tag in docblocks.
12
  */
13
 
 
 
14
  /**
15
  * Class ConstantContact_reCAPTCHA_v3
16
  *
11
  * phpcs:disable WebDevStudios.All.RequireAuthor -- Don't require author tag in docblocks.
12
  */
13
 
14
+ // phpcs:disable PEAR.NamingConventions.ValidClassName.Invalid -- OK classname.
15
+
16
  /**
17
  * Class ConstantContact_reCAPTCHA_v3
18
  *
includes/class-recaptcha.php CHANGED
@@ -9,6 +9,8 @@
9
  * phpcs:disable WebDevStudios.All.RequireAuthor -- Don't require author tag in docblocks.
10
  */
11
 
 
 
12
  /**
13
  * Class ConstantContact_reCAPTCHA.
14
  *
@@ -95,8 +97,8 @@ class ConstantContact_reCAPTCHA {
95
  * @return bool
96
  */
97
  public static function has_recaptcha_keys() {
98
- $site_key = ctct_get_settings_option( '_ctct_recaptcha_site_key', '' );
99
- $secret_key = ctct_get_settings_option( '_ctct_recaptcha_secret_key', '' );
100
 
101
  return $site_key && $secret_key;
102
  }
@@ -110,8 +112,8 @@ class ConstantContact_reCAPTCHA {
110
  */
111
  public function get_recaptcha_keys() {
112
  $keys = [];
113
- $keys['site_key'] = ctct_get_settings_option( '_ctct_recaptcha_site_key', '' );
114
- $keys['secret_key'] = ctct_get_settings_option( '_ctct_recaptcha_secret_key', '' );
115
 
116
  return $keys;
117
  }
@@ -149,6 +151,6 @@ class ConstantContact_reCAPTCHA {
149
  * @since 1.7.0
150
  */
151
  public function set_recaptcha_version() {
152
- $this->version = ctct_get_settings_option( '_ctct_recaptcha_version', '' );
153
  }
154
  }
9
  * phpcs:disable WebDevStudios.All.RequireAuthor -- Don't require author tag in docblocks.
10
  */
11
 
12
+ // phpcs:disable PEAR.NamingConventions.ValidClassName.Invalid -- OK classname.
13
+
14
  /**
15
  * Class ConstantContact_reCAPTCHA.
16
  *
97
  * @return bool
98
  */
99
  public static function has_recaptcha_keys() {
100
+ $site_key = constant_contact_get_option( '_ctct_recaptcha_site_key', '' );
101
+ $secret_key = constant_contact_get_option( '_ctct_recaptcha_secret_key', '' );
102
 
103
  return $site_key && $secret_key;
104
  }
112
  */
113
  public function get_recaptcha_keys() {
114
  $keys = [];
115
+ $keys['site_key'] = constant_contact_get_option( '_ctct_recaptcha_site_key', '' );
116
+ $keys['secret_key'] = constant_contact_get_option( '_ctct_recaptcha_secret_key', '' );
117
 
118
  return $keys;
119
  }
151
  * @since 1.7.0
152
  */
153
  public function set_recaptcha_version() {
154
+ $this->version = constant_contact_get_option( '_ctct_recaptcha_version', '' );
155
  }
156
  }
includes/class-settings.php CHANGED
@@ -1,4 +1,4 @@
1
- <?php // phpcs:ignore -- Class name okay, PSR-4.
2
  /**
3
  * Constant Contact Settings class.
4
  *
@@ -85,8 +85,9 @@ class ConstantContact_Settings {
85
 
86
  add_filter( 'preprocess_comment', [ $this, 'process_optin_comment_form' ] );
87
  add_filter( 'authenticate', [ $this, 'process_optin_login_form' ], 10, 3 );
 
88
  add_action( 'cmb2_save_field__ctct_logging', [ $this, 'maybe_init_logs' ], 10, 3 );
89
- add_filter( 'ctct_custom_spam_message', [ $this, 'get_spam_error_message' ], 10, 2 );
90
  }
91
 
92
  /**
@@ -160,10 +161,11 @@ class ConstantContact_Settings {
160
  * @return boolean If we are on the settings page or not.
161
  */
162
  public function on_settings_page() {
163
-
164
  global $pagenow;
165
 
166
- return ( 'edit.php' === $pagenow && isset( $_GET['page'] ) && $this->key === $_GET['page'] ); // phpcs:ignore -- Okay accessing of $_GET.
 
 
167
  }
168
 
169
  /**
@@ -215,7 +217,7 @@ class ConstantContact_Settings {
215
  public function select_primary_menu_item( $file ) {
216
  global $plugin_page;
217
 
218
- $plugin_page = false !== strpos( $plugin_page, $this->key ) ? "{$this->key}_general" : $plugin_page; // phpcs:ignore -- Okay overriding of WP global
219
 
220
  return $file;
221
  }
@@ -269,7 +271,7 @@ class ConstantContact_Settings {
269
  continue;
270
  }
271
 
272
- $cmb_key = array_search( $cmb->prop( 'tab_title' ), $this->metabox_titles );
273
 
274
  if ( false === $cmb_key ) {
275
  continue;
@@ -446,7 +448,7 @@ class ConstantContact_Settings {
446
  );
447
 
448
  $cmb->add_field( [
449
- 'name' => esc_html__( 'CSS Classes', 'constant-contact_forms' ),
450
  'id' => '_ctct_form_custom_classes',
451
  'type' => 'text',
452
  'description' => esc_html__(
@@ -690,8 +692,9 @@ class ConstantContact_Settings {
690
  * @return array Comment form data.
691
  */
692
  public function process_optin_comment_form( $comment_data ) {
 
693
 
694
- if ( ! isset( $_POST['ctct_optin_list'] ) ) {
695
  return $comment_data;
696
  }
697
 
@@ -712,15 +715,14 @@ class ConstantContact_Settings {
712
 
713
  $name = isset( $comment_data['comment_author'] ) ? $comment_data['comment_author'] : '';
714
  $website = isset( $comment_data['comment_author_url'] ) ? $comment_data['comment_author_url'] : '';
 
715
 
716
- if ( ! isset( $_POST['ctct_optin_list'] ) ) { // phpcs:ignore -- Okay accessing of $_POST.
717
  return $comment_data;
718
  }
719
 
720
- $list = sanitize_text_field( wp_unslash( $_POST['ctct_optin_list'] ) ); // phpcs:ignore -- Okay accessing of $_POST.
721
-
722
  $args = [
723
- 'list' => $list,
724
  'email' => sanitize_email( $comment_data['comment_author_email'] ),
725
  'first_name' => sanitize_text_field( $name ),
726
  'last_name' => '',
@@ -744,8 +746,9 @@ class ConstantContact_Settings {
744
  * @return object|array CTCT return API for contact or original $user array.
745
  */
746
  public function process_optin_login_form( $user, $username, $password ) {
 
747
 
748
- if ( ! isset( $_POST['ctct_optin_list'] ) ) {
749
  return $user;
750
  }
751
 
@@ -756,39 +759,76 @@ class ConstantContact_Settings {
756
  return $this->process_user_data_for_optin( $user, $username );
757
  }
758
 
 
759
  /**
760
- * Sends user data to CTCT.
761
  *
762
  * @since 1.0.0
763
  *
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
764
  * @param object $user WP user object.
765
- * @param string $username Username.
766
- * @return object Passed in $user object.
767
  */
768
- public function process_user_data_for_optin( $user, $username ) {
769
 
770
- $user_data = get_user_by( 'login', $username );
771
- $email = '';
772
- $name = '';
773
 
774
- if ( $user_data && isset( $user_data->data, $user_data->data->user_email ) ) {
775
- $email = sanitize_email( $user_data->data->user_email );
776
  }
777
 
778
- if ( $user_data && isset( $user_data->data, $user_data->data->display_name ) ) {
779
- $name = sanitize_text_field( $user_data->data->display_name );
780
  }
781
 
782
  if ( ! isset( $_POST['ctct_optin_list'] ) ) { // phpcs:ignore -- Okay accessing of $_POST.
783
- return $user;
784
  }
785
 
786
- $list = sanitize_text_field( wp_unslash( $_POST['ctct_optin_list'] ) ); // phpcs:ignore -- Okay accessing of $_POST.
 
 
 
 
787
 
788
  if ( $email ) {
789
  $args = [
790
  'email' => $email,
791
- 'list' => $list,
792
  'first_name' => $name,
793
  'last_name' => '',
794
  ];
@@ -796,6 +836,20 @@ class ConstantContact_Settings {
796
  constantcontact_api()->add_contact( $args );
797
  }
798
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
799
  return $user;
800
  }
801
 
@@ -896,7 +950,7 @@ class ConstantContact_Settings {
896
  <h2 class="ctct-logo"><img src="<?php echo esc_url( constant_contact()->url . '/assets/images/constant-contact-logo.png' ); ?>" alt="<?php echo esc_attr_x( 'Constant Contact logo', 'img alt text', 'constant-contact-forms' ); ?>" /></h2>
897
  </div>
898
  <div class="ctct-modal-body ctct-privacy-modal-body">
899
- <?php echo constant_contact_privacy_policy_content(); // phpcs:ignore -- XSS Ok. ?>
900
  </div><!-- modal body -->
901
  <div id="ctct-modal-footer-privacy" class="ctct-modal-footer ctct-modal-footer-privacy">
902
  <a class="button button-blue ctct-connect" data-agree="true"><?php esc_html_e( 'Agree', 'constant-contact-forms' ); ?></a>
@@ -987,27 +1041,30 @@ class ConstantContact_Settings {
987
  }
988
 
989
  /**
990
- * Wrapper function around cmb2_get_option.
991
  *
992
- * @since 1.0.0
 
 
 
993
  *
994
- * @param string $key Options array key.
995
- * @param string $default Default value if no option exists.
996
- * @return mixed Option value.
997
  */
998
- function ctct_get_settings_option( $key = '', $default = null ) {
999
  if ( function_exists( 'cmb2_get_option' ) ) {
1000
  return cmb2_get_option( constant_contact()->settings->key, $key, $default );
1001
  }
1002
 
1003
- $opts = get_option( constant_contact()->settings->key, $key, $default );
1004
- $val = $default;
1005
 
1006
  if ( 'all' === $key ) {
1007
- $val = $opts;
1008
- } elseif ( is_array( $opts ) && array_key_exists( $key, $opts ) && false !== $opts[ $key ] ) {
1009
- $val = $opts[ $key ];
1010
  }
1011
 
1012
- return $val;
1013
  }
1
+ <?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName -- Class name okay, PSR-4.
2
  /**
3
  * Constant Contact Settings class.
4
  *
85
 
86
  add_filter( 'preprocess_comment', [ $this, 'process_optin_comment_form' ] );
87
  add_filter( 'authenticate', [ $this, 'process_optin_login_form' ], 10, 3 );
88
+ add_filter( 'user_register', [ $this, 'process_optin_register_form' ], 10, 1 );
89
  add_action( 'cmb2_save_field__ctct_logging', [ $this, 'maybe_init_logs' ], 10, 3 );
90
+ add_filter( 'constant_contact_custom_spam_message', [ $this, 'get_spam_error_message' ], 10, 2 );
91
  }
92
 
93
  /**
161
  * @return boolean If we are on the settings page or not.
162
  */
163
  public function on_settings_page() {
 
164
  global $pagenow;
165
 
166
+ $page = filter_input( INPUT_GET, 'page', FILTER_SANITIZE_STRING );
167
+
168
+ return ( 'edit.php' === $pagenow && ! empty( $page ) && $this->key === $page );
169
  }
170
 
171
  /**
217
  public function select_primary_menu_item( $file ) {
218
  global $plugin_page;
219
 
220
+ $plugin_page = false !== strpos( $plugin_page, $this->key ) ? "{$this->key}_general" : $plugin_page; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited -- OK overriding of WP global.
221
 
222
  return $file;
223
  }
271
  continue;
272
  }
273
 
274
+ $cmb_key = array_search( $cmb->prop( 'tab_title' ), $this->metabox_titles, true );
275
 
276
  if ( false === $cmb_key ) {
277
  continue;
448
  );
449
 
450
  $cmb->add_field( [
451
+ 'name' => esc_html__( 'CSS Classes', 'constant-contact-forms' ),
452
  'id' => '_ctct_form_custom_classes',
453
  'type' => 'text',
454
  'description' => esc_html__(
692
  * @return array Comment form data.
693
  */
694
  public function process_optin_comment_form( $comment_data ) {
695
+ $ctct_optin_list = filter_input( INPUT_POST, 'ctct_optin_list', FILTER_SANITIZE_STRING );
696
 
697
+ if ( empty( $ctct_optin_list ) ) {
698
  return $comment_data;
699
  }
700
 
715
 
716
  $name = isset( $comment_data['comment_author'] ) ? $comment_data['comment_author'] : '';
717
  $website = isset( $comment_data['comment_author_url'] ) ? $comment_data['comment_author_url'] : '';
718
+ $list = filter_input( INPUT_POST, 'ctct_optin_list', FILTER_SANITIZE_STRING );
719
 
720
+ if ( empty( $list ) ) {
721
  return $comment_data;
722
  }
723
 
 
 
724
  $args = [
725
+ 'list' => sanitize_text_field( wp_unslash( $list ) ),
726
  'email' => sanitize_email( $comment_data['comment_author_email'] ),
727
  'first_name' => sanitize_text_field( $name ),
728
  'last_name' => '',
746
  * @return object|array CTCT return API for contact or original $user array.
747
  */
748
  public function process_optin_login_form( $user, $username, $password ) {
749
+ $ctct_optin_list = filter_input( INPUT_POST, 'ctct_optin_list', FILTER_SANITIZE_STRING );
750
 
751
+ if ( empty( $ctct_optin_list ) ) {
752
  return $user;
753
  }
754
 
759
  return $this->process_user_data_for_optin( $user, $username );
760
  }
761
 
762
+
763
  /**
764
+ * Sends contact to CTCT if optin checked on register.
765
  *
766
  * @since 1.0.0
767
  *
768
+ * @param int $user_id ID of user just registered.
769
+ * @param int Pass in user ID.
770
+ */
771
+ public function process_optin_register_form( $user_id ) {
772
+
773
+ if ( ! isset( $_POST['ctct_optin_list'] ) ) {
774
+ return $user_id;
775
+ }
776
+
777
+ if ( empty( $user_id ) ) {
778
+ return $user_id;
779
+ }
780
+
781
+ return $this->process_user_data_register_for_optin( $user_id );
782
+ }
783
+
784
+ /**
785
+ * Process contact for CTCT on register.
786
+ *
787
+ * @author Scott Anderson <scott.anderson@webdevstudios.com>
788
+ * @since 1.9.0
789
+ * @param int $user_id ID of user just registered.
790
+ * @param int Pass in user ID.
791
+ */
792
+ private function process_user_data_register_for_optin( $user_id ) {
793
+ $this->add_user_to_list( get_user_by( 'ID', $user_id ) );
794
+ return $user_id;
795
+ }
796
+
797
+ /**
798
+ * Sends user data to CTCT.
799
+ * Updated form of process_user_data_for_optin to be more re-usable. Old function not refactored due to public visibility setting.
800
+ *
801
+ * @author Scott Anderson <scott.anderson@webdevstudios.com>
802
+ * @since 1.9.0
803
  * @param object $user WP user object.
 
 
804
  */
805
+ private function add_user_to_list( $user ) {
806
 
807
+ $email = '';
808
+ $name = '';
 
809
 
810
+ if ( $user && isset( $user->data, $user->data->user_email ) ) {
811
+ $email = sanitize_email( $user->data->user_email );
812
  }
813
 
814
+ if ( $user && isset( $user->data, $user->data->display_name ) ) {
815
+ $name = sanitize_text_field( $user->data->display_name );
816
  }
817
 
818
  if ( ! isset( $_POST['ctct_optin_list'] ) ) { // phpcs:ignore -- Okay accessing of $_POST.
819
+ return;
820
  }
821
 
822
+ $list = filter_input( INPUT_POST, 'ctct_optin_list', FILTER_SANITIZE_STRING );
823
+
824
+ if ( empty( $list ) ) {
825
+ return;
826
+ }
827
 
828
  if ( $email ) {
829
  $args = [
830
  'email' => $email,
831
+ 'list' => sanitize_text_field( wp_unslash( $list ) ),
832
  'first_name' => $name,
833
  'last_name' => '',
834
  ];
836
  constantcontact_api()->add_contact( $args );
837
  }
838
 
839
+ }
840
+
841
+
842
+ /**
843
+ * Sends user data to CTCT.
844
+ *
845
+ * @since 1.0.0
846
+ *
847
+ * @param object $user WP user object.
848
+ * @param string $username Username.
849
+ * @return object Passed in $user object.
850
+ */
851
+ public function process_user_data_for_optin( $user, $username ) {
852
+ $this->add_user_to_list( get_user_by( 'login', $username ) );
853
  return $user;
854
  }
855
 
950
  <h2 class="ctct-logo"><img src="<?php echo esc_url( constant_contact()->url . '/assets/images/constant-contact-logo.png' ); ?>" alt="<?php echo esc_attr_x( 'Constant Contact logo', 'img alt text', 'constant-contact-forms' ); ?>" /></h2>
951
  </div>
952
  <div class="ctct-modal-body ctct-privacy-modal-body">
953
+ <?php echo constant_contact_privacy_policy_content(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- XSS OK. ?>
954
  </div><!-- modal body -->
955
  <div id="ctct-modal-footer-privacy" class="ctct-modal-footer ctct-modal-footer-privacy">
956
  <a class="button button-blue ctct-connect" data-agree="true"><?php esc_html_e( 'Agree', 'constant-contact-forms' ); ?></a>
1041
  }
1042
 
1043
  /**
1044
+ * Retrieve option value.
1045
  *
1046
+ * Wrapper for `cmb2_get_option` to provide fallback when that function is not available.
1047
+ *
1048
+ * @author Rebekah Van Epps <rebekah.vanepps@webdevstudios.com>
1049
+ * @since 1.9.0
1050
  *
1051
+ * @param string $key Option key.
1052
+ * @param mixed $default Default option value.
1053
+ * @return mixed Option value.
1054
  */
1055
+ function constant_contact_get_option( $key = '', $default = null ) {
1056
  if ( function_exists( 'cmb2_get_option' ) ) {
1057
  return cmb2_get_option( constant_contact()->settings->key, $key, $default );
1058
  }
1059
 
1060
+ $options = get_option( constant_contact()->settings->key, $key, $default );
1061
+ $value = $default;
1062
 
1063
  if ( 'all' === $key ) {
1064
+ $value = $options;
1065
+ } elseif ( is_array( $options ) && array_key_exists( $key, $options ) && false !== $options[ $key ] ) {
1066
+ $value = $options[ $key ];
1067
  }
1068
 
1069
+ return $value;
1070
  }
includes/class-shortcode.php CHANGED
@@ -36,6 +36,7 @@ class ConstantContact_Shortcode {
36
  /**
37
  * Plugin object.
38
  *
 
39
  * @var Constant_Contact
40
  */
41
  public $plugin;
36
  /**
37
  * Plugin object.
38
  *
39
+ * @since 1.6.0
40
  * @var Constant_Contact
41
  */
42
  public $plugin;
includes/class-uninstall.php CHANGED
@@ -87,11 +87,23 @@ class ConstantContact_Uninstall {
87
  /**
88
  * Allows filtering which options are deleted upon plugin deactivation.
89
  *
 
 
90
  * @since 1.6.0
91
  *
92
  * @param array $options One-dimensional array of option names to delete.
93
  */
94
- return apply_filters( 'ctct_option_names_to_uninstall', $this->options );
 
 
 
 
 
 
 
 
 
 
95
  }
96
 
97
  /**
@@ -112,11 +124,23 @@ class ConstantContact_Uninstall {
112
  /**
113
  * Allows filtering which transients are deleted upon plugin deactivation.
114
  *
 
 
115
  * @since 1.6.0
116
  *
117
  * @param array $transients One-dimensional array of transient names to delete.
118
  */
119
- return apply_filters( 'ctct_transient_names_to_uninstall', $this->transients );
 
 
 
 
 
 
 
 
 
 
120
  }
121
 
122
  /**
@@ -134,11 +158,23 @@ class ConstantContact_Uninstall {
134
  /**
135
  * Allows filtering which cron hooks are deleted upon plugin deactivation.
136
  *
 
 
137
  * @since 1.6.0
138
  *
139
  * @param array $cron_hooks One-dimensional array of cron hook names to delete.
140
  */
141
- return apply_filters( 'ctct_cron_hook_names_to_uninstall', $this->cron_hooks );
 
 
 
 
 
 
 
 
 
 
142
  }
143
 
144
  /**
87
  /**
88
  * Allows filtering which options are deleted upon plugin deactivation.
89
  *
90
+ * @deprecated 1.9.0 Deprecated in favor of properly-prefixed hookname.
91
+ *
92
  * @since 1.6.0
93
  *
94
  * @param array $options One-dimensional array of option names to delete.
95
  */
96
+ $options = apply_filters_deprecated( 'ctct_option_names_to_uninstall', [ $this->options ], '1.9.0', 'constant_contact_option_names_to_uninstall' );
97
+
98
+ /**
99
+ * Filters which options are deleted when plugin is uninstalled.
100
+ *
101
+ * @author Rebekah Van Epps <rebekah.vanepp@webdevstudios.com>
102
+ * @since 1.9.0
103
+ *
104
+ * @param array $options Options to be deleted.
105
+ */
106
+ return apply_filters( 'constant_contact_option_names_to_uninstall', $options );
107
  }
108
 
109
  /**
124
  /**
125
  * Allows filtering which transients are deleted upon plugin deactivation.
126
  *
127
+ * @deprecated 1.9.0 Deprecated in favor of properly-prefixed hookname.
128
+ *
129
  * @since 1.6.0
130
  *
131
  * @param array $transients One-dimensional array of transient names to delete.
132
  */
133
+ $transients = apply_filters_deprecated( 'ctct_transient_names_to_uninstall', [ $this->transients ], '1.9.0', 'constant_contact_transient_names_to_uninstall' );
134
+
135
+ /**
136
+ * Filters which transients are deleted when plugin is uninstalled.
137
+ *
138
+ * @author Rebekah Van Epps <rebekah.vanepp@webdevstudios.com>
139
+ * @since 1.9.0
140
+ *
141
+ * @param array $transients Transients to be deleted.
142
+ */
143
+ return apply_filters( 'constant_contact_transient_names_to_uninstall', $transients );
144
  }
145
 
146
  /**
158
  /**
159
  * Allows filtering which cron hooks are deleted upon plugin deactivation.
160
  *
161
+ * @deprecated 1.9.0 Deprecated in favor of properly-prefixed hookname.
162
+ *
163
  * @since 1.6.0
164
  *
165
  * @param array $cron_hooks One-dimensional array of cron hook names to delete.
166
  */
167
+ $cron_hooks = apply_filters_deprecated( 'ctct_cron_hook_names_to_uninstall', [ $this->cron_hooks ], '1.9.0', 'constant_contact_cron_hook_names_to_uninstall' );
168
+
169
+ /**
170
+ * Filters which cron hooks are deleted when plugin is uninstalled.
171
+ *
172
+ * @author Rebekah Van Epps <rebekah.vanepp@webdevstudios.com>
173
+ * @since 1.9.0
174
+ *
175
+ * @param array $cron_hooks Cron hooks to be deleted.
176
+ */
177
+ return apply_filters( 'constant_contact_cron_hook_names_to_uninstall', $cron_hooks );
178
  }
179
 
180
  /**
includes/class-user-customizations.php CHANGED
@@ -43,7 +43,7 @@ class ConstantContact_User_Customizations {
43
  * @since 1.3.0
44
  */
45
  public function hooks() {
46
- add_filter( 'ctct_process_form_success', [ $this, 'process_form_success' ], 10, 2 );
47
  add_filter( 'constant_contact_front_form_action', [ $this, 'custom_redirect' ], 10, 2 );
48
  add_filter( 'constant_contact_destination_email', [ $this, 'custom_email' ], 10, 2 );
49
  }
43
  * @since 1.3.0
44
  */
45
  public function hooks() {
46
+ add_filter( 'constant_contact_process_form_success', [ $this, 'process_form_success' ], 10, 2 );
47
  add_filter( 'constant_contact_front_form_action', [ $this, 'custom_redirect' ], 10, 2 );
48
  add_filter( 'constant_contact_destination_email', [ $this, 'custom_email' ], 10, 2 );
49
  }
includes/compatibility.php CHANGED
@@ -81,7 +81,7 @@ function constant_contact_wpspamshield_compatibility( $ignored_keys = [], $form_
81
 
82
  // This will grab all of the keys from the global $_POST, and then assign
83
  // the difference between that and our intended keys.
84
- $bad_keys = array_diff( array_keys( $_POST ), $good_keys ); // WPCS: CSRF ok.
85
 
86
  // This will merge the passed ignored keys with our newly found bad keys,
87
  // and then return all the unique values for our return value.
81
 
82
  // This will grab all of the keys from the global $_POST, and then assign
83
  // the difference between that and our intended keys.
84
+ $bad_keys = array_diff( array_keys( $_POST ), $good_keys ); // phpcs:ignore WordPress.Security.NonceVerification.Missing -- CSRF OK.
85
 
86
  // This will merge the passed ignored keys with our newly found bad keys,
87
  // and then return all the unique values for our return value.
includes/deprecated.php ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Deprecated functions.
4
+ *
5
+ * @package Constantcontact
6
+ * @author Constant Contact
7
+ * @since 1.9.0
8
+ *
9
+ * phpcs:disable WebDevStudios.All.RequireAuthor -- Don't require author tag in docblocks.
10
+ * phpcs:disable WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedFunctionFound -- Incorrectly prefixed functions have been deprecated.
11
+ */
12
+
13
+ /**
14
+ * Wrapper function around cmb2_get_option.
15
+ *
16
+ * @deprecated 1.9.0 Deprecated in favor of properly-prefixed function name.
17
+ *
18
+ * @since 1.0.0
19
+ *
20
+ * @param string $key Options array key.
21
+ * @param string $default Default value if no option exists.
22
+ * @return mixed Option value.
23
+ */
24
+ function ctct_get_settings_option( $key = '', $default = null ) {
25
+ _deprecated_function( __FUNCTION__, '1.9.0', 'constant_contact_get_option' );
26
+
27
+ return constant_contact_get_option( $key, $default );
28
+ }
29
+
30
+ /**
31
+ * Process potential custom Constant Contact Forms action urls.
32
+ *
33
+ * @deprecated 1.9.0 Deprecated in favor of properly-prefixed function name.
34
+ *
35
+ * @since 1.2.3
36
+ *
37
+ * @throws Exception Throw Exception if error occurs during form processing.
38
+ *
39
+ * @return bool|array
40
+ */
41
+ function ctct_custom_form_action_processing() {
42
+ _deprecated_function( __FUNCTION__, '1.9.0', 'constant_contact_process_form_custom' );
43
+
44
+ return constant_contact_process_form_custom();
45
+ }
46
+
47
+ /**
48
+ * Determine if we have any Constant Contact Forms published.
49
+ *
50
+ * @deprecated 1.9.0 Deprecated in favor of properly-prefixed function name.
51
+ *
52
+ * @since 1.2.5
53
+ *
54
+ * @return bool
55
+ */
56
+ function ctct_has_forms() {
57
+ _deprecated_function( __FUNCTION__, '1.9.0', 'constant_contact_has_forms' );
58
+
59
+ return constant_contact_has_forms();
60
+ }
includes/helper-functions.php CHANGED
@@ -196,8 +196,8 @@ function constant_contact_maybe_display_exceptions_notice() {
196
  * @since 1.2.0
197
  */
198
  function constant_contact_optin_ajax_handler() {
199
-
200
- $optin = filter_var( $_REQUEST['optin'], FILTER_SANITIZE_STRING );
201
 
202
  if ( 'on' !== $optin ) {
203
  wp_send_json_success( [ 'opted-in' => 'off' ] );
@@ -218,8 +218,9 @@ add_action( 'wp_ajax_constant_contact_optin_ajax_handler', 'constant_contact_opt
218
  * @since 1.2.0
219
  */
220
  function constant_contact_privacy_ajax_handler() {
 
 
221
 
222
- $agreed = filter_var( $_REQUEST['privacy_agree'], FILTER_SANITIZE_STRING );
223
  update_option( 'ctct_privacy_policy_status', $agreed );
224
 
225
  wp_send_json_success( [ 'updated' => 'true' ] );
@@ -269,16 +270,14 @@ function constant_contact_review_ajax_handler() {
269
  add_action( 'wp_ajax_constant_contact_review_ajax_handler', 'constant_contact_review_ajax_handler' );
270
 
271
  /**
272
- * Process potential custom Constant Contact Forms action urls.
273
- *
274
- * @since 1.2.3
275
  *
276
- * @throws Exception
 
277
  *
278
- * @return bool|array
279
  */
280
- function ctct_custom_form_action_processing() {
281
-
282
  $ctct_id = filter_input( INPUT_POST, 'ctct-id', FILTER_VALIDATE_INT );
283
 
284
  if ( false === $ctct_id ) {
@@ -291,22 +290,24 @@ function ctct_custom_form_action_processing() {
291
 
292
  return constant_contact()->process_form->process_form();
293
  }
294
- add_action( 'wp_head', 'ctct_custom_form_action_processing' );
295
 
296
  /**
297
- * Determine if we have any Constant Contact Forms published.
298
  *
299
- * @since 1.2.5
 
300
  *
301
- * @return bool
302
  */
303
- function ctct_has_forms() {
304
  $args = [
305
  'post_type' => 'ctct_forms',
306
  'post_status' => 'publish',
307
  'posts_per_page' => 1,
308
  ];
309
  $forms = new WP_Query( $args );
 
310
  return $forms->have_posts();
311
  }
312
 
@@ -384,7 +385,7 @@ function constant_contact_clean_url( $url = '' ) {
384
  * @return bool
385
  */
386
  function constant_contact_debugging_enabled() {
387
- $debugging_enabled = ctct_get_settings_option( '_ctct_logging', '' );
388
 
389
  if ( apply_filters( 'constant_contact_force_logging', false ) ) {
390
  $debugging_enabled = 'on';
@@ -567,7 +568,7 @@ function constant_contact_emails_disabled( $form_id = 0 ) {
567
  $disabled = true;
568
  }
569
 
570
- $global_form_disabled = ctct_get_settings_option( '_ctct_disable_email_notifications', '' );
571
  if ( 'on' === $global_form_disabled ) {
572
  $disabled = true;
573
  }
@@ -626,7 +627,7 @@ function constant_contact_get_css_customization( $form_id, $customization_key =
626
  }
627
  }
628
 
629
- $global_setting = ctct_get_settings_option( $customization_key );
630
 
631
  return ! empty( $global_setting ) ? $global_setting : '';
632
  }
@@ -657,7 +658,7 @@ function constant_contact_privacy_policy_content() {
657
  *
658
  * @since 1.6.0
659
  *
660
- * @param string $status Status value to set
661
  */
662
  function constant_contact_set_has_exceptions( $status = 'true' ) {
663
  update_option( 'ctct_exceptions_exist', $status );
@@ -735,7 +736,7 @@ function constant_contact_get_widgets_by_form( $form_id ) {
735
  $widgets = array_filter( get_option( "widget_{$widget_type}", [] ), function( $value ) use ( $data ) {
736
  if ( 'ctct_form' === $data['type'] ) {
737
  return absint( $value['ctct_form_id'] ) === $data['form_id'];
738
- } else if ( 'text' === $data['type'] ) {
739
  if ( ! isset( $value['text'] ) || false === strpos( $value['text'], '[ctct' ) ) {
740
  return false;
741
  }
@@ -744,7 +745,7 @@ function constant_contact_get_widgets_by_form( $form_id ) {
744
  return false;
745
  } );
746
  array_walk( $widgets, 'constant_contact_walk_widget_references', $widget_type );
747
- $return = array_merge( $return, $widgets );
748
  }
749
 
750
  return $return;
@@ -763,11 +764,11 @@ function constant_contact_get_widgets_by_form( $form_id ) {
763
  function constant_contact_walk_widget_references( array &$value, $key, $type ) {
764
  global $wp_registered_sidebars, $wp_registered_widgets;
765
 
766
- $widget_id = "{$type}-{$key}";
767
- $sidebars = array_keys( array_filter( get_option( 'sidebars_widgets', [] ), function( $sidebar ) use ( $widget_id ) {
768
- return is_array( $sidebar ) && in_array( $widget_id, $sidebar );
769
  } ) );
770
- $value = [
771
  'type' => 'widget',
772
  'widget' => $type,
773
  'url' => admin_url( 'widgets.php' ),
196
  * @since 1.2.0
197
  */
198
  function constant_contact_optin_ajax_handler() {
199
+ $optin = filter_input( INPUT_GET, 'optin', FILTER_SANITIZE_STRING );
200
+ $optin = empty( $optin ) ? filter_input( INPUT_POST, 'optin', FILTER_SANITIZE_STRING ) : $optin;
201
 
202
  if ( 'on' !== $optin ) {
203
  wp_send_json_success( [ 'opted-in' => 'off' ] );
218
  * @since 1.2.0
219
  */
220
  function constant_contact_privacy_ajax_handler() {
221
+ $agreed = filter_input( INPUT_GET, 'privacy_agree', FILTER_SANITIZE_STRING );
222
+ $agreed = empty( $agreed ) ? filter_input( INPUT_POST, 'privacy_agree', FILTER_SANITIZE_STRING ) : $agreed;
223
 
 
224
  update_option( 'ctct_privacy_policy_status', $agreed );
225
 
226
  wp_send_json_success( [ 'updated' => 'true' ] );
270
  add_action( 'wp_ajax_constant_contact_review_ajax_handler', 'constant_contact_review_ajax_handler' );
271
 
272
  /**
273
+ * Perform custom form processing.
 
 
274
  *
275
+ * @author Rebekah Van Epps <rebekah.vanepps@webdevstudios.com>
276
+ * @since 1.9.0
277
  *
278
+ * @return mixed Results of form processing, false if no processing performed.
279
  */
280
+ function constant_contact_process_form_custom() {
 
281
  $ctct_id = filter_input( INPUT_POST, 'ctct-id', FILTER_VALIDATE_INT );
282
 
283
  if ( false === $ctct_id ) {
290
 
291
  return constant_contact()->process_form->process_form();
292
  }
293
+ add_action( 'wp_head', 'constant_contact_process_form_custom' );
294
 
295
  /**
296
+ * Check if any published Constant Contact forms exist.
297
  *
298
+ * @author Rebekah Van Epps <rebekah.vanepps@webdevstudios.com>
299
+ * @since 1.9.0
300
  *
301
+ * @return bool Whether published forms exist.
302
  */
303
+ function constant_contact_has_forms() {
304
  $args = [
305
  'post_type' => 'ctct_forms',
306
  'post_status' => 'publish',
307
  'posts_per_page' => 1,
308
  ];
309
  $forms = new WP_Query( $args );
310
+
311
  return $forms->have_posts();
312
  }
313
 
385
  * @return bool
386
  */
387
  function constant_contact_debugging_enabled() {
388
+ $debugging_enabled = constant_contact_get_option( '_ctct_logging', '' );
389
 
390
  if ( apply_filters( 'constant_contact_force_logging', false ) ) {
391
  $debugging_enabled = 'on';
568
  $disabled = true;
569
  }
570
 
571
+ $global_form_disabled = constant_contact_get_option( '_ctct_disable_email_notifications', '' );
572
  if ( 'on' === $global_form_disabled ) {
573
  $disabled = true;
574
  }
627
  }
628
  }
629
 
630
+ $global_setting = constant_contact_get_option( $customization_key );
631
 
632
  return ! empty( $global_setting ) ? $global_setting : '';
633
  }
658
  *
659
  * @since 1.6.0
660
  *
661
+ * @param string $status Status value to set.
662
  */
663
  function constant_contact_set_has_exceptions( $status = 'true' ) {
664
  update_option( 'ctct_exceptions_exist', $status );
736
  $widgets = array_filter( get_option( "widget_{$widget_type}", [] ), function( $value ) use ( $data ) {
737
  if ( 'ctct_form' === $data['type'] ) {
738
  return absint( $value['ctct_form_id'] ) === $data['form_id'];
739
+ } elseif ( 'text' === $data['type'] ) {
740
  if ( ! isset( $value['text'] ) || false === strpos( $value['text'], '[ctct' ) ) {
741
  return false;
742
  }
745
  return false;
746
  } );
747
  array_walk( $widgets, 'constant_contact_walk_widget_references', $widget_type );
748
+ $return = array_merge( $return, $widgets );
749
  }
750
 
751
  return $return;
764
  function constant_contact_walk_widget_references( array &$value, $key, $type ) {
765
  global $wp_registered_sidebars, $wp_registered_widgets;
766
 
767
+ $widget_id = "{$type}-{$key}";
768
+ $sidebars = array_keys( array_filter( get_option( 'sidebars_widgets', [] ), function( $sidebar ) use ( $widget_id ) {
769
+ return is_array( $sidebar ) && in_array( $widget_id, $sidebar, true );
770
  } ) );
771
+ $value = [
772
  'type' => 'widget',
773
  'widget' => $type,
774
  'url' => admin_url( 'widgets.php' ),
includes/widgets/contact-form-select.php CHANGED
@@ -112,16 +112,17 @@ class ConstantContactWidget extends WP_Widget {
112
  $title = trim( wp_strip_all_tags( $instance['ctct_title'] ) );
113
  $form_id = absint( $instance['ctct_form_id'] );
114
  $show_form_title = ( ! empty( $instance['ctct_form_title'] ) ) ? 'true' : 'false';
115
-
116
- echo $args['before_widget']; // WPCS: XSS Ok.
117
 
118
  if ( $title ) {
119
- echo $args['before_title'] . esc_html( $title ) . $args['after_title']; // WPCS: XSS Ok.
120
  }
121
 
122
- echo do_shortcode( sprintf( '[ctct form="%s" show_title="%s"]', $form_id, $show_form_title ) );
 
 
123
 
124
- echo $args['after_widget']; // WPCS: XSS Ok.
125
  }
126
 
127
  /**
@@ -238,13 +239,14 @@ class ConstantContactWidget extends WP_Widget {
238
  );
239
  }
240
  }
 
241
  printf(
242
  '<p><label for="%1$s">%2$s</label><select class="widefat" name="%3$s" id="%4$s">%5$s</select>',
243
  esc_attr( $name ),
244
  esc_html( $label_text ),
245
  esc_attr( $name ),
246
  esc_attr( $id ),
247
- $selects
248
  );
249
  }
250
  }
112
  $title = trim( wp_strip_all_tags( $instance['ctct_title'] ) );
113
  $form_id = absint( $instance['ctct_form_id'] );
114
  $show_form_title = ( ! empty( $instance['ctct_form_title'] ) ) ? 'true' : 'false';
115
+ $widget = $args['before_widget'];
 
116
 
117
  if ( $title ) {
118
+ $widget .= $args['before_title'] . esc_html( $title ) . $args['after_title'];
119
  }
120
 
121
+ $widget .= do_shortcode( sprintf( '[ctct form="%s" show_title="%s"]', $form_id, $show_form_title ) );
122
+
123
+ $widget .= $args['after_widget'];
124
 
125
+ echo $widget; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- XSS OK.
126
  }
127
 
128
  /**
239
  );
240
  }
241
  }
242
+
243
  printf(
244
  '<p><label for="%1$s">%2$s</label><select class="widefat" name="%3$s" id="%4$s">%5$s</select>',
245
  esc_attr( $name ),
246
  esc_html( $label_text ),
247
  esc_attr( $name ),
248
  esc_attr( $id ),
249
+ $selects // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- XSS OK.
250
  );
251
  }
252
  }
languages/constant-contact-forms.pot CHANGED
@@ -13,15 +13,15 @@ msgstr ""
13
  "X-Poedit-SourceCharset: UTF-8\n"
14
  "Plural-Forms: nplurals=2; plural=(n != 1);\n"
15
 
16
- #: constant-contact-forms.php:373, includes/class-cpts.php:89, includes/class-cpts.php:148
17
  msgid "Constant Contact"
18
  msgstr ""
19
 
20
- #: constant-contact-forms.php:405
21
  msgid "Constant Contact Forms requires PHP 5.4 or higher. Your hosting provider or website administrator should be able to assist in updating your PHP version."
22
  msgstr ""
23
 
24
- #: constant-contact-forms.php:712
25
  msgid "Error loading license."
26
  msgstr ""
27
 
@@ -74,7 +74,7 @@ msgctxt "img alt text"
74
  msgid "Constant Contact Logo"
75
  msgstr ""
76
 
77
- #: includes/class-admin-pages.php:216
78
  msgid "Constant Contact Forms"
79
  msgstr ""
80
 
@@ -214,15 +214,15 @@ msgstr ""
214
  msgid "Constant Contact Forms - License"
215
  msgstr ""
216
 
217
- #: includes/class-admin.php:129, includes/class-admin.php:130, includes/class-admin.php:379
218
  msgid "About"
219
  msgstr ""
220
 
221
- #: includes/class-admin.php:138, includes/class-admin.php:139, includes/class-admin.php:380
222
  msgid "License"
223
  msgstr ""
224
 
225
- #: includes/class-admin.php:224, includes/class-settings.php:816
226
  msgid "Settings updated."
227
  msgstr ""
228
 
@@ -230,7 +230,7 @@ msgstr ""
230
  msgid "Description"
231
  msgstr ""
232
 
233
- #: includes/class-admin.php:262, includes/class-builder-fields.php:707
234
  msgid "Shortcode"
235
  msgstr ""
236
 
@@ -238,27 +238,31 @@ msgstr ""
238
  msgid "Associated List"
239
  msgstr ""
240
 
241
- #: includes/class-admin.php:321
 
 
 
 
242
  msgid "Contact Count"
243
  msgstr ""
244
 
245
- #: includes/class-admin.php:377
246
  msgid "Check out the official WordPress plugin from @constantcontact:"
247
  msgstr ""
248
 
249
- #: includes/class-admin.php:391
250
  msgid "Spread the word!"
251
  msgstr ""
252
 
253
- #: includes/class-admin.php:473
254
  msgid "You have unsaved changes."
255
  msgstr ""
256
 
257
- #: includes/class-admin.php:474
258
  msgid "move up"
259
  msgstr ""
260
 
261
- #: includes/class-admin.php:475
262
  msgid "move down"
263
  msgstr ""
264
 
@@ -330,6 +334,10 @@ msgstr ""
330
  msgid "Website"
331
  msgstr ""
332
 
 
 
 
 
333
  #: includes/class-builder-fields.php:155
334
  msgid "Custom Text Field"
335
  msgstr ""
@@ -354,306 +362,306 @@ msgstr ""
354
  msgid "Constant Contact List"
355
  msgstr ""
356
 
357
- #: includes/class-builder-fields.php:222, includes/class-settings.php:395
358
- msgid "Add subscribers to"
359
- msgstr ""
360
-
361
- #: includes/class-builder-fields.php:225
362
- msgid "No List Selected"
363
  msgstr ""
364
 
365
- #: includes/class-builder-fields.php:242
366
  msgid "Form Description"
367
  msgstr ""
368
 
369
- #: includes/class-builder-fields.php:250
370
  msgid "This message will display above the form fields, so use it as an opportunity to pitch your email list. Tell visitors why they should subscribe to your emails, focusing on benefits like insider tips, discounts, subscriber coupons, and more."
371
  msgstr ""
372
 
373
- #: includes/class-builder-fields.php:270
374
  msgid "Form Options"
375
  msgstr ""
376
 
377
- #: includes/class-builder-fields.php:278
378
  msgid "Button text"
379
  msgstr ""
380
 
381
- #: includes/class-builder-fields.php:281
382
  msgid "Sign up"
383
  msgstr ""
384
 
385
- #: includes/class-builder-fields.php:285
386
  msgid "Success message"
387
  msgstr ""
388
 
389
- #: includes/class-builder-fields.php:288
390
  msgid "Your information has been submitted"
391
  msgstr ""
392
 
393
- #: includes/class-builder-fields.php:292
394
  msgid "Submission behavior"
395
  msgstr ""
396
 
397
- #: includes/class-builder-fields.php:299
398
  msgid "Redirect URL"
399
  msgstr ""
400
 
401
  #. translators: 1: basic field info, 2: warning about invalid values, 3: recommended field value
402
- #: includes/class-builder-fields.php:305
403
  msgid "Leave blank to keep users on the current page."
404
  msgstr ""
405
 
406
- #: includes/class-builder-fields.php:306
407
  msgid "NOTE: This URL must be within the current site and may not be a direct link to a media file (e.g., a PDF document). Providing a Redirect URL that is outside the current site or is a media file will cause issues with Constant Constact functionality, including contacts not being added to lists successfully."
408
  msgstr ""
409
 
410
- #: includes/class-builder-fields.php:307
411
  msgid "It is recommended to leave this field blank or provide a URL to a page that contains any external or media links within the page content."
412
  msgstr ""
413
 
414
- #: includes/class-builder-fields.php:313
415
  msgid "No page refresh"
416
  msgstr ""
417
 
418
- #: includes/class-builder-fields.php:316
419
  msgid "Enable form submission without a page refresh. This option overrides the Redirect URL choice above."
420
  msgstr ""
421
 
422
- #: includes/class-builder-fields.php:321
423
  msgid "Disable Google reCAPTCHA for this form?"
424
  msgstr ""
425
 
426
- #: includes/class-builder-fields.php:324
427
  msgid "Checking will disable Google's reCAPTCHA output for this form. Only valid if using Google reCAPTCHA version 2"
428
  msgstr ""
429
 
430
- #: includes/class-builder-fields.php:329
431
  msgid "Spam notice"
432
  msgstr ""
433
 
434
- #: includes/class-builder-fields.php:336
435
  msgid "Spam Error Message"
436
  msgstr ""
437
 
438
- #: includes/class-builder-fields.php:339
439
  msgid "Set the spam error message displayed for this form."
440
  msgstr ""
441
 
442
- #: includes/class-builder-fields.php:355
443
  msgid "Form Design"
444
  msgstr ""
445
 
446
- #: includes/class-builder-fields.php:362, includes/class-builder-fields.php:424
447
  msgid "Background Color"
448
  msgstr ""
449
 
450
- #: includes/class-builder-fields.php:365
451
  msgid "Applies to the whole form."
452
  msgstr ""
453
 
454
- #: includes/class-builder-fields.php:372
455
  msgid "Form Fonts"
456
  msgstr ""
457
 
458
- #: includes/class-builder-fields.php:378, includes/class-builder-fields.php:406
459
  msgid "Font Size"
460
  msgstr ""
461
 
462
- #: includes/class-builder-fields.php:383
463
  msgid "Only applies to the form description."
464
  msgstr ""
465
 
466
- #: includes/class-builder-fields.php:390, includes/class-builder-fields.php:414
467
  msgid "Font Color"
468
  msgstr ""
469
 
470
- #: includes/class-builder-fields.php:393
471
  msgid "Applies to the form description, input labels, and disclosure text."
472
  msgstr ""
473
 
474
- #: includes/class-builder-fields.php:400
475
  msgid "Form Submit Button"
476
  msgstr ""
477
 
478
- #: includes/class-builder-fields.php:417
479
  msgid "Choose a color for the submit button text."
480
  msgstr ""
481
 
482
- #: includes/class-builder-fields.php:427
483
  msgid "Choose a color for the submit button background."
484
  msgstr ""
485
 
486
- #: includes/class-builder-fields.php:442
487
  msgid "Input Design"
488
  msgstr ""
489
 
490
- #: includes/class-builder-fields.php:449
491
  msgid "Form Padding"
492
  msgstr ""
493
 
494
- #: includes/class-builder-fields.php:458, includes/class-builder-fields.php:513, includes/class-settings.php:466
 
 
 
 
495
  msgid "Top"
496
  msgstr ""
497
 
498
- #: includes/class-builder-fields.php:468, includes/class-builder-fields.php:516, includes/class-settings.php:468
499
  msgid "Right"
500
  msgstr ""
501
 
502
- #: includes/class-builder-fields.php:478, includes/class-builder-fields.php:515, includes/class-settings.php:469
503
  msgid "Bottom"
504
  msgstr ""
505
 
506
- #: includes/class-builder-fields.php:488, includes/class-builder-fields.php:514, includes/class-settings.php:467
507
  msgid "Left"
508
  msgstr ""
509
 
510
- #: includes/class-builder-fields.php:498
511
  msgid "Custom Classes"
512
  msgstr ""
513
 
514
- #: includes/class-builder-fields.php:501
515
  msgid "Set custom CSS class(es) for inputs. Separate multiple classes with spaces."
516
  msgstr ""
517
 
518
- #: includes/class-builder-fields.php:508, includes/class-settings.php:460
519
  msgid "Label Placement"
520
  msgstr ""
521
 
522
- #: includes/class-builder-fields.php:511
523
  msgid "Global"
524
  msgstr ""
525
 
526
- #: includes/class-builder-fields.php:517, includes/class-settings.php:470
527
  msgid "Hidden"
528
  msgstr ""
529
 
530
- #: includes/class-builder-fields.php:519
531
  msgid "Set the position for labels for inputs."
532
  msgstr ""
533
 
534
- #: includes/class-builder-fields.php:537
535
  msgid "Enabling this option will require users to check a box to be added to your list."
536
  msgstr ""
537
 
538
- #: includes/class-builder-fields.php:544
539
  msgid "Learn more"
540
  msgstr ""
541
 
542
- #: includes/class-builder-fields.php:549
543
  msgid "Email opt-in"
544
  msgstr ""
545
 
546
- #: includes/class-builder-fields.php:569
547
  msgid "Enable email subscriber opt-in"
548
  msgstr ""
549
 
550
- #: includes/class-builder-fields.php:571
551
  msgid "Adds an opt-in to the bottom of your form."
552
  msgstr ""
553
 
554
- #: includes/class-builder-fields.php:590
555
  msgid "Add a checkbox so subscribers can opt-in to your email list."
556
  msgstr ""
557
 
558
- #: includes/class-builder-fields.php:592
559
  msgid "(For use with Contact Us form)"
560
  msgstr ""
561
 
562
- #: includes/class-builder-fields.php:595
563
  msgid "Opt-in checkbox"
564
  msgstr ""
565
 
566
- #: includes/class-builder-fields.php:615, includes/class-settings.php:413
567
  msgid "Opt-in Affirmation"
568
  msgstr ""
569
 
570
  #. translators: placeholder has a business name from Constant Contact.
571
- #: includes/class-builder-fields.php:619
572
  msgid "Example: Yes, I would like to receive emails from %s. (You can unsubscribe anytime)"
573
  msgstr ""
574
 
575
- #: includes/class-builder-fields.php:632
576
  msgid "Form Fields"
577
  msgstr ""
578
 
579
- #: includes/class-builder-fields.php:640
580
  msgid "Add Fields"
581
  msgstr ""
582
 
583
- #: includes/class-builder-fields.php:647
584
  msgid "Create a field for each piece of information you want to collect. Good basics include email address, first name, and last name."
585
  msgstr ""
586
 
587
- #: includes/class-builder-fields.php:657
588
  msgid "Field {#}"
589
  msgstr ""
590
 
591
- #: includes/class-builder-fields.php:658
592
  msgid "Add Another Field"
593
  msgstr ""
594
 
595
- #: includes/class-builder-fields.php:659
596
  msgid "Remove Field"
597
  msgstr ""
598
 
599
- #: includes/class-builder-fields.php:665
600
  msgid "Select a Field"
601
  msgstr ""
602
 
603
- #: includes/class-builder-fields.php:675
604
  msgid "Field Label"
605
  msgstr ""
606
 
607
- #: includes/class-builder-fields.php:682
608
  msgid "Field Description"
609
  msgstr ""
610
 
611
- #: includes/class-builder-fields.php:686
612
  msgid "Ex: Enter email address"
613
  msgstr ""
614
 
615
- #: includes/class-builder-fields.php:691
616
  msgid "Required"
617
  msgstr ""
618
 
619
- #: includes/class-builder-fields.php:715
620
  msgid "Shortcode to use"
621
  msgstr ""
622
 
623
  #. translators: Placeholders here represent `<em>` and `<strong>` HTML tags.
624
- #: includes/class-builder-fields.php:720
625
  msgid "Shortcode to embed — %1$s%2$sYou can copy and paste this in a post to display your form.%3$s%4$s"
626
  msgstr ""
627
 
628
- #: includes/class-builder-fields.php:742
629
  msgid "Email settings"
630
  msgstr ""
631
 
632
- #: includes/class-builder-fields.php:749
633
  msgid "Email destination"
634
  msgstr ""
635
 
636
- #: includes/class-builder-fields.php:750
637
  msgid "Who should receive email notifications for this form. Separate multiple emails by a comma. Leave blank to default to admin email."
638
  msgstr ""
639
 
640
- #: includes/class-builder-fields.php:756
641
  msgid "Disable email notifications for this form?"
642
  msgstr ""
643
 
644
- #: includes/class-builder-fields.php:757
645
  msgid "Check this option to disable emails for this Constant Contact Forms form."
646
  msgstr ""
647
 
648
- #: includes/class-builder-fields.php:773
649
  msgid "Reset Styles"
650
  msgstr ""
651
 
652
- #: includes/class-builder-fields.php:784, includes/class-builder-fields.php:802
653
  msgid "Reset"
654
  msgstr ""
655
 
656
- #: includes/class-builder-fields.php:785
657
  msgid "Reset the styles for this Form."
658
  msgstr ""
659
 
@@ -757,11 +765,11 @@ msgid "The ALTERNATE_WP_CRON constant is set to true as of %1$s. This plugin can
757
  msgstr ""
758
 
759
  #. translators: Placeholder will be an HTTP response code.
760
- #: includes/class-check.php:202
761
  msgid "Unexpected HTTP response code: %1$s"
762
  msgstr ""
763
 
764
- #: includes/class-check.php:207
765
  msgid "Cron spawn ok"
766
  msgstr ""
767
 
@@ -777,7 +785,7 @@ msgstr ""
777
  msgid "Are you sure you want to disconnect?"
778
  msgstr ""
779
 
780
- #: includes/class-connect.php:169, includes/class-logging.php:210, includes/class-notification-content.php:111, includes/class-notification-content.php:148, includes/class-optin.php:129, includes/class-settings.php:896
781
  msgctxt "img alt text"
782
  msgid "Constant Contact logo"
783
  msgstr ""
@@ -849,7 +857,7 @@ msgstr ""
849
  msgid "New Form"
850
  msgstr ""
851
 
852
- #: includes/class-cpts.php:72, includes/class-display.php:830
853
  msgid "Edit Form"
854
  msgstr ""
855
 
@@ -991,169 +999,176 @@ msgstr ""
991
  msgid "Constant Contact lists."
992
  msgstr ""
993
 
994
- #: includes/class-cpts.php:187, includes/class-cpts.php:190
995
  msgid "List updated."
996
  msgstr ""
997
 
998
- #: includes/class-cpts.php:188, includes/class-cpts.php:203
999
  msgid "Custom field updated."
1000
  msgstr ""
1001
 
1002
- #: includes/class-cpts.php:189, includes/class-cpts.php:204
1003
  msgid "Custom field deleted."
1004
  msgstr ""
1005
 
1006
- #: includes/class-cpts.php:192
1007
  msgid "List published."
1008
  msgstr ""
1009
 
1010
- #: includes/class-cpts.php:193
1011
  msgid "List saved."
1012
  msgstr ""
1013
 
1014
- #: includes/class-cpts.php:194
1015
  msgid "List submitted."
1016
  msgstr ""
1017
 
1018
- #: includes/class-cpts.php:195
 
1019
  msgid "List scheduled for: <strong>%1$s</strong>."
1020
  msgstr ""
1021
 
1022
- #: includes/class-cpts.php:197
1023
  msgid "List draft updated."
1024
  msgstr ""
1025
 
1026
- #: includes/class-cpts.php:202, includes/class-cpts.php:205
1027
  msgid "Form updated."
1028
  msgstr ""
1029
 
1030
- #: includes/class-cpts.php:207
 
1031
  msgid "Success! Here's the shortcode: %s. Just paste it into a post or page editor to publish"
1032
  msgstr ""
1033
 
1034
- #: includes/class-cpts.php:208
1035
  msgid "Form saved."
1036
  msgstr ""
1037
 
1038
- #: includes/class-cpts.php:209
1039
  msgid "Form submitted."
1040
  msgstr ""
1041
 
1042
- #: includes/class-cpts.php:210
 
1043
  msgid "Form scheduled for: <strong>%1$s</strong>."
1044
  msgstr ""
1045
 
1046
- #: includes/class-cpts.php:212
1047
  msgid "Form draft updated."
1048
  msgstr ""
1049
 
1050
- #: includes/class-cpts.php:240
1051
  msgid "Enter a form name"
1052
  msgstr ""
1053
 
1054
- #: includes/class-cpts.php:241
1055
  msgid "(Examples: Join Our Email List, Contact Us)"
1056
  msgstr ""
1057
 
1058
  #. translators: Placeholders will be form title and then last modified date.
1059
- #: includes/class-cpts.php:307
1060
  msgid "%1$s (last modified %2$s ago)"
1061
  msgstr ""
1062
 
1063
- #: includes/class-display.php:507
 
 
 
 
1064
  msgid "Constant Contact Use."
1065
  msgstr ""
1066
 
1067
- #: includes/class-display.php:661, includes/class-display.php:1672
1068
  msgid "Error: Please correct your entry."
1069
  msgstr ""
1070
 
1071
- #: includes/class-display.php:1245
1072
  msgid "Street Address"
1073
  msgstr ""
1074
 
1075
- #: includes/class-display.php:1246
1076
  msgid "Address Line 2"
1077
  msgstr ""
1078
 
1079
- #: includes/class-display.php:1247
1080
  msgid "City"
1081
  msgstr ""
1082
 
1083
- #: includes/class-display.php:1248
1084
  msgid "State"
1085
  msgstr ""
1086
 
1087
- #: includes/class-display.php:1249
1088
  msgid "ZIP Code"
1089
  msgstr ""
1090
 
1091
- #: includes/class-display.php:1439
1092
  msgid "Month"
1093
  msgstr ""
1094
 
1095
- #: includes/class-display.php:1440
1096
  msgid "Day"
1097
  msgstr ""
1098
 
1099
- #: includes/class-display.php:1441
1100
  msgid "Year"
1101
  msgstr ""
1102
 
1103
- #: includes/class-display.php:1557
1104
  msgid "January"
1105
  msgstr ""
1106
 
1107
- #: includes/class-display.php:1558
1108
  msgid "February"
1109
  msgstr ""
1110
 
1111
- #: includes/class-display.php:1559
1112
  msgid "March"
1113
  msgstr ""
1114
 
1115
- #: includes/class-display.php:1560
1116
  msgid "April"
1117
  msgstr ""
1118
 
1119
- #: includes/class-display.php:1561
1120
  msgid "May"
1121
  msgstr ""
1122
 
1123
- #: includes/class-display.php:1562
1124
  msgid "June"
1125
  msgstr ""
1126
 
1127
- #: includes/class-display.php:1563
1128
  msgid "July "
1129
  msgstr ""
1130
 
1131
- #: includes/class-display.php:1564
1132
  msgid "August"
1133
  msgstr ""
1134
 
1135
- #: includes/class-display.php:1565
1136
  msgid "September"
1137
  msgstr ""
1138
 
1139
- #: includes/class-display.php:1566
1140
  msgid "October"
1141
  msgstr ""
1142
 
1143
- #: includes/class-display.php:1567
1144
  msgid "November"
1145
  msgstr ""
1146
 
1147
- #: includes/class-display.php:1568
1148
  msgid "December"
1149
  msgstr ""
1150
 
1151
  #. translators: placeholder will hold company info for site owner.
1152
- #: includes/class-display.php:1743
1153
  msgid "By submitting this form, you are consenting to receive marketing emails from: %1$s. You can revoke your consent to receive emails at any time by using the SafeUnsubscribe&reg; link, found at the bottom of every email. %2$s"
1154
  msgstr ""
1155
 
1156
- #: includes/class-display.php:1750
1157
  msgid "Emails are serviced by Constant Contact"
1158
  msgstr ""
1159
 
@@ -1165,11 +1180,11 @@ msgstr ""
1165
  msgid "List information will populate upon saving."
1166
  msgstr ""
1167
 
1168
- #: includes/class-lists.php:760
1169
  msgid "You already have a list with that name."
1170
  msgstr ""
1171
 
1172
- #: includes/class-lists.php:777
1173
  msgid "Sync Lists with Constant Contact"
1174
  msgstr ""
1175
 
@@ -1181,88 +1196,88 @@ msgstr ""
1181
  msgid "Debug logs"
1182
  msgstr ""
1183
 
1184
- #: includes/class-logging.php:217
1185
  msgid "No error log exists"
1186
  msgstr ""
1187
 
1188
  #. translators: placeholder holds the log location.
1189
- #: includes/class-logging.php:223
1190
  msgid "We are not able to write to the %s file."
1191
  msgstr ""
1192
 
1193
- #: includes/class-logging.php:234
1194
  msgid "Error log below can be used with support requests to help identify issues with Constant Contact Forms."
1195
  msgstr ""
1196
 
1197
- #: includes/class-logging.php:235
1198
  msgid "When available, you can share information by copying and pasting the content in the textarea, or by using the \"Download logs\" link at the end. Logs can be cleared by using the \"Delete logs\" link."
1199
  msgstr ""
1200
 
1201
- #: includes/class-logging.php:241
1202
  msgid "Error log may still have content, even if an error is shown above. Please use the download link below."
1203
  msgstr ""
1204
 
1205
- #: includes/class-logging.php:252
1206
  msgid "Download logs"
1207
  msgstr ""
1208
 
1209
- #: includes/class-logging.php:260
1210
  msgid "Delete logs"
1211
  msgstr ""
1212
 
1213
  #. translators: placeholder wil have error message.
1214
- #: includes/class-logging.php:321
1215
  msgid "Log display error: %s"
1216
  msgstr ""
1217
 
1218
  #. translators: this is only used when some debugging is enabled
1219
- #: includes/class-mail.php:282
1220
  msgid "Duplicate send mail for: %1$s and: %2$s"
1221
  msgstr ""
1222
 
1223
- #: includes/class-mail.php:313
1224
  msgid "Your Constant Contact Forms plugin has captured new information."
1225
  msgstr ""
1226
 
1227
- #: includes/class-mail.php:317
1228
  msgid "Form title: "
1229
  msgstr ""
1230
 
1231
- #: includes/class-mail.php:318
1232
  msgid "Form information: "
1233
  msgstr ""
1234
 
1235
  #. translators: placeholders provide Constant Contact link information.
1236
- #: includes/class-mail.php:324
1237
  msgid "Email marketing is a great way to stay connected and engage with visitors after they've left your site. Visit %1$shttps://www.constantcontact.com/index?pn=miwordpress%2$s to sign up for a Free Trial."
1238
  msgstr ""
1239
 
1240
- #: includes/class-mail.php:361
1241
  msgid "Constant Contact Forms Notification"
1242
  msgstr ""
1243
 
1244
  #. translators: placeholders simply meant for `<strong>` html tags
1245
- #: includes/class-mail.php:451
1246
- msgid "%1\$sNote:%2\$s You have disabled admin email notifications under the plugin settings, but are receiving this email because of the following reason."
1247
  msgstr ""
1248
 
1249
- #: includes/class-mail.php:474
1250
  msgid "Submitted to Constant Contact:"
1251
  msgstr ""
1252
 
1253
- #: includes/class-mail.php:480
1254
  msgid "NO (Constant Contact list not selected for this form)"
1255
  msgstr ""
1256
 
1257
- #: includes/class-mail.php:486
1258
  msgid "NO (User did not select the Email Opt-in checkbox)"
1259
  msgstr ""
1260
 
1261
- #: includes/class-mail.php:486
1262
  msgid "You can disable this under Form options. Email Opt-in isn't required to add subscribers into your account"
1263
  msgstr ""
1264
 
1265
- #. translators: Placeholder will hold "Constan Contact Forms" with <strong> tags.
1266
  #: includes/class-notification-content.php:57
1267
  msgid "Get the most out of the %s plugin &mdash; use it with an active Constant Contact account."
1268
  msgstr ""
@@ -1316,51 +1331,55 @@ msgstr ""
1316
  msgid "Dismiss this notice."
1317
  msgstr ""
1318
 
1319
- #: includes/class-optin.php:137, includes/class-settings.php:902
1320
  msgid "Agree"
1321
  msgstr ""
1322
 
1323
- #: includes/class-optin.php:138, includes/class-settings.php:903
1324
  msgid "Disagree"
1325
  msgstr ""
1326
 
1327
- #: includes/class-process-form.php:104, includes/class-process-form.php:638
1328
  msgid "There was an error sending your form."
1329
  msgstr ""
1330
 
1331
- #: includes/class-process-form.php:115, includes/class-process-form.php:656
1332
  msgid "Your information has been submitted."
1333
  msgstr ""
1334
 
1335
- #: includes/class-process-form.php:130, includes/class-process-form.php:670
1336
  msgid "We had trouble processing your submission. Please review your entries and try again."
1337
  msgstr ""
1338
 
1339
- #: includes/class-process-form.php:176
1340
  msgid "No Constant Contact Forms form ID provided"
1341
  msgstr ""
1342
 
1343
- #: includes/class-process-form.php:183
1344
  msgid "No form verify value provided"
1345
  msgstr ""
1346
 
1347
- #: includes/class-process-form.php:198
1348
  msgid "Please properly fill out all required fields"
1349
  msgstr ""
1350
 
1351
- #: includes/class-process-form.php:235
1352
  msgid "Failed reCAPTCHA check"
1353
  msgstr ""
1354
 
1355
- #: includes/class-process-form.php:267, includes/class-process-form.php:283
1356
  msgid "We had trouble processing your submission. Make sure you haven't changed the required form ID and try again."
1357
  msgstr ""
1358
 
1359
- #: includes/class-process-form.php:275
1360
  msgid "We had trouble processing your submission. Make sure you haven't changed the required Form ID and try again."
1361
  msgstr ""
1362
 
1363
- #: includes/class-process-form.php:735
 
 
 
 
1364
  msgid "We do no think you are human"
1365
  msgstr ""
1366
 
@@ -1372,144 +1391,152 @@ msgstr ""
1372
  msgid "Spam Control"
1373
  msgstr ""
1374
 
1375
- #: includes/class-settings.php:66, includes/class-settings.php:568
1376
  msgid "Support"
1377
  msgstr ""
1378
 
1379
- #: includes/class-settings.php:324
1380
  msgid "Constant Contact Forms Settings"
1381
  msgstr ""
1382
 
1383
- #: includes/class-settings.php:325
1384
  msgid "Settings"
1385
  msgstr ""
1386
 
1387
- #: includes/class-settings.php:345
1388
  msgid "Google Analytics&trade; tracking opt-in."
1389
  msgstr ""
1390
 
1391
- #: includes/class-settings.php:348
1392
  msgid "Allow Constant Contact to use Google Analytics&trade; to track your usage across the Constant Contact Forms plugin.<br/> NOTE &mdash; Your website and users will not be tracked. See our <a href=\"https://www.endurance.com/privacy\"> Privacy Statement</a> information about what is and is not tracked."
1393
  msgstr ""
1394
 
1395
- #: includes/class-settings.php:354
1396
  msgid "Disable E-mail Notifications"
1397
  msgstr ""
1398
 
1399
  #. translators: Placeholder is for a <br /> HTML tag.
1400
- #: includes/class-settings.php:357
1401
  msgid "This option will disable e-mail notifications for forms with a selected list and successfully submit to Constant Contact.%s Notifications are sent to the email address listed under Wordpress \"General Settings\"."
1402
  msgstr ""
1403
 
1404
- #: includes/class-settings.php:365
1405
  msgid "Bypass Constant Contact cron scheduling"
1406
  msgstr ""
1407
 
1408
- #: includes/class-settings.php:366
1409
  msgid "This option will send form entries to Constant Contact right away instead of holding for one minute delay."
1410
  msgstr ""
1411
 
1412
- #: includes/class-settings.php:380
1413
  msgid "Advanced Opt-in"
1414
  msgstr ""
1415
 
1416
- #: includes/class-settings.php:385
1417
  msgid "Opt-in Location"
1418
  msgstr ""
1419
 
1420
- #: includes/class-settings.php:392, includes/class-settings.php:399
1421
  msgid "Select a list"
1422
  msgstr ""
1423
 
 
 
 
 
1424
  #. translators: placeholder will hold site owner's business name.
1425
- #: includes/class-settings.php:417
1426
  msgid "Yes, I would like to receive emails from %s. Sign me up!"
1427
  msgstr ""
1428
 
1429
- #: includes/class-settings.php:422
1430
  msgid "Disclosure Name"
1431
  msgstr ""
1432
 
1433
- #: includes/class-settings.php:430
1434
  msgid "Disclosure Address"
1435
  msgstr ""
1436
 
1437
- #: includes/class-settings.php:444
1438
  msgid "Global Form CSS Settings"
1439
  msgstr ""
1440
 
1441
- #: includes/class-settings.php:452
 
 
 
 
1442
  msgid "Provide custom classes for the form separated by a single space."
1443
  msgstr ""
1444
 
1445
- #: includes/class-settings.php:472
1446
  msgid "Choose the position for the labels of the form elements."
1447
  msgstr ""
1448
 
1449
- #: includes/class-settings.php:492
1450
  msgid "Google reCAPTCHA"
1451
  msgstr ""
1452
 
1453
- #: includes/class-settings.php:495
1454
  msgid "Learn more and get an "
1455
  msgstr ""
1456
 
1457
- #: includes/class-settings.php:497
1458
  msgid "API site key"
1459
  msgstr ""
1460
 
1461
- #: includes/class-settings.php:502
1462
  msgid "Version"
1463
  msgstr ""
1464
 
1465
- #: includes/class-settings.php:508
1466
  msgid "Version 2"
1467
  msgstr ""
1468
 
1469
- #: includes/class-settings.php:509
1470
  msgid "Version 3"
1471
  msgstr ""
1472
 
1473
- #: includes/class-settings.php:514
1474
  msgid "Site Key"
1475
  msgstr ""
1476
 
1477
- #: includes/class-settings.php:524
1478
  msgid "Secret Key"
1479
  msgstr ""
1480
 
1481
- #: includes/class-settings.php:537
1482
  msgid "Suspected Bot Error Message"
1483
  msgstr ""
1484
 
1485
- #: includes/class-settings.php:540
1486
  msgid "This message displays when the plugin detects spam data. Note that this message may be overriden on a per-post basis."
1487
  msgstr ""
1488
 
1489
- #: includes/class-settings.php:546
1490
  msgid "Error Message"
1491
  msgstr ""
1492
 
1493
- #: includes/class-settings.php:572
1494
  msgid "Enable logging for debugging purposes."
1495
  msgstr ""
1496
 
1497
- #: includes/class-settings.php:573
1498
  msgid "This option will turn on some logging functionality that can be used to deduce sources of issues with the use of Constant Contact Forms plugin."
1499
  msgstr ""
1500
 
1501
- #: includes/class-settings.php:590
1502
  msgid "Add a checkbox to the comment field in your posts"
1503
  msgstr ""
1504
 
1505
- #: includes/class-settings.php:591
1506
  msgid "Add a checkbox to the main WordPress login page"
1507
  msgstr ""
1508
 
1509
- #: includes/class-settings.php:595
1510
  msgid "Add a checkbox to the WordPress user registration page"
1511
  msgstr ""
1512
 
1513
- #: includes/class-settings.php:985
1514
  msgid "We do not think you are human"
1515
  msgstr ""
13
  "X-Poedit-SourceCharset: UTF-8\n"
14
  "Plural-Forms: nplurals=2; plural=(n != 1);\n"
15
 
16
+ #: constant-contact-forms.php:375, includes/class-cpts.php:89, includes/class-cpts.php:148
17
  msgid "Constant Contact"
18
  msgstr ""
19
 
20
+ #: constant-contact-forms.php:410
21
  msgid "Constant Contact Forms requires PHP 5.4 or higher. Your hosting provider or website administrator should be able to assist in updating your PHP version."
22
  msgstr ""
23
 
24
+ #: constant-contact-forms.php:714
25
  msgid "Error loading license."
26
  msgstr ""
27
 
74
  msgid "Constant Contact Logo"
75
  msgstr ""
76
 
77
+ #: includes/class-admin-pages.php:216, includes/class-notification-content.php:58
78
  msgid "Constant Contact Forms"
79
  msgstr ""
80
 
214
  msgid "Constant Contact Forms - License"
215
  msgstr ""
216
 
217
+ #: includes/class-admin.php:129, includes/class-admin.php:130, includes/class-admin.php:390
218
  msgid "About"
219
  msgstr ""
220
 
221
+ #: includes/class-admin.php:138, includes/class-admin.php:139, includes/class-admin.php:391
222
  msgid "License"
223
  msgstr ""
224
 
225
+ #: includes/class-admin.php:224, includes/class-settings.php:870
226
  msgid "Settings updated."
227
  msgstr ""
228
 
230
  msgid "Description"
231
  msgstr ""
232
 
233
+ #: includes/class-admin.php:262, includes/class-builder-fields.php:705
234
  msgid "Shortcode"
235
  msgstr ""
236
 
238
  msgid "Associated List"
239
  msgstr ""
240
 
241
+ #: includes/class-admin.php:313
242
+ msgid "No associated list"
243
+ msgstr ""
244
+
245
+ #: includes/class-admin.php:332
246
  msgid "Contact Count"
247
  msgstr ""
248
 
249
+ #: includes/class-admin.php:388
250
  msgid "Check out the official WordPress plugin from @constantcontact:"
251
  msgstr ""
252
 
253
+ #: includes/class-admin.php:402
254
  msgid "Spread the word!"
255
  msgstr ""
256
 
257
+ #: includes/class-admin.php:484
258
  msgid "You have unsaved changes."
259
  msgstr ""
260
 
261
+ #: includes/class-admin.php:485
262
  msgid "move up"
263
  msgstr ""
264
 
265
+ #: includes/class-admin.php:486
266
  msgid "move down"
267
  msgstr ""
268
 
334
  msgid "Website"
335
  msgstr ""
336
 
337
+ #: includes/class-builder-fields.php:152
338
+ msgid "http://www.example.com"
339
+ msgstr ""
340
+
341
  #: includes/class-builder-fields.php:155
342
  msgid "Custom Text Field"
343
  msgstr ""
362
  msgid "Constant Contact List"
363
  msgstr ""
364
 
365
+ #: includes/class-builder-fields.php:222
366
+ msgid "Allow subscribers to select from lists"
 
 
 
 
367
  msgstr ""
368
 
369
+ #: includes/class-builder-fields.php:240
370
  msgid "Form Description"
371
  msgstr ""
372
 
373
+ #: includes/class-builder-fields.php:248
374
  msgid "This message will display above the form fields, so use it as an opportunity to pitch your email list. Tell visitors why they should subscribe to your emails, focusing on benefits like insider tips, discounts, subscriber coupons, and more."
375
  msgstr ""
376
 
377
+ #: includes/class-builder-fields.php:268
378
  msgid "Form Options"
379
  msgstr ""
380
 
381
+ #: includes/class-builder-fields.php:276
382
  msgid "Button text"
383
  msgstr ""
384
 
385
+ #: includes/class-builder-fields.php:279
386
  msgid "Sign up"
387
  msgstr ""
388
 
389
+ #: includes/class-builder-fields.php:283
390
  msgid "Success message"
391
  msgstr ""
392
 
393
+ #: includes/class-builder-fields.php:286
394
  msgid "Your information has been submitted"
395
  msgstr ""
396
 
397
+ #: includes/class-builder-fields.php:290
398
  msgid "Submission behavior"
399
  msgstr ""
400
 
401
+ #: includes/class-builder-fields.php:297
402
  msgid "Redirect URL"
403
  msgstr ""
404
 
405
  #. translators: 1: basic field info, 2: warning about invalid values, 3: recommended field value
406
+ #: includes/class-builder-fields.php:303
407
  msgid "Leave blank to keep users on the current page."
408
  msgstr ""
409
 
410
+ #: includes/class-builder-fields.php:304
411
  msgid "NOTE: This URL must be within the current site and may not be a direct link to a media file (e.g., a PDF document). Providing a Redirect URL that is outside the current site or is a media file will cause issues with Constant Constact functionality, including contacts not being added to lists successfully."
412
  msgstr ""
413
 
414
+ #: includes/class-builder-fields.php:305
415
  msgid "It is recommended to leave this field blank or provide a URL to a page that contains any external or media links within the page content."
416
  msgstr ""
417
 
418
+ #: includes/class-builder-fields.php:311
419
  msgid "No page refresh"
420
  msgstr ""
421
 
422
+ #: includes/class-builder-fields.php:314
423
  msgid "Enable form submission without a page refresh. This option overrides the Redirect URL choice above."
424
  msgstr ""
425
 
426
+ #: includes/class-builder-fields.php:319
427
  msgid "Disable Google reCAPTCHA for this form?"
428
  msgstr ""
429
 
430
+ #: includes/class-builder-fields.php:322
431
  msgid "Checking will disable Google's reCAPTCHA output for this form. Only valid if using Google reCAPTCHA version 2"
432
  msgstr ""
433
 
434
+ #: includes/class-builder-fields.php:327
435
  msgid "Spam notice"
436
  msgstr ""
437
 
438
+ #: includes/class-builder-fields.php:334
439
  msgid "Spam Error Message"
440
  msgstr ""
441
 
442
+ #: includes/class-builder-fields.php:337
443
  msgid "Set the spam error message displayed for this form."
444
  msgstr ""
445
 
446
+ #: includes/class-builder-fields.php:353
447
  msgid "Form Design"
448
  msgstr ""
449
 
450
+ #: includes/class-builder-fields.php:360, includes/class-builder-fields.php:422
451
  msgid "Background Color"
452
  msgstr ""
453
 
454
+ #: includes/class-builder-fields.php:363
455
  msgid "Applies to the whole form."
456
  msgstr ""
457
 
458
+ #: includes/class-builder-fields.php:370
459
  msgid "Form Fonts"
460
  msgstr ""
461
 
462
+ #: includes/class-builder-fields.php:376, includes/class-builder-fields.php:404
463
  msgid "Font Size"
464
  msgstr ""
465
 
466
+ #: includes/class-builder-fields.php:381
467
  msgid "Only applies to the form description."
468
  msgstr ""
469
 
470
+ #: includes/class-builder-fields.php:388, includes/class-builder-fields.php:412
471
  msgid "Font Color"
472
  msgstr ""
473
 
474
+ #: includes/class-builder-fields.php:391
475
  msgid "Applies to the form description, input labels, and disclosure text."
476
  msgstr ""
477
 
478
+ #: includes/class-builder-fields.php:398
479
  msgid "Form Submit Button"
480
  msgstr ""
481
 
482
+ #: includes/class-builder-fields.php:415
483
  msgid "Choose a color for the submit button text."
484
  msgstr ""
485
 
486
+ #: includes/class-builder-fields.php:425
487
  msgid "Choose a color for the submit button background."
488
  msgstr ""
489
 
490
+ #: includes/class-builder-fields.php:440
491
  msgid "Input Design"
492
  msgstr ""
493
 
494
+ #: includes/class-builder-fields.php:447
495
  msgid "Form Padding"
496
  msgstr ""
497
 
498
+ #: includes/class-builder-fields.php:450
499
+ msgid "Enter padding values in number of pixels. Padding will be applied to four sides of the form."
500
+ msgstr ""
501
+
502
+ #: includes/class-builder-fields.php:456, includes/class-builder-fields.php:511, includes/class-settings.php:468
503
  msgid "Top"
504
  msgstr ""
505
 
506
+ #: includes/class-builder-fields.php:466, includes/class-builder-fields.php:514, includes/class-settings.php:470
507
  msgid "Right"
508
  msgstr ""
509
 
510
+ #: includes/class-builder-fields.php:476, includes/class-builder-fields.php:513, includes/class-settings.php:471
511
  msgid "Bottom"
512
  msgstr ""
513
 
514
+ #: includes/class-builder-fields.php:486, includes/class-builder-fields.php:512, includes/class-settings.php:469
515
  msgid "Left"
516
  msgstr ""
517
 
518
+ #: includes/class-builder-fields.php:496
519
  msgid "Custom Classes"
520
  msgstr ""
521
 
522
+ #: includes/class-builder-fields.php:499
523
  msgid "Set custom CSS class(es) for inputs. Separate multiple classes with spaces."
524
  msgstr ""
525
 
526
+ #: includes/class-builder-fields.php:506, includes/class-settings.php:462
527
  msgid "Label Placement"
528
  msgstr ""
529
 
530
+ #: includes/class-builder-fields.php:509
531
  msgid "Global"
532
  msgstr ""
533
 
534
+ #: includes/class-builder-fields.php:515, includes/class-settings.php:472
535
  msgid "Hidden"
536
  msgstr ""
537
 
538
+ #: includes/class-builder-fields.php:517
539
  msgid "Set the position for labels for inputs."
540
  msgstr ""
541
 
542
+ #: includes/class-builder-fields.php:535
543
  msgid "Enabling this option will require users to check a box to be added to your list."
544
  msgstr ""
545
 
546
+ #: includes/class-builder-fields.php:542
547
  msgid "Learn more"
548
  msgstr ""
549
 
550
+ #: includes/class-builder-fields.php:547
551
  msgid "Email opt-in"
552
  msgstr ""
553
 
554
+ #: includes/class-builder-fields.php:567
555
  msgid "Enable email subscriber opt-in"
556
  msgstr ""
557
 
558
+ #: includes/class-builder-fields.php:569
559
  msgid "Adds an opt-in to the bottom of your form."
560
  msgstr ""
561
 
562
+ #: includes/class-builder-fields.php:588
563
  msgid "Add a checkbox so subscribers can opt-in to your email list."
564
  msgstr ""
565
 
566
+ #: includes/class-builder-fields.php:590
567
  msgid "(For use with Contact Us form)"
568
  msgstr ""
569
 
570
+ #: includes/class-builder-fields.php:593
571
  msgid "Opt-in checkbox"
572
  msgstr ""
573
 
574
+ #: includes/class-builder-fields.php:613, includes/class-settings.php:415
575
  msgid "Opt-in Affirmation"
576
  msgstr ""
577
 
578
  #. translators: placeholder has a business name from Constant Contact.
579
+ #: includes/class-builder-fields.php:617
580
  msgid "Example: Yes, I would like to receive emails from %s. (You can unsubscribe anytime)"
581
  msgstr ""
582
 
583
+ #: includes/class-builder-fields.php:630
584
  msgid "Form Fields"
585
  msgstr ""
586
 
587
+ #: includes/class-builder-fields.php:638
588
  msgid "Add Fields"
589
  msgstr ""
590
 
591
+ #: includes/class-builder-fields.php:645
592
  msgid "Create a field for each piece of information you want to collect. Good basics include email address, first name, and last name."
593
  msgstr ""
594
 
595
+ #: includes/class-builder-fields.php:655
596
  msgid "Field {#}"
597
  msgstr ""
598
 
599
+ #: includes/class-builder-fields.php:656
600
  msgid "Add Another Field"
601
  msgstr ""
602
 
603
+ #: includes/class-builder-fields.php:657
604
  msgid "Remove Field"
605
  msgstr ""
606
 
607
+ #: includes/class-builder-fields.php:663
608
  msgid "Select a Field"
609
  msgstr ""
610
 
611
+ #: includes/class-builder-fields.php:673
612
  msgid "Field Label"
613
  msgstr ""
614
 
615
+ #: includes/class-builder-fields.php:680
616
  msgid "Field Description"
617
  msgstr ""
618
 
619
+ #: includes/class-builder-fields.php:684
620
  msgid "Ex: Enter email address"
621
  msgstr ""
622
 
623
+ #: includes/class-builder-fields.php:689
624
  msgid "Required"
625
  msgstr ""
626
 
627
+ #: includes/class-builder-fields.php:713
628
  msgid "Shortcode to use"
629
  msgstr ""
630
 
631
  #. translators: Placeholders here represent `<em>` and `<strong>` HTML tags.
632
+ #: includes/class-builder-fields.php:718
633
  msgid "Shortcode to embed — %1$s%2$sYou can copy and paste this in a post to display your form.%3$s%4$s"
634
  msgstr ""
635
 
636
+ #: includes/class-builder-fields.php:740
637
  msgid "Email settings"
638
  msgstr ""
639
 
640
+ #: includes/class-builder-fields.php:747
641
  msgid "Email destination"
642
  msgstr ""
643
 
644
+ #: includes/class-builder-fields.php:748
645
  msgid "Who should receive email notifications for this form. Separate multiple emails by a comma. Leave blank to default to admin email."
646
  msgstr ""
647
 
648
+ #: includes/class-builder-fields.php:754
649
  msgid "Disable email notifications for this form?"
650
  msgstr ""
651
 
652
+ #: includes/class-builder-fields.php:755
653
  msgid "Check this option to disable emails for this Constant Contact Forms form."
654
  msgstr ""
655
 
656
+ #: includes/class-builder-fields.php:771
657
  msgid "Reset Styles"
658
  msgstr ""
659
 
660
+ #: includes/class-builder-fields.php:782, includes/class-builder-fields.php:800
661
  msgid "Reset"
662
  msgstr ""
663
 
664
+ #: includes/class-builder-fields.php:783
665
  msgid "Reset the styles for this Form."
666
  msgstr ""
667
 
765
  msgstr ""
766
 
767
  #. translators: Placeholder will be an HTTP response code.
768
+ #: includes/class-check.php:205
769
  msgid "Unexpected HTTP response code: %1$s"
770
  msgstr ""
771
 
772
+ #: includes/class-check.php:210
773
  msgid "Cron spawn ok"
774
  msgstr ""
775
 
785
  msgid "Are you sure you want to disconnect?"
786
  msgstr ""
787
 
788
+ #: includes/class-connect.php:169, includes/class-logging.php:216, includes/class-notification-content.php:111, includes/class-notification-content.php:148, includes/class-optin.php:129, includes/class-settings.php:950
789
  msgctxt "img alt text"
790
  msgid "Constant Contact logo"
791
  msgstr ""
857
  msgid "New Form"
858
  msgstr ""
859
 
860
+ #: includes/class-cpts.php:72, includes/class-display.php:861
861
  msgid "Edit Form"
862
  msgstr ""
863
 
999
  msgid "Constant Contact lists."
1000
  msgstr ""
1001
 
1002
+ #: includes/class-cpts.php:188, includes/class-cpts.php:191
1003
  msgid "List updated."
1004
  msgstr ""
1005
 
1006
+ #: includes/class-cpts.php:189, includes/class-cpts.php:208
1007
  msgid "Custom field updated."
1008
  msgstr ""
1009
 
1010
+ #: includes/class-cpts.php:190, includes/class-cpts.php:209
1011
  msgid "Custom field deleted."
1012
  msgstr ""
1013
 
1014
+ #: includes/class-cpts.php:196
1015
  msgid "List published."
1016
  msgstr ""
1017
 
1018
+ #: includes/class-cpts.php:197
1019
  msgid "List saved."
1020
  msgstr ""
1021
 
1022
+ #: includes/class-cpts.php:198
1023
  msgid "List submitted."
1024
  msgstr ""
1025
 
1026
+ #. translators: formatted post date timestamp.
1027
+ #: includes/class-cpts.php:200
1028
  msgid "List scheduled for: <strong>%1$s</strong>."
1029
  msgstr ""
1030
 
1031
+ #: includes/class-cpts.php:202
1032
  msgid "List draft updated."
1033
  msgstr ""
1034
 
1035
+ #: includes/class-cpts.php:207, includes/class-cpts.php:210
1036
  msgid "Form updated."
1037
  msgstr ""
1038
 
1039
+ #. translators: form shortcode.
1040
+ #: includes/class-cpts.php:217
1041
  msgid "Success! Here's the shortcode: %s. Just paste it into a post or page editor to publish"
1042
  msgstr ""
1043
 
1044
+ #: includes/class-cpts.php:220
1045
  msgid "Form saved."
1046
  msgstr ""
1047
 
1048
+ #: includes/class-cpts.php:221
1049
  msgid "Form submitted."
1050
  msgstr ""
1051
 
1052
+ #. translators: formatted post date timestamp.
1053
+ #: includes/class-cpts.php:223
1054
  msgid "Form scheduled for: <strong>%1$s</strong>."
1055
  msgstr ""
1056
 
1057
+ #: includes/class-cpts.php:225
1058
  msgid "Form draft updated."
1059
  msgstr ""
1060
 
1061
+ #: includes/class-cpts.php:253
1062
  msgid "Enter a form name"
1063
  msgstr ""
1064
 
1065
+ #: includes/class-cpts.php:254
1066
  msgid "(Examples: Join Our Email List, Contact Us)"
1067
  msgstr ""
1068
 
1069
  #. translators: Placeholders will be form title and then last modified date.
1070
+ #: includes/class-cpts.php:320
1071
  msgid "%1$s (last modified %2$s ago)"
1072
  msgstr ""
1073
 
1074
+ #: includes/class-display.php:522
1075
+ msgid "Select list(s) to subscribe to"
1076
+ msgstr ""
1077
+
1078
+ #: includes/class-display.php:544
1079
  msgid "Constant Contact Use."
1080
  msgstr ""
1081
 
1082
+ #: includes/class-display.php:699, includes/class-display.php:1799
1083
  msgid "Error: Please correct your entry."
1084
  msgstr ""
1085
 
1086
+ #: includes/class-display.php:1372
1087
  msgid "Street Address"
1088
  msgstr ""
1089
 
1090
+ #: includes/class-display.php:1373
1091
  msgid "Address Line 2"
1092
  msgstr ""
1093
 
1094
+ #: includes/class-display.php:1374
1095
  msgid "City"
1096
  msgstr ""
1097
 
1098
+ #: includes/class-display.php:1375
1099
  msgid "State"
1100
  msgstr ""
1101
 
1102
+ #: includes/class-display.php:1376
1103
  msgid "ZIP Code"
1104
  msgstr ""
1105
 
1106
+ #: includes/class-display.php:1566
1107
  msgid "Month"
1108
  msgstr ""
1109
 
1110
+ #: includes/class-display.php:1567
1111
  msgid "Day"
1112
  msgstr ""
1113
 
1114
+ #: includes/class-display.php:1568
1115
  msgid "Year"
1116
  msgstr ""
1117
 
1118
+ #: includes/class-display.php:1684
1119
  msgid "January"
1120
  msgstr ""
1121
 
1122
+ #: includes/class-display.php:1685
1123
  msgid "February"
1124
  msgstr ""
1125
 
1126
+ #: includes/class-display.php:1686
1127
  msgid "March"
1128
  msgstr ""
1129
 
1130
+ #: includes/class-display.php:1687
1131
  msgid "April"
1132
  msgstr ""
1133
 
1134
+ #: includes/class-display.php:1688
1135
  msgid "May"
1136
  msgstr ""
1137
 
1138
+ #: includes/class-display.php:1689
1139
  msgid "June"
1140
  msgstr ""
1141
 
1142
+ #: includes/class-display.php:1690
1143
  msgid "July "
1144
  msgstr ""
1145
 
1146
+ #: includes/class-display.php:1691
1147
  msgid "August"
1148
  msgstr ""
1149
 
1150
+ #: includes/class-display.php:1692
1151
  msgid "September"
1152
  msgstr ""
1153
 
1154
+ #: includes/class-display.php:1693
1155
  msgid "October"
1156
  msgstr ""
1157
 
1158
+ #: includes/class-display.php:1694
1159
  msgid "November"
1160
  msgstr ""
1161
 
1162
+ #: includes/class-display.php:1695
1163
  msgid "December"
1164
  msgstr ""
1165
 
1166
  #. translators: placeholder will hold company info for site owner.
1167
+ #: includes/class-display.php:1870
1168
  msgid "By submitting this form, you are consenting to receive marketing emails from: %1$s. You can revoke your consent to receive emails at any time by using the SafeUnsubscribe&reg; link, found at the bottom of every email. %2$s"
1169
  msgstr ""
1170
 
1171
+ #: includes/class-display.php:1877
1172
  msgid "Emails are serviced by Constant Contact"
1173
  msgstr ""
1174
 
1180
  msgid "List information will populate upon saving."
1181
  msgstr ""
1182
 
1183
+ #: includes/class-lists.php:795
1184
  msgid "You already have a list with that name."
1185
  msgstr ""
1186
 
1187
+ #: includes/class-lists.php:812
1188
  msgid "Sync Lists with Constant Contact"
1189
  msgstr ""
1190
 
1196
  msgid "Debug logs"
1197
  msgstr ""
1198
 
1199
+ #: includes/class-logging.php:223
1200
  msgid "No error log exists"
1201
  msgstr ""
1202
 
1203
  #. translators: placeholder holds the log location.
1204
+ #: includes/class-logging.php:229
1205
  msgid "We are not able to write to the %s file."
1206
  msgstr ""
1207
 
1208
+ #: includes/class-logging.php:239
1209
  msgid "Error log below can be used with support requests to help identify issues with Constant Contact Forms."
1210
  msgstr ""
1211
 
1212
+ #: includes/class-logging.php:240
1213
  msgid "When available, you can share information by copying and pasting the content in the textarea, or by using the \"Download logs\" link at the end. Logs can be cleared by using the \"Delete logs\" link."
1214
  msgstr ""
1215
 
1216
+ #: includes/class-logging.php:246
1217
  msgid "Error log may still have content, even if an error is shown above. Please use the download link below."
1218
  msgstr ""
1219
 
1220
+ #: includes/class-logging.php:257
1221
  msgid "Download logs"
1222
  msgstr ""
1223
 
1224
+ #: includes/class-logging.php:265
1225
  msgid "Delete logs"
1226
  msgstr ""
1227
 
1228
  #. translators: placeholder wil have error message.
1229
+ #: includes/class-logging.php:326
1230
  msgid "Log display error: %s"
1231
  msgstr ""
1232
 
1233
  #. translators: this is only used when some debugging is enabled
1234
+ #: includes/class-mail.php:284
1235
  msgid "Duplicate send mail for: %1$s and: %2$s"
1236
  msgstr ""
1237
 
1238
+ #: includes/class-mail.php:315
1239
  msgid "Your Constant Contact Forms plugin has captured new information."
1240
  msgstr ""
1241
 
1242
+ #: includes/class-mail.php:319
1243
  msgid "Form title: "
1244
  msgstr ""
1245
 
1246
+ #: includes/class-mail.php:320
1247
  msgid "Form information: "
1248
  msgstr ""
1249
 
1250
  #. translators: placeholders provide Constant Contact link information.
1251
+ #: includes/class-mail.php:326
1252
  msgid "Email marketing is a great way to stay connected and engage with visitors after they've left your site. Visit %1$shttps://www.constantcontact.com/index?pn=miwordpress%2$s to sign up for a Free Trial."
1253
  msgstr ""
1254
 
1255
+ #: includes/class-mail.php:363
1256
  msgid "Constant Contact Forms Notification"
1257
  msgstr ""
1258
 
1259
  #. translators: placeholders simply meant for `<strong>` html tags
1260
+ #: includes/class-mail.php:453
1261
+ msgid "%1$sNote:%2$s You have disabled admin email notifications under the plugin settings, but are receiving this email because of the following reason."
1262
  msgstr ""
1263
 
1264
+ #: includes/class-mail.php:476
1265
  msgid "Submitted to Constant Contact:"
1266
  msgstr ""
1267
 
1268
+ #: includes/class-mail.php:482
1269
  msgid "NO (Constant Contact list not selected for this form)"
1270
  msgstr ""
1271
 
1272
+ #: includes/class-mail.php:488
1273
  msgid "NO (User did not select the Email Opt-in checkbox)"
1274
  msgstr ""
1275
 
1276
+ #: includes/class-mail.php:488
1277
  msgid "You can disable this under Form options. Email Opt-in isn't required to add subscribers into your account"
1278
  msgstr ""
1279
 
1280
+ #. translators: Placeholder will hold "Constant Contact Forms" with <strong> tags.
1281
  #: includes/class-notification-content.php:57
1282
  msgid "Get the most out of the %s plugin &mdash; use it with an active Constant Contact account."
1283
  msgstr ""
1331
  msgid "Dismiss this notice."
1332
  msgstr ""
1333
 
1334
+ #: includes/class-optin.php:137, includes/class-settings.php:956
1335
  msgid "Agree"
1336
  msgstr ""
1337
 
1338
+ #: includes/class-optin.php:138, includes/class-settings.php:957
1339
  msgid "Disagree"
1340
  msgstr ""
1341
 
1342
+ #: includes/class-process-form.php:117, includes/class-process-form.php:693
1343
  msgid "There was an error sending your form."
1344
  msgstr ""
1345
 
1346
+ #: includes/class-process-form.php:129, includes/class-process-form.php:714
1347
  msgid "Your information has been submitted."
1348
  msgstr ""
1349
 
1350
+ #: includes/class-process-form.php:146, includes/class-process-form.php:739
1351
  msgid "We had trouble processing your submission. Please review your entries and try again."
1352
  msgstr ""
1353
 
1354
+ #: includes/class-process-form.php:193
1355
  msgid "No Constant Contact Forms form ID provided"
1356
  msgstr ""
1357
 
1358
+ #: includes/class-process-form.php:200
1359
  msgid "No form verify value provided"
1360
  msgstr ""
1361
 
1362
+ #: includes/class-process-form.php:215
1363
  msgid "Please properly fill out all required fields"
1364
  msgstr ""
1365
 
1366
+ #: includes/class-process-form.php:268
1367
  msgid "Failed reCAPTCHA check"
1368
  msgstr ""
1369
 
1370
+ #: includes/class-process-form.php:301, includes/class-process-form.php:317
1371
  msgid "We had trouble processing your submission. Make sure you haven't changed the required form ID and try again."
1372
  msgstr ""
1373
 
1374
+ #: includes/class-process-form.php:309
1375
  msgid "We had trouble processing your submission. Make sure you haven't changed the required Form ID and try again."
1376
  msgstr ""
1377
 
1378
+ #: includes/class-process-form.php:359
1379
+ msgid "Please select at least one list to subscribe to."
1380
+ msgstr ""
1381
+
1382
+ #: includes/class-process-form.php:807
1383
  msgid "We do no think you are human"
1384
  msgstr ""
1385
 
1391
  msgid "Spam Control"
1392
  msgstr ""
1393
 
1394
+ #: includes/class-settings.php:66, includes/class-settings.php:570
1395
  msgid "Support"
1396
  msgstr ""
1397
 
1398
+ #: includes/class-settings.php:326
1399
  msgid "Constant Contact Forms Settings"
1400
  msgstr ""
1401
 
1402
+ #: includes/class-settings.php:327
1403
  msgid "Settings"
1404
  msgstr ""
1405
 
1406
+ #: includes/class-settings.php:347
1407
  msgid "Google Analytics&trade; tracking opt-in."
1408
  msgstr ""
1409
 
1410
+ #: includes/class-settings.php:350
1411
  msgid "Allow Constant Contact to use Google Analytics&trade; to track your usage across the Constant Contact Forms plugin.<br/> NOTE &mdash; Your website and users will not be tracked. See our <a href=\"https://www.endurance.com/privacy\"> Privacy Statement</a> information about what is and is not tracked."
1412
  msgstr ""
1413
 
1414
+ #: includes/class-settings.php:356
1415
  msgid "Disable E-mail Notifications"
1416
  msgstr ""
1417
 
1418
  #. translators: Placeholder is for a <br /> HTML tag.
1419
+ #: includes/class-settings.php:359
1420
  msgid "This option will disable e-mail notifications for forms with a selected list and successfully submit to Constant Contact.%s Notifications are sent to the email address listed under Wordpress \"General Settings\"."
1421
  msgstr ""
1422
 
1423
+ #: includes/class-settings.php:367
1424
  msgid "Bypass Constant Contact cron scheduling"
1425
  msgstr ""
1426
 
1427
+ #: includes/class-settings.php:368
1428
  msgid "This option will send form entries to Constant Contact right away instead of holding for one minute delay."
1429
  msgstr ""
1430
 
1431
+ #: includes/class-settings.php:382
1432
  msgid "Advanced Opt-in"
1433
  msgstr ""
1434
 
1435
+ #: includes/class-settings.php:387
1436
  msgid "Opt-in Location"
1437
  msgstr ""
1438
 
1439
+ #: includes/class-settings.php:394, includes/class-settings.php:401
1440
  msgid "Select a list"
1441
  msgstr ""
1442
 
1443
+ #: includes/class-settings.php:397
1444
+ msgid "Add subscribers to"
1445
+ msgstr ""
1446
+
1447
  #. translators: placeholder will hold site owner's business name.
1448
+ #: includes/class-settings.php:419
1449
  msgid "Yes, I would like to receive emails from %s. Sign me up!"
1450
  msgstr ""
1451
 
1452
+ #: includes/class-settings.php:424
1453
  msgid "Disclosure Name"
1454
  msgstr ""
1455
 
1456
+ #: includes/class-settings.php:432
1457
  msgid "Disclosure Address"
1458
  msgstr ""
1459
 
1460
+ #: includes/class-settings.php:446
1461
  msgid "Global Form CSS Settings"
1462
  msgstr ""
1463
 
1464
+ #: includes/class-settings.php:451
1465
+ msgid "CSS Classes"
1466
+ msgstr ""
1467
+
1468
+ #: includes/class-settings.php:454
1469
  msgid "Provide custom classes for the form separated by a single space."
1470
  msgstr ""
1471
 
1472
+ #: includes/class-settings.php:474
1473
  msgid "Choose the position for the labels of the form elements."
1474
  msgstr ""
1475
 
1476
+ #: includes/class-settings.php:494
1477
  msgid "Google reCAPTCHA"
1478
  msgstr ""
1479
 
1480
+ #: includes/class-settings.php:497
1481
  msgid "Learn more and get an "
1482
  msgstr ""
1483
 
1484
+ #: includes/class-settings.php:499
1485
  msgid "API site key"
1486
  msgstr ""
1487
 
1488
+ #: includes/class-settings.php:504
1489
  msgid "Version"
1490
  msgstr ""
1491
 
1492
+ #: includes/class-settings.php:510
1493
  msgid "Version 2"
1494
  msgstr ""
1495
 
1496
+ #: includes/class-settings.php:511
1497
  msgid "Version 3"
1498
  msgstr ""
1499
 
1500
+ #: includes/class-settings.php:516
1501
  msgid "Site Key"
1502
  msgstr ""
1503
 
1504
+ #: includes/class-settings.php:526
1505
  msgid "Secret Key"
1506
  msgstr ""
1507
 
1508
+ #: includes/class-settings.php:539
1509
  msgid "Suspected Bot Error Message"
1510
  msgstr ""
1511
 
1512
+ #: includes/class-settings.php:542
1513
  msgid "This message displays when the plugin detects spam data. Note that this message may be overriden on a per-post basis."
1514
  msgstr ""
1515
 
1516
+ #: includes/class-settings.php:548
1517
  msgid "Error Message"
1518
  msgstr ""
1519
 
1520
+ #: includes/class-settings.php:574
1521
  msgid "Enable logging for debugging purposes."
1522
  msgstr ""
1523
 
1524
+ #: includes/class-settings.php:575
1525
  msgid "This option will turn on some logging functionality that can be used to deduce sources of issues with the use of Constant Contact Forms plugin."
1526
  msgstr ""
1527
 
1528
+ #: includes/class-settings.php:592
1529
  msgid "Add a checkbox to the comment field in your posts"
1530
  msgstr ""
1531
 
1532
+ #: includes/class-settings.php:593
1533
  msgid "Add a checkbox to the main WordPress login page"
1534
  msgstr ""
1535
 
1536
+ #: includes/class-settings.php:597
1537
  msgid "Add a checkbox to the WordPress user registration page"
1538
  msgstr ""
1539
 
1540
+ #: includes/class-settings.php:1039
1541
  msgid "We do not think you are human"
1542
  msgstr ""
readme.txt CHANGED
@@ -2,8 +2,8 @@
2
  Contributors: constantcontact, webdevstudios, tw2113, znowebdev, ggwicz, ravedev
3
  Tags: capture, contacts, constant contact, constant contact form, constant contact newsletter, constant contact official, contact forms, email, form, forms, marketing, mobile, newsletter, opt-in, plugin, signup, subscribe, subscription, widget
4
  Requires at least: 5.2.0
5
- Tested up to: 5.5
6
- Stable tag: 1.8.8
7
  License: GPLv3
8
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
9
  Requires PHP: 5.6
@@ -35,6 +35,14 @@ BONUS: If you have a Constant Contact account, all new email addresses that you
35
 
36
  == Changelog ==
37
 
 
 
 
 
 
 
 
 
38
  = 1.8.8 =
39
  * Updated: Added extra security output escaping of custom input values
40
 
2
  Contributors: constantcontact, webdevstudios, tw2113, znowebdev, ggwicz, ravedev
3
  Tags: capture, contacts, constant contact, constant contact form, constant contact newsletter, constant contact official, contact forms, email, form, forms, marketing, mobile, newsletter, opt-in, plugin, signup, subscribe, subscription, widget
4
  Requires at least: 5.2.0
5
+ Tested up to: 5.5.1
6
+ Stable tag: 1.9.0
7
  License: GPLv3
8
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
9
  Requires PHP: 5.6
35
 
36
  == Changelog ==
37
 
38
+ = 1.9.0 =
39
+ * Added: Ability for site owners to multiple lists for users to choose which to sign up for.
40
+ * Fixed: Issues around enabling list signup on user registration.
41
+ * Fixed: Unintended markup in email notification text.
42
+ * Fixed: Inappropriate or unneeded markup around hidden fields.
43
+ * Updated: Max length values for first/last name fields.
44
+ * Updated: Deprecated some functions in order to get consistent naming across all our code.
45
+
46
  = 1.8.8 =
47
  * Updated: Added extra security output escaping of custom input values
48
 
vendor/constantcontact/constantcontact/.gitignore DELETED
@@ -1,25 +0,0 @@
1
- # Created by .gitignore support plugin (hsz.mobi)
2
-
3
- ## Directory-based project format
4
- .idea/
5
- /*.iml
6
-
7
- ## File-based project format
8
- *.ipr
9
- *.iws
10
-
11
- ## Additional for IntelliJ
12
- out/
13
-
14
- # generated by mpeltonen/sbt-idea plugin
15
- .idea_modules/
16
-
17
- # generated by JIRA plugin
18
- atlassian-ide-plugin.xml
19
-
20
- ### Composer template
21
- composer.lock
22
- composer.phar
23
- vendor/
24
-
25
- devFile.php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/defuse/php-encryption/.gitignore DELETED
@@ -1,11 +0,0 @@
1
- *~
2
- /test/unit/File/big-generated-file
3
- /composer.lock
4
- /vendor
5
- defuse-crypto.phar
6
- defuse-crypto.phar.sig
7
- composer.phar
8
- box.phar
9
- phpunit.phar
10
- phpunit.phar.asc
11
- test/unit/File/tmp
 
 
 
 
 
 
 
 
 
 
 
vendor/google/recaptcha/.gitignore DELETED
@@ -1,7 +0,0 @@
1
- /.php_cs.cache
2
- /.phpunit.result.cache
3
- /build
4
- /composer.lock
5
- /examples/config.php
6
- /nbproject/private/
7
- /vendor/
 
 
 
 
 
 
 
vendor/guzzlehttp/ringphp/.gitignore DELETED
@@ -1,4 +0,0 @@
1
- vendor
2
- build/artifacts/
3
- composer.lock
4
- docs/_build/
 
 
 
 
vendor/guzzlehttp/streams/.gitignore DELETED
@@ -1,6 +0,0 @@
1
- .idea
2
- .DS_STORE
3
- coverage
4
- phpunit.xml
5
- composer.lock
6
- vendor/
 
 
 
 
 
 
vendor/psr/log/.gitignore DELETED
@@ -1 +0,0 @@
1
- vendor
 
vendor/react/promise/.gitignore DELETED
@@ -1,5 +0,0 @@
1
- composer.lock
2
- composer.phar
3
- phpunit.xml
4
- build/
5
- vendor/