Formidable Forms – Form Builder for WordPress - Version 5.4.5

Version Description

  • New: Added support for several new language options for datepicker localization and for reCAPTCHA.
  • New: Updated deprecated code in Elementor widget for better compatibility with new versions of Elementor.
  • Fix: Actions that trigger when an entry is deleted were not properly working when conditional logic would check item meta values.
  • Fix: An imported application page's parent page ID was not updating to match the new imported parent page ID.
  • Fix: Clicking save while a field was still being inserted would cause an error pop up to appear with a missing message.
  • Removed a restriction that was preventing a second summary field from being added after adding the first.
Download this release

Release Info

Developer sswells
Plugin Icon 128x128 Formidable Forms – Form Builder for WordPress
Version 5.4.5
Comparing to
See all releases

Code changes from version 5.4.4 to 5.4.5

classes/controllers/FrmElementorController.php CHANGED
@@ -10,7 +10,7 @@ class FrmElementorController {
10
 
11
  public static function register_elementor_hooks() {
12
  require_once FrmAppHelper::plugin_path() . '/classes/widgets/FrmElementorWidget.php';
13
- \Elementor\Plugin::instance()->widgets_manager->register_widget_type( new \FrmElementorWidget() );
14
 
15
  if ( is_admin() ) {
16
  add_action(
10
 
11
  public static function register_elementor_hooks() {
12
  require_once FrmAppHelper::plugin_path() . '/classes/widgets/FrmElementorWidget.php';
13
+ \Elementor\Plugin::instance()->widgets_manager->register( new \FrmElementorWidget() );
14
 
15
  if ( is_admin() ) {
16
  add_action(
classes/controllers/FrmHooksController.php CHANGED
@@ -94,7 +94,7 @@ class FrmHooksController {
94
  add_filter( 'frm_keep_name_value_array', '__return_true' );
95
 
96
  // Elementor.
97
- add_action( 'elementor/widgets/widgets_registered', 'FrmElementorController::register_elementor_hooks' );
98
  add_filter( 'frm_fields_in_form_builder', 'FrmFormsController::update_form_builder_fields', 10, 2 );
99
  }
100
 
94
  add_filter( 'frm_keep_name_value_array', '__return_true' );
95
 
96
  // Elementor.
97
+ add_action( 'elementor/widgets/register', 'FrmElementorController::register_elementor_hooks' );
98
  add_filter( 'frm_fields_in_form_builder', 'FrmFormsController::update_form_builder_fields', 10, 2 );
99
  }
100
 
classes/helpers/FrmAppHelper.php CHANGED
@@ -16,7 +16,7 @@ class FrmAppHelper {
16
  /**
17
  * @since 2.0
18
  */
19
- public static $plug_version = '5.4.4';
20
 
21
  /**
22
  * @since 1.07.02
@@ -2980,15 +2980,23 @@ class FrmAppHelper {
2980
  }
2981
  }
2982
 
 
 
 
 
2983
  public static function locales( $type = 'date' ) {
2984
  $locales = array(
2985
  'en' => __( 'English', 'formidable' ),
2986
  'af' => __( 'Afrikaans', 'formidable' ),
2987
  'sq' => __( 'Albanian', 'formidable' ),
 
 
2988
  'ar' => __( 'Arabic', 'formidable' ),
2989
  'hy' => __( 'Armenian', 'formidable' ),
2990
  'az' => __( 'Azerbaijani', 'formidable' ),
2991
  'eu' => __( 'Basque', 'formidable' ),
 
 
2992
  'bs' => __( 'Bosnian', 'formidable' ),
2993
  'bg' => __( 'Bulgarian', 'formidable' ),
2994
  'ca' => __( 'Catalan', 'formidable' ),
@@ -3009,10 +3017,13 @@ class FrmAppHelper {
3009
  'fr' => __( 'French', 'formidable' ),
3010
  'fr-CA' => __( 'French/Canadian', 'formidable' ),
3011
  'fr-CH' => __( 'French/Swiss', 'formidable' ),
 
 
3012
  'de' => __( 'German', 'formidable' ),
3013
  'de-AT' => __( 'German/Austria', 'formidable' ),
3014
  'de-CH' => __( 'German/Switzerland', 'formidable' ),
3015
  'el' => __( 'Greek', 'formidable' ),
 
3016
  'he' => __( 'Hebrew', 'formidable' ),
3017
  'iw' => __( 'Hebrew', 'formidable' ),
3018
  'hi' => __( 'Hindi', 'formidable' ),
@@ -3021,41 +3032,71 @@ class FrmAppHelper {
3021
  'id' => __( 'Indonesian', 'formidable' ),
3022
  'it' => __( 'Italian', 'formidable' ),
3023
  'ja' => __( 'Japanese', 'formidable' ),
 
 
 
3024
  'ko' => __( 'Korean', 'formidable' ),
 
 
3025
  'lv' => __( 'Latvian', 'formidable' ),
3026
  'lt' => __( 'Lithuanian', 'formidable' ),
 
 
 
3027
  'ms' => __( 'Malaysian', 'formidable' ),
 
3028
  'no' => __( 'Norwegian', 'formidable' ),
 
 
3029
  'pl' => __( 'Polish', 'formidable' ),
3030
  'pt' => __( 'Portuguese', 'formidable' ),
3031
  'pt-BR' => __( 'Portuguese/Brazilian', 'formidable' ),
3032
  'pt-PT' => __( 'Portuguese/Portugal', 'formidable' ),
 
3033
  'ro' => __( 'Romanian', 'formidable' ),
3034
  'ru' => __( 'Russian', 'formidable' ),
3035
  'sr' => __( 'Serbian', 'formidable' ),
3036
  'sr-SR' => __( 'Serbian', 'formidable' ),
 
3037
  'sk' => __( 'Slovak', 'formidable' ),
3038
  'sl' => __( 'Slovenian', 'formidable' ),
3039
  'es' => __( 'Spanish', 'formidable' ),
3040
  'es-419' => __( 'Spanish/Latin America', 'formidable' ),
 
3041
  'sv' => __( 'Swedish', 'formidable' ),
3042
  'ta' => __( 'Tamil', 'formidable' ),
 
3043
  'th' => __( 'Thai', 'formidable' ),
 
3044
  'tr' => __( 'Turkish', 'formidable' ),
3045
  'uk' => __( 'Ukrainian', 'formidable' ),
 
3046
  'vi' => __( 'Vietnamese', 'formidable' ),
 
 
3047
  );
3048
 
3049
  if ( $type === 'captcha' ) {
3050
  // remove the languages unavailable for the captcha
3051
- $unset = array( 'af', 'sq', 'hy', 'az', 'eu', 'bs', 'zh-HK', 'eo', 'et', 'fo', 'fr-CH', 'he', 'is', 'ms', 'sr-SR', 'ta' );
3052
  } else {
3053
  // remove the languages unavailable for the datepicker
3054
- $unset = array( 'fil', 'fr-CA', 'de-AT', 'de-CH', 'iw', 'hi', 'pt', 'pt-PT', 'es-419' );
3055
  }
3056
 
3057
  $locales = array_diff_key( $locales, array_flip( $unset ) );
3058
- $locales = apply_filters( 'frm_locales', $locales );
 
 
 
 
 
 
 
 
 
 
 
3059
 
3060
  return $locales;
3061
  }
16
  /**
17
  * @since 2.0
18
  */
19
+ public static $plug_version = '5.4.5';
20
 
21
  /**
22
  * @since 1.07.02
2980
  }
2981
  }
2982
 
2983
+ /**
2984
+ * @param string $type
2985
+ * @return array<string,string>
2986
+ */
2987
  public static function locales( $type = 'date' ) {
2988
  $locales = array(
2989
  'en' => __( 'English', 'formidable' ),
2990
  'af' => __( 'Afrikaans', 'formidable' ),
2991
  'sq' => __( 'Albanian', 'formidable' ),
2992
+ 'ar-DZ' => __( 'Algerian Arabic', 'formidable' ),
2993
+ 'am' => __( 'Amharic', 'formidable' ),
2994
  'ar' => __( 'Arabic', 'formidable' ),
2995
  'hy' => __( 'Armenian', 'formidable' ),
2996
  'az' => __( 'Azerbaijani', 'formidable' ),
2997
  'eu' => __( 'Basque', 'formidable' ),
2998
+ 'be' => __( 'Belarusian', 'formidable' ),
2999
+ 'bn' => __( 'Bengali', 'formidable' ),
3000
  'bs' => __( 'Bosnian', 'formidable' ),
3001
  'bg' => __( 'Bulgarian', 'formidable' ),
3002
  'ca' => __( 'Catalan', 'formidable' ),
3017
  'fr' => __( 'French', 'formidable' ),
3018
  'fr-CA' => __( 'French/Canadian', 'formidable' ),
3019
  'fr-CH' => __( 'French/Swiss', 'formidable' ),
3020
+ 'gl' => __( 'Galician', 'formidable' ),
3021
+ 'ka' => __( 'Georgian', 'formidable' ),
3022
  'de' => __( 'German', 'formidable' ),
3023
  'de-AT' => __( 'German/Austria', 'formidable' ),
3024
  'de-CH' => __( 'German/Switzerland', 'formidable' ),
3025
  'el' => __( 'Greek', 'formidable' ),
3026
+ 'gu' => __( 'Gujarati', 'formidable' ),
3027
  'he' => __( 'Hebrew', 'formidable' ),
3028
  'iw' => __( 'Hebrew', 'formidable' ),
3029
  'hi' => __( 'Hindi', 'formidable' ),
3032
  'id' => __( 'Indonesian', 'formidable' ),
3033
  'it' => __( 'Italian', 'formidable' ),
3034
  'ja' => __( 'Japanese', 'formidable' ),
3035
+ 'kn' => __( 'Kannada', 'formidable' ),
3036
+ 'kk' => __( 'Kazakh', 'formidable' ),
3037
+ 'km' => __( 'Khmer', 'formidable' ),
3038
  'ko' => __( 'Korean', 'formidable' ),
3039
+ 'ky' => __( 'Kyrgyz', 'formidable' ),
3040
+ 'lo' => __( 'Laothian', 'formidable' ),
3041
  'lv' => __( 'Latvian', 'formidable' ),
3042
  'lt' => __( 'Lithuanian', 'formidable' ),
3043
+ 'lb' => __( 'Luxembourgish', 'formidable' ),
3044
+ 'mk' => __( 'Macedonian', 'formidable' ),
3045
+ 'ml' => __( 'Malayalam', 'formidable' ),
3046
  'ms' => __( 'Malaysian', 'formidable' ),
3047
+ 'mr' => __( 'Marathi', 'formidable' ),
3048
  'no' => __( 'Norwegian', 'formidable' ),
3049
+ 'nb' => __( 'Norwegian Bokmål', 'formidable' ),
3050
+ 'nn' => __( 'Norwegian Nynorsk', 'formidable' ),
3051
  'pl' => __( 'Polish', 'formidable' ),
3052
  'pt' => __( 'Portuguese', 'formidable' ),
3053
  'pt-BR' => __( 'Portuguese/Brazilian', 'formidable' ),
3054
  'pt-PT' => __( 'Portuguese/Portugal', 'formidable' ),
3055
+ 'rm' => __( 'Romansh', 'formidable' ),
3056
  'ro' => __( 'Romanian', 'formidable' ),
3057
  'ru' => __( 'Russian', 'formidable' ),
3058
  'sr' => __( 'Serbian', 'formidable' ),
3059
  'sr-SR' => __( 'Serbian', 'formidable' ),
3060
+ 'si' => __( 'Sinhalese', 'formidable' ),
3061
  'sk' => __( 'Slovak', 'formidable' ),
3062
  'sl' => __( 'Slovenian', 'formidable' ),
3063
  'es' => __( 'Spanish', 'formidable' ),
3064
  'es-419' => __( 'Spanish/Latin America', 'formidable' ),
3065
+ 'sw' => __( 'Swahili', 'formidable' ),
3066
  'sv' => __( 'Swedish', 'formidable' ),
3067
  'ta' => __( 'Tamil', 'formidable' ),
3068
+ 'te' => __( 'Telugu', 'formidable' ),
3069
  'th' => __( 'Thai', 'formidable' ),
3070
+ 'tj' => __( 'Tajiki', 'formidable' ),
3071
  'tr' => __( 'Turkish', 'formidable' ),
3072
  'uk' => __( 'Ukrainian', 'formidable' ),
3073
+ 'ur' => __( 'Urdu', 'formidable' ),
3074
  'vi' => __( 'Vietnamese', 'formidable' ),
3075
+ 'cy-GB' => __( 'Welsh', 'formidable' ),
3076
+ 'zu' => __( 'Zulu', 'formidable' ),
3077
  );
3078
 
3079
  if ( $type === 'captcha' ) {
3080
  // remove the languages unavailable for the captcha
3081
+ $unset = array( 'sq', 'bs', 'eo', 'fo', 'fr-CH', 'sr-SR', 'ar-DZ', 'be', 'cy-GB', 'kk', 'km', 'ky', 'lb', 'mk', 'nb', 'nn', 'rm', 'tj' );
3082
  } else {
3083
  // remove the languages unavailable for the datepicker
3084
+ $unset = array( 'fil', 'fr-CA', 'de-AT', 'de-CH', 'iw', 'hi', 'pt', 'pt-PT', 'es-419', 'mr', 'lo', 'kn', 'si', 'gu', 'bn', 'zu', 'ur', 'te', 'sw', 'am' );
3085
  }
3086
 
3087
  $locales = array_diff_key( $locales, array_flip( $unset ) );
3088
+
3089
+ /**
3090
+ * Filter available locale options.
3091
+ *
3092
+ * @since x.x Added $args parameter with type.
3093
+ *
3094
+ * @param array<string,string> $locales
3095
+ * @param array $args {
3096
+ * @type string $type
3097
+ * }
3098
+ */
3099
+ $locales = apply_filters( 'frm_locales', $locales, compact( 'type' ) );
3100
 
3101
  return $locales;
3102
  }
classes/helpers/FrmXMLHelper.php CHANGED
@@ -799,6 +799,8 @@ class FrmXMLHelper {
799
  } else {
800
  if ( $post['post_type'] === 'frm_display' ) {
801
  $post['post_content'] = self::maybe_prepare_json_view_content( $post['post_content'] );
 
 
802
  }
803
  // Create/update post now
804
  $post_id = wp_insert_post( $post );
799
  } else {
800
  if ( $post['post_type'] === 'frm_display' ) {
801
  $post['post_content'] = self::maybe_prepare_json_view_content( $post['post_content'] );
802
+ } elseif ( 'page' === $post['post_type'] && isset( $imported['posts'][ $post['post_parent'] ] ) ) {
803
+ $post['post_parent'] = $imported['posts'][ $post['post_parent'] ];
804
  }
805
  // Create/update post now
806
  $post_id = wp_insert_post( $post );
classes/models/FrmEntry.php CHANGED
@@ -261,7 +261,7 @@ class FrmEntry {
261
  global $wpdb;
262
  $id = (int) $id;
263
 
264
- $entry = self::getOne( $id );
265
  if ( ! $entry ) {
266
  $result = false;
267
  return $result;
261
  global $wpdb;
262
  $id = (int) $id;
263
 
264
+ $entry = self::getOne( $id, true ); // Item meta is required for conditional logic in actions with 'delete' events.
265
  if ( ! $entry ) {
266
  $result = false;
267
  return $result;
classes/models/FrmPluginSearch.php CHANGED
@@ -83,6 +83,10 @@ class FrmPluginSearch {
83
  'version' => $addon_list[ $matching_addon ]['version'],
84
  );
85
 
 
 
 
 
86
  // Splice in the base addon data.
87
  $inject = array_merge( $inject, $addon_list[ $matching_addon ], $overrides );
88
 
@@ -108,20 +112,15 @@ class FrmPluginSearch {
108
  continue;
109
  }
110
 
111
- /*
112
- * Does the site's current plan support the feature?
113
- */
114
- $is_supported_by_plan = ! empty( $addon_opts['url'] );
115
-
116
  if ( ! isset( $addon_opts['search_terms'] ) ) {
117
  $addon_opts['search_terms'] = '';
118
  }
119
 
120
- $addon_terms = $this->search_to_array( $addon_opts['search_terms'] . ', ' . $addon_opts['name'] );
121
 
122
  $matches = ! empty( array_intersect( $addon_terms, $normalized_term ) );
123
 
124
- if ( $matches && $is_supported_by_plan ) {
125
  $matching_addon = $addon_id;
126
  break;
127
  }
@@ -137,7 +136,8 @@ class FrmPluginSearch {
137
  */
138
  private function get_addons() {
139
  $api = new FrmFormApi();
140
- return $api->get_api_info();
 
141
  }
142
 
143
  /**
@@ -271,7 +271,7 @@ class FrmPluginSearch {
271
  */
272
  private function search_to_array( $terms ) {
273
  $terms = $this->sanitize_search_term( $terms );
274
- return array_filter( explode( ',', $terms ) );
275
  }
276
 
277
  /**
@@ -291,7 +291,6 @@ class FrmPluginSearch {
291
  $links = array();
292
  $is_installed = $this->is_installed( $plugin['plugin'] );
293
  $is_active = is_plugin_active( $plugin['plugin'] );
294
- $has_access = ! empty( $plugin['url'] );
295
 
296
  // Plugin installed, active, feature not enabled; prompt to enable.
297
  if ( ! $is_active && $is_installed ) {
83
  'version' => $addon_list[ $matching_addon ]['version'],
84
  );
85
 
86
+ if ( ! empty( $addon_list[ $matching_addon ]['external'] ) ) {
87
+ unset( $overrides['name'] );
88
+ }
89
+
90
  // Splice in the base addon data.
91
  $inject = array_merge( $inject, $addon_list[ $matching_addon ], $overrides );
92
 
112
  continue;
113
  }
114
 
 
 
 
 
 
115
  if ( ! isset( $addon_opts['search_terms'] ) ) {
116
  $addon_opts['search_terms'] = '';
117
  }
118
 
119
+ $addon_terms = $this->search_to_array( $addon_opts['search_terms'] . ' ' . $addon_opts['name'] );
120
 
121
  $matches = ! empty( array_intersect( $addon_terms, $normalized_term ) );
122
 
123
+ if ( $matches ) {
124
  $matching_addon = $addon_id;
125
  break;
126
  }
136
  */
137
  private function get_addons() {
138
  $api = new FrmFormApi();
139
+ $addons = $api->get_api_info();
140
+ return apply_filters( 'frm_plugin_search', $addons );
141
  }
142
 
143
  /**
271
  */
272
  private function search_to_array( $terms ) {
273
  $terms = $this->sanitize_search_term( $terms );
274
+ return array_filter( explode( ' ', $terms ) );
275
  }
276
 
277
  /**
291
  $links = array();
292
  $is_installed = $this->is_installed( $plugin['plugin'] );
293
  $is_active = is_plugin_active( $plugin['plugin'] );
 
294
 
295
  // Plugin installed, active, feature not enabled; prompt to enable.
296
  if ( ! $is_active && $is_installed ) {
css/frm_admin.css CHANGED
@@ -5817,7 +5817,8 @@ ul.start_divider {
5817
  cursor: not-allowed;
5818
  }
5819
 
5820
- .edit_field_type_summary .frm_clone_field {
 
5821
  display: none !important;
5822
  }
5823
 
5817
  cursor: not-allowed;
5818
  }
5819
 
5820
+ /* Hide the Duplicate summary option because we are missing the logic that also adds a new page */
5821
+ .edit_field_type_summary .frm_more_options_li:nth-child(2) {
5822
  display: none !important;
5823
  }
5824
 
formidable.php CHANGED
@@ -2,7 +2,7 @@
2
  /*
3
  Plugin Name: Formidable Forms
4
  Description: Quickly and easily create drag-and-drop forms
5
- Version: 5.4.4
6
  Plugin URI: https://formidableforms.com/
7
  Author URI: https://formidableforms.com/
8
  Author: Strategy11 Form Builder Team
2
  /*
3
  Plugin Name: Formidable Forms
4
  Description: Quickly and easily create drag-and-drop forms
5
+ Version: 5.4.5
6
  Plugin URI: https://formidableforms.com/
7
  Author URI: https://formidableforms.com/
8
  Author: Strategy11 Form Builder Team
js/admin/dom.js CHANGED
@@ -388,6 +388,96 @@
388
  }
389
  };
390
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
391
  function getModalHelper( modal, appendTo ) {
392
  return function( child, uniqueClassName ) {
393
  let element = modal.querySelector( '.' + uniqueClassName );
@@ -538,5 +628,5 @@
538
  element.appendChild( child );
539
  }
540
 
541
- window.frmDom = { tag, div, span, a, img, svg, setAttributes, modal, ajax, bootstrap, autocomplete, search, util };
542
  }() );
388
  }
389
  };
390
 
391
+ const wysiwyg = {
392
+ init( editor, { setupCallback } = {}) {
393
+ if ( isTinyMceActive() ) {
394
+ setTimeout( resetTinyMce, 0 );
395
+ } else {
396
+ initQuickTagsButtons();
397
+ }
398
+
399
+ setUpTinyMceVisualButtonListener();
400
+ setUpTinyMceHtmlButtonListener();
401
+
402
+ function initQuickTagsButtons() {
403
+ if ( 'function' !== typeof window.quicktags || typeof window.QTags.instances[ editor.id ] !== 'undefined' ) {
404
+ return;
405
+ }
406
+
407
+ const id = editor.id;
408
+ window.quicktags({
409
+ name: 'qt_' + id,
410
+ id: id,
411
+ canvas: editor,
412
+ settings: { id },
413
+ toolbar: document.getElementById( 'qt_' + id + '_toolbar' ),
414
+ theButtons: {}
415
+ });
416
+ }
417
+
418
+ function initRichText() {
419
+ const key = Object.keys( tinyMCEPreInit.mceInit )[0];
420
+ const orgSettings = tinyMCEPreInit.mceInit[ key ];
421
+
422
+ const settings = Object.assign(
423
+ {},
424
+ orgSettings,
425
+ {
426
+ selector: '#' + editor.id,
427
+ body_class: orgSettings.body_class.replace( key, editor.id )
428
+ }
429
+ );
430
+
431
+ if ( setupCallback ) {
432
+ settings.setup = setupCallback;
433
+ }
434
+
435
+ tinymce.init( settings );
436
+ }
437
+
438
+ function removeRichText() {
439
+ tinymce.EditorManager.execCommand( 'mceRemoveEditor', true, editor.id );
440
+ }
441
+
442
+ function resetTinyMce() {
443
+ removeRichText();
444
+ initRichText();
445
+ }
446
+
447
+ function isTinyMceActive() {
448
+ const id = editor.id;
449
+ const wrapper = document.getElementById( 'wp-' + id + '-wrap' );
450
+ return null !== wrapper && wrapper.classList.contains( 'tmce-active' );
451
+ }
452
+
453
+ function setUpTinyMceVisualButtonListener() {
454
+ jQuery( document ).on(
455
+ 'click', '#' + editor.id + '-html',
456
+ function() {
457
+ editor.style.visibility = 'visible';
458
+ initQuickTagsButtons( editor );
459
+ }
460
+ );
461
+ }
462
+
463
+ function setUpTinyMceHtmlButtonListener() {
464
+ jQuery( '#' + editor.id + '-tmce' ).on( 'click', handleTinyMceHtmlButtonClick );
465
+ }
466
+
467
+ function handleTinyMceHtmlButtonClick() {
468
+ if ( isTinyMceActive() ) {
469
+ resetTinyMce();
470
+ } else {
471
+ initRichText();
472
+ }
473
+
474
+ const wrap = document.getElementById( 'wp-' + editor.id + '-wrap' );
475
+ wrap.classList.add( 'tmce-active' );
476
+ wrap.classList.remove( 'html-active' );
477
+ }
478
+ }
479
+ };
480
+
481
  function getModalHelper( modal, appendTo ) {
482
  return function( child, uniqueClassName ) {
483
  let element = modal.querySelector( '.' + uniqueClassName );
628
  element.appendChild( child );
629
  }
630
 
631
+ window.frmDom = { tag, div, span, a, img, svg, setAttributes, modal, ajax, bootstrap, autocomplete, search, util, wysiwyg };
632
  }() );
js/formidable_admin.js CHANGED
@@ -605,30 +605,27 @@ function frmAdminBuildJS() {
605
 
606
  function removeThisTag() {
607
  /*jshint validthis:true */
608
- var show, hide, removeMore,
609
- id = '',
610
- deleteButton = jQuery( this ),
611
- continueRemove = confirmLinkClick( this );
612
 
613
- if ( parseInt( this.getAttribute( 'data-skip-frm-js' ) ) ) {
614
  return;
615
  }
616
 
617
- if ( continueRemove === false ) {
618
- return;
619
- } else {
620
- id = deleteButton.attr( 'data-removeid' );
621
- show = deleteButton.attr( 'data-showlast' );
622
- removeMore = deleteButton.attr( 'data-removemore' );
623
- if ( typeof show === 'undefined' ) {
624
- show = '';
625
- }
626
- hide = deleteButton.attr( 'data-hidelast' );
627
- if ( typeof hide === 'undefined' ) {
628
- hide = '';
629
- }
630
  }
631
 
 
 
632
  if ( show !== '' ) {
633
  if ( deleteButton.closest( '.frm_add_remove' ).find( '.frm_remove_tag:visible' ).length > 1 ) {
634
  show = '';
@@ -646,7 +643,7 @@ function frmAdminBuildJS() {
646
  }
647
  }
648
 
649
- var $fadeEle = jQuery( document.getElementById( id ) );
650
  $fadeEle.fadeOut( 400, function() {
651
  $fadeEle.remove();
652
  fieldUpdated();
@@ -659,10 +656,9 @@ function frmAdminBuildJS() {
659
  jQuery( show + ' a,' + show ).removeClass( 'frm_hidden' ).fadeIn( 'slow' );
660
  }
661
 
662
- var action = jQuery( this ).closest( '.frm_form_action_settings' );
663
- if ( typeof action !== 'undefined' ) {
664
- var type = jQuery( this ).closest( '.frm_form_action_settings' ).find( '.frm_action_name' ).val();
665
- checkActiveAction( type );
666
  }
667
  });
668
 
@@ -680,6 +676,14 @@ function frmAdminBuildJS() {
680
  return false;
681
  }
682
 
 
 
 
 
 
 
 
 
683
  function clickWidget( event, b ) {
684
  /*jshint validthis:true */
685
  var target = event.target;
@@ -1427,31 +1431,23 @@ function frmAdminBuildJS() {
1427
  * @param {object} opts
1428
  */
1429
  function insertNewFieldByDragging( selectedItem, fieldButton ) {
1430
- var fieldType, addBtn, sortableData, currentItem, insertAtIndex, section, formId, sectionId, loadingID, hasBreak, $placeholder;
1431
-
1432
- fieldType = fieldButton.attr( 'id' );
1433
-
1434
- // We'll optimistically disable the button now. We'll re-enable if AJAX fails
1435
- if ( 'summary' === fieldType ) {
1436
- addBtn = fieldButton.children( '.frm_add_field' );
1437
- disableSummaryBtnBeforeAJAX( addBtn, fieldButton );
1438
- }
1439
 
1440
- sortableData = jQuery( selectedItem ).data().uiSortable;
1441
- currentItem = sortableData.currentItem;
1442
- insertAtIndex = determineIndexBasedOffOfMousePositionInRow( currentItem.parent(), currentItem.offset().left );
1443
  jQuery( getFieldsInRow( currentItem.parent() ).get( insertAtIndex ) ).before( currentItem );
1444
- section = getSectionForFieldPlacement( currentItem );
1445
- formId = getFormIdForFieldPlacement( section );
1446
- sectionId = getSectionIdForFieldPlacement( section );
1447
 
1448
- loadingID = fieldType.replace( '|', '-' ) + '_' + getAutoId();
1449
- $placeholder = jQuery( '<li class="frm-wait frmbutton_loadingnow" id="' + loadingID + '" ></li>' );
1450
  currentItem.replaceWith( $placeholder );
1451
 
1452
  syncLayoutClasses( $placeholder );
1453
 
1454
- hasBreak = 0;
1455
  if ( 'summary' === fieldType ) {
1456
  // see if we need to insert a page break before this newly-added summary field. Check for at least 1 page break
1457
  hasBreak = jQuery( '.frmbutton_loadingnow#' + loadingID ).prevAll( 'li[data-type="break"]' ).length ? 1 : 0;
@@ -1468,9 +1464,9 @@ function frmAdminBuildJS() {
1468
  has_break: hasBreak
1469
  },
1470
  success: function( msg ) {
1471
- var $siblings, replaceWith;
1472
  document.getElementById( 'frm_form_editor_container' ).classList.add( 'frm-has-fields' );
1473
- $siblings = $placeholder.siblings( 'li.form-field' ).not( '.edit_field_type_end_divider' );
1474
  if ( ! $siblings.length ) {
1475
  // if dragging into a new row, we need to wrap the li first.
1476
  replaceWith = wrapFieldLi( msg );
@@ -1485,12 +1481,24 @@ function frmAdminBuildJS() {
1485
  }
1486
  toggleSectionHolder();
1487
  },
1488
- error: function( jqXHR, textStatus, errorThrown ) {
1489
- maybeReenableSummaryBtnAfterAJAX( fieldType, addBtn, fieldButton, errorThrown );
1490
- }
1491
  });
1492
  }
1493
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1494
  /**
1495
  * Get a unique id that automatically increments with every function call.
1496
  * Can be used for any UI that requires a unique id.
@@ -1674,25 +1682,21 @@ function frmAdminBuildJS() {
1674
 
1675
  function addFieldClick() {
1676
  /*jshint validthis:true */
1677
- var $thisObj = jQuery( this );
1678
  // there is no real way to disable a <a> (with a valid href attribute) in HTML - https://css-tricks.com/how-to-disable-links/
1679
  if ( $thisObj.hasClass( 'disabled' ) ) {
1680
  return false;
1681
  }
1682
 
1683
- var $button = $thisObj.closest( '.frmbutton' );
1684
- var fieldType = $button.attr( 'id' );
1685
 
1686
- var hasBreak = 0;
1687
  if ( 'summary' === fieldType ) {
1688
- // We'll optimistically disable $button now. We'll re-enable if AJAX fails
1689
- disableSummaryBtnBeforeAJAX( $thisObj, $button );
1690
-
1691
  hasBreak = $newFields.children( 'li[data-type="break"]' ).length > 0 ? 1 : 0;
1692
  }
1693
 
1694
- var formId = thisFormId;
1695
-
1696
  jQuery.ajax({
1697
  type: 'POST',
1698
  url: ajaxurl,
@@ -1709,52 +1713,11 @@ function frmAdminBuildJS() {
1709
  $newFields.append( wrapFieldLi( msg ) );
1710
  afterAddField( msg, true );
1711
  },
1712
- error: function( jqXHR, textStatus, errorThrown ) {
1713
- maybeReenableSummaryBtnAfterAJAX( fieldType, $thisObj, $button, errorThrown );
1714
- }
1715
  });
1716
  return false;
1717
  }
1718
 
1719
- function disableSummaryBtnBeforeAJAX( addBtn, fieldButton ) {
1720
- addBtn.addClass( 'disabled' );
1721
- fieldButton.draggable( 'disable' );
1722
- }
1723
-
1724
- function reenableAddSummaryBtn() {
1725
- var frmBtn = jQuery( 'li#summary' );
1726
- var addFieldLink = frmBtn.children( '.frm_add_field' );
1727
- frmBtn.draggable( 'enable' );
1728
- addFieldLink.removeClass( 'disabled' );
1729
- }
1730
-
1731
- function maybeDisableAddSummaryBtn() {
1732
- var summary = document.getElementById( 'summary' );
1733
- if ( summary && ! summary.classList.contains( 'frm_show_upgrade' ) && formHasSummaryField() ) {
1734
- disableAddSummaryBtn();
1735
- }
1736
- }
1737
-
1738
- function disableAddSummaryBtn() {
1739
- var frmBtn = jQuery( 'li#summary' );
1740
- var addFieldLink = frmBtn.children( '.frm_add_field' );
1741
- frmBtn.draggable( 'disable' );
1742
- addFieldLink.addClass( 'disabled' );
1743
- }
1744
-
1745
- function maybeReenableSummaryBtnAfterAJAX( fieldType, addBtn, fieldButton, errorThrown ) {
1746
- infoModal( errorThrown + '. Please try again.' );
1747
- if ( 'summary' === fieldType ) {
1748
- addBtn.removeClass( 'disabled' );
1749
- fieldButton.draggable( 'enable' );
1750
- }
1751
- }
1752
-
1753
- function formHasSummaryField() {
1754
- // .edit_field_type_summary is a better selector here in order to also cover fields loaded by AJAX
1755
- return $newFields.children( 'li.edit_field_type_summary' ).length > 0;
1756
- }
1757
-
1758
  function maybeHideQuantityProductFieldOption() {
1759
  var hide = true,
1760
  opts = document.querySelectorAll( '.frmjs_prod_field_opt_cont' );
@@ -3055,16 +3018,13 @@ function frmAdminBuildJS() {
3055
  }
3056
 
3057
  function addImageToOption( event ) {
3058
- var fileFrame,
3059
- $this = jQuery( this ),
3060
- $imagePreview = $this.closest( '.frm_image_preview_wrapper' ),
3061
- postID = 0;
3062
 
3063
  event.preventDefault();
3064
 
3065
- wp.media.model.settings.post.id = postID;
3066
 
3067
- fileFrame = wp.media.frames.file_frame = wp.media({
3068
  multiple: false,
3069
  library: {
3070
  type: [ 'image' ]
@@ -3073,13 +3033,20 @@ function frmAdminBuildJS() {
3073
 
3074
  fileFrame.on( 'select', function() {
3075
  const attachment = fileFrame.state().get( 'selection' ).first().toJSON();
3076
- $imagePreview.find( 'img' ).attr( 'src', attachment.url ).removeClass( 'frm_hidden' );
3077
- $imagePreview.find( '.frm_image_preview_frame' ).show();
3078
- $imagePreview.find( '.frm_image_preview_title' ).text( attachment.filename );
 
 
 
 
 
 
 
 
3079
  $imagePreview.siblings( 'input[name*="[label]"]' ).data( 'frmimgurl', attachment.url );
3080
- $imagePreview.find( '.frm_choose_image_box' ).hide();
3081
  $imagePreview.find( 'input.frm_image_id' ).val( attachment.id ).trigger( 'change' );
3082
- wp.media.model.settings.post.id = postID;
3083
  });
3084
 
3085
  fileFrame.open();
@@ -4186,9 +4153,6 @@ function frmAdminBuildJS() {
4186
  if ( type === 'break' ) {
4187
  renumberPageBreaks();
4188
  }
4189
- if ( type === 'summary' ) {
4190
- reenableAddSummaryBtn();
4191
- }
4192
  if ( type === 'product' ) {
4193
  maybeHideQuantityProductFieldOption();
4194
  // a product field attached to a quantity field earlier might be the one deleted, so re-populate
@@ -6005,39 +5969,70 @@ function frmAdminBuildJS() {
6005
  }
6006
  }
6007
 
6008
- function copyFormAction() {
6009
- /*jshint validthis:true */
6010
- if ( waitForActionToLoadBeforeCopy( this ) ) {
6011
  return;
6012
  }
6013
 
6014
- var action = jQuery( this ).closest( '.frm_form_action_settings' ).clone();
6015
- var currentID = action.attr( 'id' ).replace( 'frm_form_action_', '' );
6016
- var newID = newActionId( currentID );
6017
- action.find( '.frm_action_id, .frm-btn-group' ).remove();
6018
- action.find( 'input[name$="[' + currentID + '][ID]"]' ).val( '' );
6019
- action.find( '.widget-inside' ).hide();
 
 
 
 
 
 
 
 
6020
 
6021
  // the .html() gets original values, so they need to be set
6022
- action.find( 'input[type=text], textarea, input[type=number]' ).prop( 'defaultValue', function() {
6023
  return this.value;
6024
  });
6025
 
6026
- action.find( 'input[type=checkbox], input[type=radio]' ).prop( 'defaultChecked', function() {
6027
  return this.checked;
6028
  });
6029
 
6030
- var rename = new RegExp( '\\[' + currentID + '\\]', 'g' );
6031
- var reid = new RegExp( '_' + currentID + '"', 'g' );
6032
- var reclass = new RegExp( '-' + currentID + '"', 'g' );
6033
- var revalue = new RegExp( '"' + currentID + '"', 'g' ); // if a field id matches, this could cause trouble
6034
 
6035
- var html = action.html().replace( rename, '[' + newID + ']' ).replace( reid, '_' + newID + '"' );
6036
  html = html.replace( reclass, '-' + newID + '"' ).replace( revalue, '"' + newID + '"' );
6037
- var div = '<div id="frm_form_action_' + newID + '" class="widget frm_form_action_settings frm_single_email_settings" data-actionkey="' + newID + '">';
6038
 
6039
- jQuery( '#frm_notification_settings' ).append( div + html + '</div>' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6040
  initiateMultiselect();
 
 
 
6041
  }
6042
 
6043
  function waitForActionToLoadBeforeCopy( element ) {
@@ -6072,21 +6067,19 @@ function frmAdminBuildJS() {
6072
 
6073
  function addFormAction() {
6074
  /*jshint validthis:true */
6075
- var type, actionId, formId, placeholderSetting, actionsList;
6076
-
6077
- type = jQuery( this ).data( 'actiontype' );
6078
 
6079
  if ( isAtLimitForActionType( type ) ) {
6080
  return;
6081
  }
6082
 
6083
- actionId = getNewActionId();
6084
- formId = thisFormId;
6085
 
6086
- placeholderSetting = document.createElement( 'div' );
6087
  placeholderSetting.classList.add( 'frm_single_' + type + '_settings' );
6088
 
6089
- actionsList = document.getElementById( 'frm_notification_settings' );
6090
  actionsList.appendChild( placeholderSetting );
6091
 
6092
  jQuery.ajax({
@@ -6099,31 +6092,48 @@ function frmAdminBuildJS() {
6099
  form_id: formId,
6100
  nonce: frmGlobal.nonce
6101
  },
6102
- success: function( html ) {
6103
- fieldUpdated();
6104
- placeholderSetting.remove();
6105
 
6106
- // Close any open actions first.
6107
- jQuery( '.frm_form_action_settings.open' ).removeClass( 'open' );
 
6108
 
6109
- jQuery( actionsList ).append( html );
6110
- jQuery( '.frm_form_action_settings' ).fadeIn( 'slow' );
6111
 
6112
- var newAction = document.getElementById( 'frm_form_action_' + actionId );
 
6113
 
6114
- newAction.classList.add( 'open' );
6115
- document.getElementById( 'post-body-content' ).scroll({
6116
- top: newAction.offsetTop + 10,
6117
- left: 0,
6118
- behavior: 'smooth'
6119
- });
6120
 
6121
- //check if icon should be active
6122
- checkActiveAction( type );
6123
- initiateMultiselect();
6124
- showInputIcon( '#frm_form_action_' + actionId );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6125
  }
6126
- });
 
 
 
 
 
 
6127
  }
6128
 
6129
  function toggleActionGroups() {
@@ -6195,129 +6205,15 @@ function frmAdminBuildJS() {
6195
  singleField.classList.remove( 'frm_hidden' );
6196
  document.getElementById( 'frm-options-panel-tab' ).click();
6197
 
6198
- setUpTinyMceVisualButtonListener( singleField );
6199
- setUpTinyMceHtmlButtonListener( singleField );
6200
-
6201
- if ( isTinyMceActive() ) {
6202
- setTimeout( resetTinyMce, 0 );
6203
- } else {
6204
- initQuickTagsButtons( singleField );
6205
- }
6206
- }
6207
-
6208
- function setUpTinyMceVisualButtonListener( fieldSettings ) {
6209
- var editor = fieldSettings.querySelector( '.wp-editor-area' );
6210
  if ( editor ) {
6211
- jQuery( document ).on(
6212
- 'click', '#' + editor.id + '-html',
6213
- function() {
6214
- editor.style.visibility = 'visible';
6215
- initQuickTagsButtons( fieldSettings );
6216
- }
6217
  );
6218
  }
6219
  }
6220
 
6221
- function setUpTinyMceHtmlButtonListener( fieldSettings ) {
6222
- var editor, hasResetTinyMce;
6223
-
6224
- editor = fieldSettings.querySelector( '.wp-editor-area' );
6225
- if ( ! editor ) {
6226
- return;
6227
- }
6228
-
6229
- hasResetTinyMce = false;
6230
-
6231
- jQuery( '#' + editor.id + '-tmce' )
6232
- .on(
6233
- 'click',
6234
- function() {
6235
- var wrap;
6236
-
6237
- if ( ! hasResetTinyMce ) {
6238
- resetTinyMce();
6239
- hasResetTinyMce = true;
6240
- }
6241
-
6242
- wrap = document.getElementById( 'wp-' + editor.id + '-wrap' );
6243
- wrap.classList.add( 'tmce-active' );
6244
- wrap.classList.remove( 'html-active' );
6245
- }
6246
- );
6247
- }
6248
-
6249
- function initQuickTagsButtons( fieldSettings ) {
6250
- var editor, settings;
6251
-
6252
- editor = fieldSettings.querySelector( '.wp-editor-area' );
6253
-
6254
- if ( ! editor || 'function' !== typeof window.quicktags || typeof window.QTags.instances[ editor.id ] !== 'undefined' ) {
6255
- return;
6256
- }
6257
-
6258
- settings = {
6259
- name: 'qt_' + editor.id,
6260
- id: editor.id,
6261
- canvas: editor,
6262
- settings: {
6263
- buttons: 'strong,em,link,block,del,ins,img,ul,ol,li,code,more,close',
6264
- id: editor.id
6265
- },
6266
- toolbar: document.getElementById( 'qt_' + editor.id + '_toolbar' ),
6267
- theButtons: {}
6268
- };
6269
- window.quicktags( settings );
6270
- }
6271
-
6272
- function resetTinyMce() {
6273
- document.querySelectorAll( '.frm-single-settings:not(.frm_hidden) .wp-editor-area' ).forEach(
6274
- function( editor ) {
6275
- var isInitialized, isVisible;
6276
-
6277
- isInitialized = 'undefined' !== typeof tinyMCE.editors[ editor.id ];
6278
- isVisible = isInitialized && ! tinyMCE.editors[ editor.id ].isHidden();
6279
-
6280
- if ( isVisible ) {
6281
- removeRichText( editor.id );
6282
- }
6283
-
6284
- if ( isVisible || ! isInitialized ) {
6285
- initRichText( editor.id );
6286
- }
6287
- }
6288
- );
6289
- }
6290
-
6291
- function removeRichText( id ) {
6292
- tinymce.EditorManager.execCommand( 'mceRemoveEditor', true, id );
6293
- tinymce.remove( id );
6294
- }
6295
-
6296
- function initRichText( id ) {
6297
- var defaultSettings = getDefaultTinyMceSettings(),
6298
- newValues = {
6299
- selector: '#' + id,
6300
- body_class: defaultSettings.body_class.replace( getDefaultSettingsKey(), id ),
6301
- setup: setupTinyMceEventHandlers
6302
- },
6303
- newSettings = Object.assign(
6304
- {}, defaultSettings, newValues
6305
- );
6306
- if ( 'undefined' !== typeof newSettings.toolbar1 ) {
6307
- // the link option does not work in the modal, so exclude it.
6308
- newSettings.toolbar1 = newSettings.toolbar1.replace( ',wp_more', '' );
6309
- }
6310
- tinymce.init( newSettings );
6311
- }
6312
-
6313
- function getDefaultSettingsKey() {
6314
- return Object.keys( tinyMCEPreInit.mceInit )[0];
6315
- }
6316
-
6317
- function getDefaultTinyMceSettings() {
6318
- return tinyMCEPreInit.mceInit[ getDefaultSettingsKey() ];
6319
- }
6320
-
6321
  function setupTinyMceEventHandlers( editor ) {
6322
  editor.on( 'Change', function() {
6323
  handleTinyMceChange( editor );
@@ -6325,10 +6221,12 @@ function frmAdminBuildJS() {
6325
  }
6326
 
6327
  function handleTinyMceChange( editor ) {
6328
- if ( isTinyMceActive() && ! tinyMCE.activeEditor.isHidden() ) {
6329
- editor.targetElm.value = editor.getContent();
6330
- jQuery( editor.targetElm ).trigger( 'change' );
6331
  }
 
 
 
6332
  }
6333
 
6334
  function isTinyMceActive() {
@@ -6397,23 +6295,46 @@ function frmAdminBuildJS() {
6397
  }
6398
 
6399
  function checkActiveAction( type ) {
6400
- var $actionTriggers, limitClass;
6401
-
6402
- $actionTriggers = jQuery( '.frm_' + type + '_action' );
6403
 
6404
  if ( isAtLimitForActionType( type ) ) {
6405
- limitClass = 'frm_inactive_action';
6406
- if ( getLimitForActionType( type ) > 0 ) {
6407
- limitClass += ' frm_already_used';
6408
- }
6409
- $actionTriggers.removeClass( 'frm_active_action' ).addClass( limitClass );
6410
- } else {
6411
- $actionTriggers.removeClass( 'frm_inactive_action frm_already_used' ).addClass( 'frm_active_action' );
6412
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6413
  }
6414
 
6415
  function isAtLimitForActionType( type ) {
6416
- return getNumberOfActionsForType( type ) >= getLimitForActionType( type );
 
 
 
 
 
 
6417
  }
6418
 
6419
  function getLimitForActionType( type ) {
@@ -8025,9 +7946,6 @@ function frmAdminBuildJS() {
8025
  });
8026
  }
8027
 
8028
- /**
8029
- * TODO stop addressing oneclick stuff by ID as this may happen in a tab as well.
8030
- */
8031
  function afterAddonInstall( response, button, message, el, saveAndReload ) {
8032
  const addonStatuses = document.querySelectorAll( '.frm-addon-status' );
8033
  addonStatuses.forEach(
@@ -9540,16 +9458,17 @@ function frmAdminBuildJS() {
9540
 
9541
  initBulkOptionsOverlay();
9542
  hideEmptyEle();
9543
- maybeDisableAddSummaryBtn();
9544
  maybeHideQuantityProductFieldOption();
9545
  handleNameFieldOnFormBuilder();
9546
  toggleSectionHolder();
9547
  },
9548
 
9549
  settingsInit: function() {
9550
- var formSettings, $loggedIn, $cookieExp, $editable,
9551
- $formActions = jQuery( document.getElementById( 'frm_notification_settings' ) );
9552
- //BCC, CC, and Reply To button functionality
 
 
9553
  $formActions.on( 'click', '.frm_email_buttons', showEmailRow );
9554
  $formActions.on( 'click', '.frm_remove_field', hideEmailRow );
9555
  $formActions.on( 'change', '.frm_to_row, .frm_from_row', showEmailWarning );
@@ -9572,7 +9491,7 @@ function frmAdminBuildJS() {
9572
  checkActiveAction( jQuery( this ).children( 'a' ).data( 'actiontype' ) );
9573
 
9574
  // If the icon is a background image, don't add BG color.
9575
- var icon = jQuery( this ).find( 'i' );
9576
  if ( icon.css( 'background-image' ) !== 'none' ) {
9577
  icon.addClass( 'frm-inverse' );
9578
  }
@@ -9589,23 +9508,45 @@ function frmAdminBuildJS() {
9589
  formSettings.on( 'click', '.frm_add_submit_logic', addSubmitLogic );
9590
  formSettings.on( 'change', '.frm_submit_logic_field_opts', addSubmitLogicOpts );
9591
 
9592
- jQuery( '.frm_image_preview_wrapper' ).on( 'click', '.frm_choose_image_box', addImageToOption );
9593
- jQuery( '.frm_image_preview_wrapper' ).on( 'click', '.frm_remove_image_option', removeImageFromOption );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9594
 
9595
  // Close shortcode modal on click.
9596
  formSettings.on( 'mouseup', '*:not(.frm-show-box)', function( e ) {
9597
  e.stopPropagation();
 
9598
  if ( e.target.classList.contains( 'frm-show-box' ) ) {
9599
  return;
9600
  }
9601
- var sidebar = document.getElementById( 'frm_adv_info' ),
9602
- isChild = jQuery( e.target ).closest( '#frm_adv_info' ).length > 0;
 
 
 
9603
 
9604
  if ( sidebar.getAttribute( 'data-fills' ) === e.target.id && typeof e.target.id !== 'undefined' ) {
9605
  return;
9606
  }
9607
 
9608
- if ( sidebar !== null && ! isChild && sidebar.display !== 'none' ) {
 
9609
  hideShortcodes( sidebar );
9610
  }
9611
  });
605
 
606
  function removeThisTag() {
607
  /*jshint validthis:true */
608
+ let show, hide, removeMore;
 
 
 
609
 
610
+ if ( parseInt( this.getAttribute( 'data-skip-frm-js' ) ) || confirmLinkClick( this ) === false ) {
611
  return;
612
  }
613
 
614
+ const deleteButton = jQuery( this );
615
+ const id = deleteButton.attr( 'data-removeid' );
616
+
617
+ show = deleteButton.attr( 'data-showlast' );
618
+ if ( typeof show === 'undefined' ) {
619
+ show = '';
620
+ }
621
+
622
+ hide = deleteButton.attr( 'data-hidelast' );
623
+ if ( typeof hide === 'undefined' ) {
624
+ hide = '';
 
 
625
  }
626
 
627
+ removeMore = deleteButton.attr( 'data-removemore' );
628
+
629
  if ( show !== '' ) {
630
  if ( deleteButton.closest( '.frm_add_remove' ).find( '.frm_remove_tag:visible' ).length > 1 ) {
631
  show = '';
643
  }
644
  }
645
 
646
+ const $fadeEle = jQuery( document.getElementById( id ) );
647
  $fadeEle.fadeOut( 400, function() {
648
  $fadeEle.remove();
649
  fieldUpdated();
656
  jQuery( show + ' a,' + show ).removeClass( 'frm_hidden' ).fadeIn( 'slow' );
657
  }
658
 
659
+ if ( this.closest( '.frm_form_action_settings' ) ) {
660
+ const type = this.closest( '.frm_form_action_settings' ).querySelector( '.frm_action_name' ).value;
661
+ afterActionRemoved( type );
 
662
  }
663
  });
664
 
676
  return false;
677
  }
678
 
679
+ function afterActionRemoved( type ) {
680
+ checkActiveAction( type );
681
+
682
+ const hookName = 'frm_after_action_removed';
683
+ const hookArgs = { type };
684
+ wp.hooks.doAction( hookName, hookArgs );
685
+ }
686
+
687
  function clickWidget( event, b ) {
688
  /*jshint validthis:true */
689
  var target = event.target;
1431
  * @param {object} opts
1432
  */
1433
  function insertNewFieldByDragging( selectedItem, fieldButton ) {
1434
+ const fieldType = fieldButton.attr( 'id' );
 
 
 
 
 
 
 
 
1435
 
1436
+ const sortableData = jQuery( selectedItem ).data().uiSortable;
1437
+ const currentItem = sortableData.currentItem;
1438
+ const insertAtIndex = determineIndexBasedOffOfMousePositionInRow( currentItem.parent(), currentItem.offset().left );
1439
  jQuery( getFieldsInRow( currentItem.parent() ).get( insertAtIndex ) ).before( currentItem );
1440
+ const section = getSectionForFieldPlacement( currentItem );
1441
+ const formId = getFormIdForFieldPlacement( section );
1442
+ const sectionId = getSectionIdForFieldPlacement( section );
1443
 
1444
+ const loadingID = fieldType.replace( '|', '-' ) + '_' + getAutoId();
1445
+ const $placeholder = jQuery( '<li class="frm-wait frmbutton_loadingnow" id="' + loadingID + '" ></li>' );
1446
  currentItem.replaceWith( $placeholder );
1447
 
1448
  syncLayoutClasses( $placeholder );
1449
 
1450
+ let hasBreak = 0;
1451
  if ( 'summary' === fieldType ) {
1452
  // see if we need to insert a page break before this newly-added summary field. Check for at least 1 page break
1453
  hasBreak = jQuery( '.frmbutton_loadingnow#' + loadingID ).prevAll( 'li[data-type="break"]' ).length ? 1 : 0;
1464
  has_break: hasBreak
1465
  },
1466
  success: function( msg ) {
1467
+ let replaceWith;
1468
  document.getElementById( 'frm_form_editor_container' ).classList.add( 'frm-has-fields' );
1469
+ const $siblings = $placeholder.siblings( 'li.form-field' ).not( '.edit_field_type_end_divider' );
1470
  if ( ! $siblings.length ) {
1471
  // if dragging into a new row, we need to wrap the li first.
1472
  replaceWith = wrapFieldLi( msg );
1481
  }
1482
  toggleSectionHolder();
1483
  },
1484
+ error: handleInsertFieldError
 
 
1485
  });
1486
  }
1487
 
1488
+ function handleInsertFieldError( jqXHR, _, errorThrown ) {
1489
+ maybeShowInsertFieldError( errorThrown, jqXHR );
1490
+ }
1491
+
1492
+ function maybeShowInsertFieldError( errorThrown, jqXHR ) {
1493
+ if ( ! jqXHRAborted( jqXHR ) ) {
1494
+ infoModal( errorThrown + '. Please try again.' );
1495
+ }
1496
+ }
1497
+
1498
+ function jqXHRAborted( jqXHR ) {
1499
+ return jqXHR.status === 0 || jqXHR.readyState === 0;
1500
+ }
1501
+
1502
  /**
1503
  * Get a unique id that automatically increments with every function call.
1504
  * Can be used for any UI that requires a unique id.
1682
 
1683
  function addFieldClick() {
1684
  /*jshint validthis:true */
1685
+ const $thisObj = jQuery( this );
1686
  // there is no real way to disable a <a> (with a valid href attribute) in HTML - https://css-tricks.com/how-to-disable-links/
1687
  if ( $thisObj.hasClass( 'disabled' ) ) {
1688
  return false;
1689
  }
1690
 
1691
+ const $button = $thisObj.closest( '.frmbutton' );
1692
+ const fieldType = $button.attr( 'id' );
1693
 
1694
+ let hasBreak = 0;
1695
  if ( 'summary' === fieldType ) {
 
 
 
1696
  hasBreak = $newFields.children( 'li[data-type="break"]' ).length > 0 ? 1 : 0;
1697
  }
1698
 
1699
+ const formId = thisFormId;
 
1700
  jQuery.ajax({
1701
  type: 'POST',
1702
  url: ajaxurl,
1713
  $newFields.append( wrapFieldLi( msg ) );
1714
  afterAddField( msg, true );
1715
  },
1716
+ error: handleInsertFieldError
 
 
1717
  });
1718
  return false;
1719
  }
1720
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1721
  function maybeHideQuantityProductFieldOption() {
1722
  var hide = true,
1723
  opts = document.querySelectorAll( '.frmjs_prod_field_opt_cont' );
3018
  }
3019
 
3020
  function addImageToOption( event ) {
3021
+ const imagePreview = event.target.closest( '.frm_image_preview_wrapper' );
 
 
 
3022
 
3023
  event.preventDefault();
3024
 
3025
+ wp.media.model.settings.post.id = 0;
3026
 
3027
+ const fileFrame = wp.media.frames.file_frame = wp.media({
3028
  multiple: false,
3029
  library: {
3030
  type: [ 'image' ]
3033
 
3034
  fileFrame.on( 'select', function() {
3035
  const attachment = fileFrame.state().get( 'selection' ).first().toJSON();
3036
+ const img = imagePreview.querySelector( 'img' );
3037
+
3038
+ img.setAttribute( 'src', attachment.url );
3039
+ img.classList.remove( 'frm_hidden' );
3040
+ img.removeAttribute( 'srcset' ); // Prevent the old image from sticking around.
3041
+
3042
+ imagePreview.querySelector( '.frm_image_preview_frame' ).style.display = 'block';
3043
+ imagePreview.querySelector( '.frm_image_preview_title' ).textContent = attachment.filename;
3044
+ imagePreview.querySelector( '.frm_choose_image_box' ).style.display = 'none';
3045
+
3046
+ const $imagePreview = jQuery( imagePreview );
3047
  $imagePreview.siblings( 'input[name*="[label]"]' ).data( 'frmimgurl', attachment.url );
 
3048
  $imagePreview.find( 'input.frm_image_id' ).val( attachment.id ).trigger( 'change' );
3049
+ wp.media.model.settings.post.id = 0;
3050
  });
3051
 
3052
  fileFrame.open();
4153
  if ( type === 'break' ) {
4154
  renumberPageBreaks();
4155
  }
 
 
 
4156
  if ( type === 'product' ) {
4157
  maybeHideQuantityProductFieldOption();
4158
  // a product field attached to a quantity field earlier might be the one deleted, so re-populate
5969
  }
5970
  }
5971
 
5972
+ function copyFormAction( event ) {
5973
+ if ( waitForActionToLoadBeforeCopy( event.target ) ) {
 
5974
  return;
5975
  }
5976
 
5977
+ const targetSettings = event.target.closest( '.frm_form_action_settings' );
5978
+ const wysiwyg = targetSettings.querySelector( '.wp-editor-area' );
5979
+ if ( wysiwyg ) {
5980
+ // Temporary remove TinyMCE before cloning to avoid TinyMCE conflicts.
5981
+ tinymce.EditorManager.execCommand( 'mceRemoveEditor', true, wysiwyg.id );
5982
+ }
5983
+
5984
+ const $action = jQuery( targetSettings ).clone();
5985
+ const currentID = $action.attr( 'id' ).replace( 'frm_form_action_', '' );
5986
+ const newID = newActionId( currentID );
5987
+
5988
+ $action.find( '.frm_action_id, .frm-btn-group' ).remove();
5989
+ $action.find( 'input[name$="[' + currentID + '][ID]"]' ).val( '' );
5990
+ $action.find( '.widget-inside' ).hide();
5991
 
5992
  // the .html() gets original values, so they need to be set
5993
+ $action.find( 'input[type=text], textarea, input[type=number]' ).prop( 'defaultValue', function() {
5994
  return this.value;
5995
  });
5996
 
5997
+ $action.find( 'input[type=checkbox], input[type=radio]' ).prop( 'defaultChecked', function() {
5998
  return this.checked;
5999
  });
6000
 
6001
+ const rename = new RegExp( '\\[' + currentID + '\\]', 'g' );
6002
+ const reid = new RegExp( '_' + currentID + '"', 'g' );
6003
+ const reclass = new RegExp( '-' + currentID + '"', 'g' );
6004
+ const revalue = new RegExp( '"' + currentID + '"', 'g' ); // if a field id matches, this could cause trouble
6005
 
6006
+ let html = $action.html().replace( rename, '[' + newID + ']' ).replace( reid, '_' + newID + '"' );
6007
  html = html.replace( reclass, '-' + newID + '"' ).replace( revalue, '"' + newID + '"' );
 
6008
 
6009
+ const newAction = div({
6010
+ id: 'frm_form_action_' + newID,
6011
+ className: $action.get( 0 ).className
6012
+ });
6013
+ newAction.setAttribute( 'data-actionkey', newID );
6014
+ newAction.innerHTML = html;
6015
+ newAction.querySelectorAll( '.wp-editor-wrap, .wp-editor-wrap *' ).forEach(
6016
+ element => {
6017
+ if ( 'string' === typeof element.className ) {
6018
+ element.className = element.className.replace( currentID, newID );
6019
+ }
6020
+ element.id = element.id.replace( currentID, newID );
6021
+ }
6022
+ );
6023
+ newAction.classList.remove( 'open' );
6024
+ document.getElementById( 'frm_notification_settings' ).appendChild( newAction );
6025
+
6026
+ if ( wysiwyg ) {
6027
+ // Re-initialize the original wysiwyg which was removed before cloning.
6028
+ frmDom.wysiwyg.init( wysiwyg );
6029
+ }
6030
+ frmDom.wysiwyg.init( newAction.querySelector( '.wp-editor-area' ) );
6031
+
6032
  initiateMultiselect();
6033
+
6034
+ const hookName = 'frm_after_duplicate_action';
6035
+ wp.hooks.doAction( hookName, newAction );
6036
  }
6037
 
6038
  function waitForActionToLoadBeforeCopy( element ) {
6067
 
6068
  function addFormAction() {
6069
  /*jshint validthis:true */
6070
+ const type = jQuery( this ).data( 'actiontype' );
 
 
6071
 
6072
  if ( isAtLimitForActionType( type ) ) {
6073
  return;
6074
  }
6075
 
6076
+ const actionId = getNewActionId();
6077
+ const formId = thisFormId;
6078
 
6079
+ const placeholderSetting = document.createElement( 'div' );
6080
  placeholderSetting.classList.add( 'frm_single_' + type + '_settings' );
6081
 
6082
+ const actionsList = document.getElementById( 'frm_notification_settings' );
6083
  actionsList.appendChild( placeholderSetting );
6084
 
6085
  jQuery.ajax({
6092
  form_id: formId,
6093
  nonce: frmGlobal.nonce
6094
  },
6095
+ success: handleAddFormActionSuccess
6096
+ });
 
6097
 
6098
+ function handleAddFormActionSuccess( html ) {
6099
+ fieldUpdated();
6100
+ placeholderSetting.remove();
6101
 
6102
+ closeOpenActions();
 
6103
 
6104
+ const newActionContainer = div();
6105
+ newActionContainer.innerHTML = html;
6106
 
6107
+ const widgetTop = newActionContainer.querySelector( '.widget-top' );
6108
+ Array.from( newActionContainer.children ).forEach( child => actionsList.appendChild( child ) );
 
 
 
 
6109
 
6110
+ jQuery( '.frm_form_action_settings' ).fadeIn( 'slow' );
6111
+
6112
+ const newAction = document.getElementById( 'frm_form_action_' + actionId );
6113
+
6114
+ newAction.classList.add( 'open' );
6115
+ document.getElementById( 'post-body-content' ).scroll({
6116
+ top: newAction.offsetTop + 10,
6117
+ left: 0,
6118
+ behavior: 'smooth'
6119
+ });
6120
+
6121
+ // Check if icon should be active
6122
+ checkActiveAction( type );
6123
+ showInputIcon( '#frm_form_action_' + actionId );
6124
+
6125
+ initiateMultiselect();
6126
+
6127
+ if ( widgetTop ) {
6128
+ jQuery( widgetTop ).trigger( 'frm-action-loaded' );
6129
  }
6130
+ }
6131
+ }
6132
+
6133
+ function closeOpenActions() {
6134
+ document.querySelectorAll( '.frm_form_action_settings.open' ).forEach(
6135
+ setting => setting.classList.remove( 'open' )
6136
+ );
6137
  }
6138
 
6139
  function toggleActionGroups() {
6205
  singleField.classList.remove( 'frm_hidden' );
6206
  document.getElementById( 'frm-options-panel-tab' ).click();
6207
 
6208
+ const editor = singleField.querySelector( '.wp-editor-area' );
 
 
 
 
 
 
 
 
 
 
 
6209
  if ( editor ) {
6210
+ frmDom.wysiwyg.init(
6211
+ editor,
6212
+ { setupCallback: setupTinyMceEventHandlers }
 
 
 
6213
  );
6214
  }
6215
  }
6216
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6217
  function setupTinyMceEventHandlers( editor ) {
6218
  editor.on( 'Change', function() {
6219
  handleTinyMceChange( editor );
6221
  }
6222
 
6223
  function handleTinyMceChange( editor ) {
6224
+ if ( ! isTinyMceActive() || tinyMCE.activeEditor.isHidden() ) {
6225
+ return;
 
6226
  }
6227
+
6228
+ editor.targetElm.value = editor.getContent();
6229
+ jQuery( editor.targetElm ).trigger( 'change' );
6230
  }
6231
 
6232
  function isTinyMceActive() {
6295
  }
6296
 
6297
  function checkActiveAction( type ) {
6298
+ const actionTriggers = document.querySelectorAll( '.frm_' + type + '_action' );
 
 
6299
 
6300
  if ( isAtLimitForActionType( type ) ) {
6301
+ const addAlreadyUsedClass = getLimitForActionType( type ) > 0;
6302
+ markActionTriggersInactive( actionTriggers, addAlreadyUsedClass );
6303
+ return;
 
 
 
 
6304
  }
6305
+
6306
+ markActionTriggersActive( actionTriggers );
6307
+ }
6308
+
6309
+ function markActionTriggersActive( triggers ) {
6310
+ triggers.forEach(
6311
+ trigger => {
6312
+ trigger.classList.remove( 'frm_inactive_action', 'frm_already_used' );
6313
+ trigger.classList.add( 'frm_active_action' );
6314
+ }
6315
+ );
6316
+ }
6317
+
6318
+ function markActionTriggersInactive( triggers, addAlreadyUsedClass ) {
6319
+ triggers.forEach(
6320
+ trigger => {
6321
+ trigger.classList.remove( 'frm_active_action' );
6322
+ trigger.classList.add( 'frm_inactive_action' );
6323
+ if ( addAlreadyUsedClass ) {
6324
+ trigger.classList.add( 'frm_already_used' );
6325
+ }
6326
+ }
6327
+ );
6328
  }
6329
 
6330
  function isAtLimitForActionType( type ) {
6331
+ let atLimit = getNumberOfActionsForType( type ) >= getLimitForActionType( type );
6332
+
6333
+ const hookName = 'frm_action_at_limit';
6334
+ const hookArgs = { type };
6335
+ atLimit = wp.hooks.applyFilters( hookName, atLimit, hookArgs );
6336
+
6337
+ return atLimit;
6338
  }
6339
 
6340
  function getLimitForActionType( type ) {
7946
  });
7947
  }
7948
 
 
 
 
7949
  function afterAddonInstall( response, button, message, el, saveAndReload ) {
7950
  const addonStatuses = document.querySelectorAll( '.frm-addon-status' );
7951
  addonStatuses.forEach(
9458
 
9459
  initBulkOptionsOverlay();
9460
  hideEmptyEle();
 
9461
  maybeHideQuantityProductFieldOption();
9462
  handleNameFieldOnFormBuilder();
9463
  toggleSectionHolder();
9464
  },
9465
 
9466
  settingsInit: function() {
9467
+ const $formActions = jQuery( document.getElementById( 'frm_notification_settings' ) );
9468
+
9469
+ let formSettings, $loggedIn, $cookieExp, $editable;
9470
+
9471
+ // BCC, CC, and Reply To button functionality
9472
  $formActions.on( 'click', '.frm_email_buttons', showEmailRow );
9473
  $formActions.on( 'click', '.frm_remove_field', hideEmailRow );
9474
  $formActions.on( 'change', '.frm_to_row, .frm_from_row', showEmailWarning );
9491
  checkActiveAction( jQuery( this ).children( 'a' ).data( 'actiontype' ) );
9492
 
9493
  // If the icon is a background image, don't add BG color.
9494
+ const icon = jQuery( this ).find( 'i' );
9495
  if ( icon.css( 'background-image' ) !== 'none' ) {
9496
  icon.addClass( 'frm-inverse' );
9497
  }
9508
  formSettings.on( 'click', '.frm_add_submit_logic', addSubmitLogic );
9509
  formSettings.on( 'change', '.frm_submit_logic_field_opts', addSubmitLogicOpts );
9510
 
9511
+ document.addEventListener(
9512
+ 'click',
9513
+ function handleImageUploadClickEvents( event ) {
9514
+ const { target } = event;
9515
+
9516
+ if ( ! target.closest( '.frm_image_preview_wrapper' ) ) {
9517
+ return;
9518
+ }
9519
+
9520
+ if ( target.closest( '.frm_choose_image_box' ) ) {
9521
+ addImageToOption.bind( target )( event );
9522
+ return;
9523
+ }
9524
+
9525
+ if ( target.closest( '.frm_remove_image_option' ) ) {
9526
+ removeImageFromOption.bind( target )( event );
9527
+ }
9528
+ }
9529
+ );
9530
 
9531
  // Close shortcode modal on click.
9532
  formSettings.on( 'mouseup', '*:not(.frm-show-box)', function( e ) {
9533
  e.stopPropagation();
9534
+
9535
  if ( e.target.classList.contains( 'frm-show-box' ) ) {
9536
  return;
9537
  }
9538
+
9539
+ const sidebar = document.getElementById( 'frm_adv_info' );
9540
+ if ( ! sidebar ) {
9541
+ return;
9542
+ }
9543
 
9544
  if ( sidebar.getAttribute( 'data-fills' ) === e.target.id && typeof e.target.id !== 'undefined' ) {
9545
  return;
9546
  }
9547
 
9548
+ const isChild = jQuery( e.target ).closest( '#frm_adv_info' ).length > 0;
9549
+ if ( ! isChild && sidebar.display !== 'none' ) {
9550
  hideShortcodes( sidebar );
9551
  }
9552
  });
languages/formidable.pot CHANGED
@@ -1,15 +1,15 @@
1
- # Copyright (C) 2022 Strategy11
2
  # This file is distributed under the same license as the Formidable Forms plugin.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: Formidable Forms 5.4.4\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/formidable\n"
7
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
8
  "Language-Team: LANGUAGE <LL@li.org>\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
- "POT-Creation-Date: 2022-08-17T18:16:35+00:00\n"
13
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
14
  "X-Generator: WP-CLI 2.6.0\n"
15
  "X-Domain: formidable\n"
@@ -128,7 +128,7 @@ msgid "Quickly and easily create drag-and-drop forms"
128
  msgstr ""
129
 
130
  #. Author of the plugin
131
- msgid "Strategy11"
132
  msgstr ""
133
 
134
  #: classes/controllers/FrmAddonsController.php:21
@@ -884,9 +884,9 @@ msgid "Activate WP Mail SMTP"
884
  msgstr ""
885
 
886
  #: classes/controllers/FrmSMTPController.php:322
887
- #: classes/models/FrmPluginSearch.php:307
888
  #: classes/views/addons/settings.php:31
889
- #: js/formidable_admin.js:5937
890
  msgid "Activate"
891
  msgstr ""
892
 
@@ -1234,7 +1234,7 @@ msgstr ""
1234
  #: classes/views/frm-forms/new-form-overlay.php:132
1235
  #: classes/views/shared/admin-header.php:56
1236
  #: classes/views/shared/confirm-overlay.php:19
1237
- #: js/formidable_admin.js:3701
1238
  msgid "Cancel"
1239
  msgstr ""
1240
 
@@ -1261,7 +1261,7 @@ msgstr ""
1261
 
1262
  #: classes/helpers/FrmAppHelper.php:2822
1263
  #: classes/helpers/FrmListHelper.php:412
1264
- #: js/formidable_admin.js:4093
1265
  msgid "Heads up"
1266
  msgstr ""
1267
 
@@ -1401,257 +1401,361 @@ msgstr ""
1401
  msgid "You are using an outdated browser that is not compatible with Formidable Forms. Please update to a more current browser (we recommend Chrome)."
1402
  msgstr ""
1403
 
1404
- #: classes/helpers/FrmAppHelper.php:2985
1405
  msgid "English"
1406
  msgstr ""
1407
 
1408
- #: classes/helpers/FrmAppHelper.php:2986
1409
  msgid "Afrikaans"
1410
  msgstr ""
1411
 
1412
- #: classes/helpers/FrmAppHelper.php:2987
1413
  msgid "Albanian"
1414
  msgstr ""
1415
 
1416
- #: classes/helpers/FrmAppHelper.php:2988
 
 
 
 
 
 
 
 
1417
  msgid "Arabic"
1418
  msgstr ""
1419
 
1420
- #: classes/helpers/FrmAppHelper.php:2989
1421
  msgid "Armenian"
1422
  msgstr ""
1423
 
1424
- #: classes/helpers/FrmAppHelper.php:2990
1425
  msgid "Azerbaijani"
1426
  msgstr ""
1427
 
1428
- #: classes/helpers/FrmAppHelper.php:2991
1429
  msgid "Basque"
1430
  msgstr ""
1431
 
1432
- #: classes/helpers/FrmAppHelper.php:2992
 
 
 
 
 
 
 
 
1433
  msgid "Bosnian"
1434
  msgstr ""
1435
 
1436
- #: classes/helpers/FrmAppHelper.php:2993
1437
  msgid "Bulgarian"
1438
  msgstr ""
1439
 
1440
- #: classes/helpers/FrmAppHelper.php:2994
1441
  msgid "Catalan"
1442
  msgstr ""
1443
 
1444
- #: classes/helpers/FrmAppHelper.php:2995
1445
  msgid "Chinese Hong Kong"
1446
  msgstr ""
1447
 
1448
- #: classes/helpers/FrmAppHelper.php:2996
1449
  msgid "Chinese Simplified"
1450
  msgstr ""
1451
 
1452
- #: classes/helpers/FrmAppHelper.php:2997
1453
  msgid "Chinese Traditional"
1454
  msgstr ""
1455
 
1456
- #: classes/helpers/FrmAppHelper.php:2998
1457
  msgid "Croatian"
1458
  msgstr ""
1459
 
1460
- #: classes/helpers/FrmAppHelper.php:2999
1461
  msgid "Czech"
1462
  msgstr ""
1463
 
1464
- #: classes/helpers/FrmAppHelper.php:3000
1465
  msgid "Danish"
1466
  msgstr ""
1467
 
1468
- #: classes/helpers/FrmAppHelper.php:3001
1469
  msgid "Dutch"
1470
  msgstr ""
1471
 
1472
- #: classes/helpers/FrmAppHelper.php:3002
1473
  msgid "English/UK"
1474
  msgstr ""
1475
 
1476
- #: classes/helpers/FrmAppHelper.php:3003
1477
  msgid "Esperanto"
1478
  msgstr ""
1479
 
1480
- #: classes/helpers/FrmAppHelper.php:3004
1481
  msgid "Estonian"
1482
  msgstr ""
1483
 
1484
- #: classes/helpers/FrmAppHelper.php:3005
1485
  msgid "Faroese"
1486
  msgstr ""
1487
 
1488
- #: classes/helpers/FrmAppHelper.php:3006
1489
  msgid "Farsi/Persian"
1490
  msgstr ""
1491
 
1492
- #: classes/helpers/FrmAppHelper.php:3007
1493
  msgid "Filipino"
1494
  msgstr ""
1495
 
1496
- #: classes/helpers/FrmAppHelper.php:3008
1497
  msgid "Finnish"
1498
  msgstr ""
1499
 
1500
- #: classes/helpers/FrmAppHelper.php:3009
1501
  msgid "French"
1502
  msgstr ""
1503
 
1504
- #: classes/helpers/FrmAppHelper.php:3010
1505
  msgid "French/Canadian"
1506
  msgstr ""
1507
 
1508
- #: classes/helpers/FrmAppHelper.php:3011
1509
  msgid "French/Swiss"
1510
  msgstr ""
1511
 
1512
- #: classes/helpers/FrmAppHelper.php:3012
 
 
 
 
 
 
 
 
1513
  msgid "German"
1514
  msgstr ""
1515
 
1516
- #: classes/helpers/FrmAppHelper.php:3013
1517
  msgid "German/Austria"
1518
  msgstr ""
1519
 
1520
- #: classes/helpers/FrmAppHelper.php:3014
1521
  msgid "German/Switzerland"
1522
  msgstr ""
1523
 
1524
- #: classes/helpers/FrmAppHelper.php:3015
1525
  msgid "Greek"
1526
  msgstr ""
1527
 
1528
- #: classes/helpers/FrmAppHelper.php:3016
1529
- #: classes/helpers/FrmAppHelper.php:3017
 
 
 
 
1530
  msgid "Hebrew"
1531
  msgstr ""
1532
 
1533
- #: classes/helpers/FrmAppHelper.php:3018
1534
  msgid "Hindi"
1535
  msgstr ""
1536
 
1537
- #: classes/helpers/FrmAppHelper.php:3019
1538
  msgid "Hungarian"
1539
  msgstr ""
1540
 
1541
- #: classes/helpers/FrmAppHelper.php:3020
1542
  msgid "Icelandic"
1543
  msgstr ""
1544
 
1545
- #: classes/helpers/FrmAppHelper.php:3021
1546
  msgid "Indonesian"
1547
  msgstr ""
1548
 
1549
- #: classes/helpers/FrmAppHelper.php:3022
1550
  msgid "Italian"
1551
  msgstr ""
1552
 
1553
- #: classes/helpers/FrmAppHelper.php:3023
1554
  msgid "Japanese"
1555
  msgstr ""
1556
 
1557
- #: classes/helpers/FrmAppHelper.php:3024
 
 
 
 
 
 
 
 
 
 
 
 
1558
  msgid "Korean"
1559
  msgstr ""
1560
 
1561
- #: classes/helpers/FrmAppHelper.php:3025
 
 
 
 
 
 
 
 
1562
  msgid "Latvian"
1563
  msgstr ""
1564
 
1565
- #: classes/helpers/FrmAppHelper.php:3026
1566
  msgid "Lithuanian"
1567
  msgstr ""
1568
 
1569
- #: classes/helpers/FrmAppHelper.php:3027
 
 
 
 
 
 
 
 
 
 
 
 
1570
  msgid "Malaysian"
1571
  msgstr ""
1572
 
1573
- #: classes/helpers/FrmAppHelper.php:3028
 
 
 
 
1574
  msgid "Norwegian"
1575
  msgstr ""
1576
 
1577
- #: classes/helpers/FrmAppHelper.php:3029
 
 
 
 
 
 
 
 
1578
  msgid "Polish"
1579
  msgstr ""
1580
 
1581
- #: classes/helpers/FrmAppHelper.php:3030
1582
  msgid "Portuguese"
1583
  msgstr ""
1584
 
1585
- #: classes/helpers/FrmAppHelper.php:3031
1586
  msgid "Portuguese/Brazilian"
1587
  msgstr ""
1588
 
1589
- #: classes/helpers/FrmAppHelper.php:3032
1590
  msgid "Portuguese/Portugal"
1591
  msgstr ""
1592
 
1593
- #: classes/helpers/FrmAppHelper.php:3033
 
 
 
 
1594
  msgid "Romanian"
1595
  msgstr ""
1596
 
1597
- #: classes/helpers/FrmAppHelper.php:3034
1598
  msgid "Russian"
1599
  msgstr ""
1600
 
1601
- #: classes/helpers/FrmAppHelper.php:3035
1602
- #: classes/helpers/FrmAppHelper.php:3036
1603
  msgid "Serbian"
1604
  msgstr ""
1605
 
1606
- #: classes/helpers/FrmAppHelper.php:3037
 
 
 
 
1607
  msgid "Slovak"
1608
  msgstr ""
1609
 
1610
- #: classes/helpers/FrmAppHelper.php:3038
1611
  msgid "Slovenian"
1612
  msgstr ""
1613
 
1614
- #: classes/helpers/FrmAppHelper.php:3039
1615
  msgid "Spanish"
1616
  msgstr ""
1617
 
1618
- #: classes/helpers/FrmAppHelper.php:3040
1619
  msgid "Spanish/Latin America"
1620
  msgstr ""
1621
 
1622
- #: classes/helpers/FrmAppHelper.php:3041
 
 
 
 
1623
  msgid "Swedish"
1624
  msgstr ""
1625
 
1626
- #: classes/helpers/FrmAppHelper.php:3042
1627
  msgid "Tamil"
1628
  msgstr ""
1629
 
1630
- #: classes/helpers/FrmAppHelper.php:3043
 
 
 
 
1631
  msgid "Thai"
1632
  msgstr ""
1633
 
1634
- #: classes/helpers/FrmAppHelper.php:3044
 
 
 
 
1635
  msgid "Turkish"
1636
  msgstr ""
1637
 
1638
- #: classes/helpers/FrmAppHelper.php:3045
1639
  msgid "Ukrainian"
1640
  msgstr ""
1641
 
1642
- #: classes/helpers/FrmAppHelper.php:3046
 
 
 
 
1643
  msgid "Vietnamese"
1644
  msgstr ""
1645
 
1646
- #: classes/helpers/FrmAppHelper.php:3368
 
 
 
 
 
 
 
 
1647
  msgid "Form Landing Pages"
1648
  msgstr ""
1649
 
1650
- #: classes/helpers/FrmAppHelper.php:3369
1651
  msgid "Easily manage a landing page for your form. Upgrade to get form landing pages."
1652
  msgstr ""
1653
 
1654
- #: classes/helpers/FrmAppHelper.php:3462
1655
  msgid "NEW"
1656
  msgstr ""
1657
 
@@ -1778,7 +1882,7 @@ msgstr ""
1778
  #: classes/helpers/FrmFormsHelper.php:1188
1779
  #: classes/helpers/FrmFormsListHelper.php:133
1780
  #: classes/views/frm-form-actions/form_action.php:25
1781
- #: js/formidable_admin.js:2070
1782
  msgid "Delete"
1783
  msgstr ""
1784
 
@@ -1790,7 +1894,7 @@ msgstr ""
1790
  #. translators: %s: The field name.
1791
  #: classes/helpers/FrmFieldsHelper.php:167
1792
  #: classes/helpers/FrmFieldsHelper.php:294
1793
- #: classes/helpers/FrmXMLHelper.php:1394
1794
  #: classes/models/fields/FrmFieldType.php:583
1795
  msgid "%s is invalid"
1796
  msgstr ""
@@ -3657,21 +3761,21 @@ msgstr ""
3657
  msgid "Your server is missing the simplexml_import_dom function"
3658
  msgstr ""
3659
 
3660
- #: classes/helpers/FrmXMLHelper.php:1207
3661
  #: classes/views/solutions/_import.php:51
3662
  msgid "Imported"
3663
  msgstr ""
3664
 
3665
- #: classes/helpers/FrmXMLHelper.php:1208
3666
  msgid "Updated"
3667
  msgstr ""
3668
 
3669
- #: classes/helpers/FrmXMLHelper.php:1233
3670
  msgid "Nothing was imported or updated"
3671
  msgstr ""
3672
 
3673
  #. translators: %1$s: Number of items
3674
- #: classes/helpers/FrmXMLHelper.php:1260
3675
  msgid "%1$s Form"
3676
  msgid_plural "%1$s Forms"
3677
  msgstr[0] ""
@@ -3679,7 +3783,7 @@ msgstr[1] ""
3679
 
3680
  #. translators: %1$s: Number of items
3681
  #. translators: %1$s - field type
3682
- #: classes/helpers/FrmXMLHelper.php:1262
3683
  #: classes/models/FrmFormMigrator.php:584
3684
  msgid "%1$s Field"
3685
  msgid_plural "%1$s Fields"
@@ -3687,56 +3791,56 @@ msgstr[0] ""
3687
  msgstr[1] ""
3688
 
3689
  #. translators: %1$s: Number of items
3690
- #: classes/helpers/FrmXMLHelper.php:1264
3691
  msgid "%1$s Entry"
3692
  msgid_plural "%1$s Entries"
3693
  msgstr[0] ""
3694
  msgstr[1] ""
3695
 
3696
  #. translators: %1$s: Number of items
3697
- #: classes/helpers/FrmXMLHelper.php:1266
3698
  msgid "%1$s View"
3699
  msgid_plural "%1$s Views"
3700
  msgstr[0] ""
3701
  msgstr[1] ""
3702
 
3703
  #. translators: %1$s: Number of items
3704
- #: classes/helpers/FrmXMLHelper.php:1268
3705
  msgid "%1$s Page/Post"
3706
  msgid_plural "%1$s Pages/Posts"
3707
  msgstr[0] ""
3708
  msgstr[1] ""
3709
 
3710
  #. translators: %1$s: Number of items
3711
- #: classes/helpers/FrmXMLHelper.php:1270
3712
  msgid "%1$s Style"
3713
  msgid_plural "%1$s Styles"
3714
  msgstr[0] ""
3715
  msgstr[1] ""
3716
 
3717
  #. translators: %1$s: Number of items
3718
- #: classes/helpers/FrmXMLHelper.php:1272
3719
  msgid "%1$s Term"
3720
  msgid_plural "%1$s Terms"
3721
  msgstr[0] ""
3722
  msgstr[1] ""
3723
 
3724
  #. translators: %1$s: Number of items
3725
- #: classes/helpers/FrmXMLHelper.php:1274
3726
  msgid "%1$s Form Action"
3727
  msgid_plural "%1$s Form Actions"
3728
  msgstr[0] ""
3729
  msgstr[1] ""
3730
 
3731
- #: classes/helpers/FrmXMLHelper.php:1312
3732
  msgid "Go to imported form"
3733
  msgstr ""
3734
 
3735
- #: classes/helpers/FrmXMLHelper.php:1513
3736
  msgid "Create Posts"
3737
  msgstr ""
3738
 
3739
- #: classes/helpers/FrmXMLHelper.php:1642
3740
  msgid "Email Notification"
3741
  msgstr ""
3742
 
@@ -4171,19 +4275,19 @@ msgctxt "Formidable Addon Name"
4171
  msgid "Formidable %s"
4172
  msgstr ""
4173
 
4174
- #: classes/models/FrmPluginSearch.php:314
4175
  msgid "Install Now"
4176
  msgstr ""
4177
 
4178
- #: classes/models/FrmPluginSearch.php:323
4179
  msgid "Learn more"
4180
  msgstr ""
4181
 
4182
- #: classes/models/FrmPluginSearch.php:332
4183
  msgid "Hide this suggestion"
4184
  msgstr ""
4185
 
4186
- #: classes/models/FrmPluginSearch.php:356
4187
  msgid "This suggestion was made by Formidable Forms, the form builder and application plugin already installed on your site."
4188
  msgstr ""
4189
 
@@ -4519,7 +4623,7 @@ msgstr ""
4519
  #: classes/views/frm-fields/back-end/inline-modal.php:7
4520
  #: classes/views/frm-fields/back-end/inline-modal.php:8
4521
  #: classes/views/shared/admin-header.php:11
4522
- #: js/formidable_admin.js:8102
4523
  msgid "Close"
4524
  msgstr ""
4525
 
@@ -4812,7 +4916,7 @@ msgstr ""
4812
 
4813
  #: classes/views/frm-form-actions/form_action.php:21
4814
  #: classes/views/styles/_upsell-multiple-styles.php:15
4815
- #: js/formidable_admin.js:2076
4816
  msgid "Duplicate"
4817
  msgstr ""
4818
 
@@ -4941,9 +5045,9 @@ msgid "Move Field"
4941
  msgstr ""
4942
 
4943
  #: classes/views/frm-forms/add_field.php:29
4944
- #: js/formidable_admin.js:1246
4945
- #: js/formidable_admin.js:1249
4946
- #: js/formidable_admin.js:2014
4947
  msgid "More Options"
4948
  msgstr ""
4949
 
@@ -6480,71 +6584,71 @@ msgstr ""
6480
  msgid "Successfully copied embed example"
6481
  msgstr ""
6482
 
6483
- #: js/formidable_admin.js:1207
6484
  msgid "Set Row Layout"
6485
  msgstr ""
6486
 
6487
- #: js/formidable_admin.js:1214
6488
  msgid "Move Field Group"
6489
  msgstr ""
6490
 
6491
- #: js/formidable_admin.js:2042
6492
  msgid "Field settings"
6493
  msgstr ""
6494
 
6495
- #: js/formidable_admin.js:2070
6496
  msgid "Delete Group"
6497
  msgstr ""
6498
 
6499
- #: js/formidable_admin.js:2076
6500
  msgid "Duplicate Group"
6501
  msgstr ""
6502
 
6503
- #: js/formidable_admin.js:3408
6504
  msgid "Custom layout"
6505
  msgstr ""
6506
 
6507
- #: js/formidable_admin.js:3431
6508
  msgid "Break into rows"
6509
  msgstr ""
6510
 
6511
- #: js/formidable_admin.js:3441
6512
  msgid "Row Layout"
6513
  msgstr ""
6514
 
6515
- #: js/formidable_admin.js:3686
6516
  msgid "Enter number of columns for each field"
6517
  msgstr ""
6518
 
6519
- #: js/formidable_admin.js:3690
6520
  msgid "Layouts are based on a 12-column grid system"
6521
  msgstr ""
6522
 
6523
- #: js/formidable_admin.js:3706
6524
  msgid "Save"
6525
  msgstr ""
6526
 
6527
- #: js/formidable_admin.js:4007
6528
  msgid "Merge into row"
6529
  msgstr ""
6530
 
6531
  #. translators: %1$s: Number of fields that are selected to be deleted.
6532
- #: js/formidable_admin.js:4095
6533
  msgid "Are you sure you want to delete these %1$s selected fields?"
6534
  msgstr ""
6535
 
6536
- #: js/formidable_admin.js:5222
6537
  msgid "Duplicate option value \"%s\" detected"
6538
  msgstr ""
6539
 
6540
- #: js/formidable_admin.js:7366
6541
  msgid "Ready Made Solution"
6542
  msgstr ""
6543
 
6544
- #: js/formidable_admin.js:7369
6545
  msgid "Check all applications"
6546
  msgstr ""
6547
 
6548
- #: js/formidable_admin.js:8087
6549
  msgid "Save and Reload"
6550
  msgstr ""
1
+ # Copyright (C) 2022 Strategy11 Form Builder Team
2
  # This file is distributed under the same license as the Formidable Forms plugin.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: Formidable Forms 5.4.5\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/formidable\n"
7
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
8
  "Language-Team: LANGUAGE <LL@li.org>\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
+ "POT-Creation-Date: 2022-08-31T14:03:22+00:00\n"
13
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
14
  "X-Generator: WP-CLI 2.6.0\n"
15
  "X-Domain: formidable\n"
128
  msgstr ""
129
 
130
  #. Author of the plugin
131
+ msgid "Strategy11 Form Builder Team"
132
  msgstr ""
133
 
134
  #: classes/controllers/FrmAddonsController.php:21
884
  msgstr ""
885
 
886
  #: classes/controllers/FrmSMTPController.php:322
887
+ #: classes/models/FrmPluginSearch.php:306
888
  #: classes/views/addons/settings.php:31
889
+ #: js/formidable_admin.js:5901
890
  msgid "Activate"
891
  msgstr ""
892
 
1234
  #: classes/views/frm-forms/new-form-overlay.php:132
1235
  #: classes/views/shared/admin-header.php:56
1236
  #: classes/views/shared/confirm-overlay.php:19
1237
+ #: js/formidable_admin.js:3668
1238
  msgid "Cancel"
1239
  msgstr ""
1240
 
1261
 
1262
  #: classes/helpers/FrmAppHelper.php:2822
1263
  #: classes/helpers/FrmListHelper.php:412
1264
+ #: js/formidable_admin.js:4060
1265
  msgid "Heads up"
1266
  msgstr ""
1267
 
1401
  msgid "You are using an outdated browser that is not compatible with Formidable Forms. Please update to a more current browser (we recommend Chrome)."
1402
  msgstr ""
1403
 
1404
+ #: classes/helpers/FrmAppHelper.php:2989
1405
  msgid "English"
1406
  msgstr ""
1407
 
1408
+ #: classes/helpers/FrmAppHelper.php:2990
1409
  msgid "Afrikaans"
1410
  msgstr ""
1411
 
1412
+ #: classes/helpers/FrmAppHelper.php:2991
1413
  msgid "Albanian"
1414
  msgstr ""
1415
 
1416
+ #: classes/helpers/FrmAppHelper.php:2992
1417
+ msgid "Algerian Arabic"
1418
+ msgstr ""
1419
+
1420
+ #: classes/helpers/FrmAppHelper.php:2993
1421
+ msgid "Amharic"
1422
+ msgstr ""
1423
+
1424
+ #: classes/helpers/FrmAppHelper.php:2994
1425
  msgid "Arabic"
1426
  msgstr ""
1427
 
1428
+ #: classes/helpers/FrmAppHelper.php:2995
1429
  msgid "Armenian"
1430
  msgstr ""
1431
 
1432
+ #: classes/helpers/FrmAppHelper.php:2996
1433
  msgid "Azerbaijani"
1434
  msgstr ""
1435
 
1436
+ #: classes/helpers/FrmAppHelper.php:2997
1437
  msgid "Basque"
1438
  msgstr ""
1439
 
1440
+ #: classes/helpers/FrmAppHelper.php:2998
1441
+ msgid "Belarusian"
1442
+ msgstr ""
1443
+
1444
+ #: classes/helpers/FrmAppHelper.php:2999
1445
+ msgid "Bengali"
1446
+ msgstr ""
1447
+
1448
+ #: classes/helpers/FrmAppHelper.php:3000
1449
  msgid "Bosnian"
1450
  msgstr ""
1451
 
1452
+ #: classes/helpers/FrmAppHelper.php:3001
1453
  msgid "Bulgarian"
1454
  msgstr ""
1455
 
1456
+ #: classes/helpers/FrmAppHelper.php:3002
1457
  msgid "Catalan"
1458
  msgstr ""
1459
 
1460
+ #: classes/helpers/FrmAppHelper.php:3003
1461
  msgid "Chinese Hong Kong"
1462
  msgstr ""
1463
 
1464
+ #: classes/helpers/FrmAppHelper.php:3004
1465
  msgid "Chinese Simplified"
1466
  msgstr ""
1467
 
1468
+ #: classes/helpers/FrmAppHelper.php:3005
1469
  msgid "Chinese Traditional"
1470
  msgstr ""
1471
 
1472
+ #: classes/helpers/FrmAppHelper.php:3006
1473
  msgid "Croatian"
1474
  msgstr ""
1475
 
1476
+ #: classes/helpers/FrmAppHelper.php:3007
1477
  msgid "Czech"
1478
  msgstr ""
1479
 
1480
+ #: classes/helpers/FrmAppHelper.php:3008
1481
  msgid "Danish"
1482
  msgstr ""
1483
 
1484
+ #: classes/helpers/FrmAppHelper.php:3009
1485
  msgid "Dutch"
1486
  msgstr ""
1487
 
1488
+ #: classes/helpers/FrmAppHelper.php:3010
1489
  msgid "English/UK"
1490
  msgstr ""
1491
 
1492
+ #: classes/helpers/FrmAppHelper.php:3011
1493
  msgid "Esperanto"
1494
  msgstr ""
1495
 
1496
+ #: classes/helpers/FrmAppHelper.php:3012
1497
  msgid "Estonian"
1498
  msgstr ""
1499
 
1500
+ #: classes/helpers/FrmAppHelper.php:3013
1501
  msgid "Faroese"
1502
  msgstr ""
1503
 
1504
+ #: classes/helpers/FrmAppHelper.php:3014
1505
  msgid "Farsi/Persian"
1506
  msgstr ""
1507
 
1508
+ #: classes/helpers/FrmAppHelper.php:3015
1509
  msgid "Filipino"
1510
  msgstr ""
1511
 
1512
+ #: classes/helpers/FrmAppHelper.php:3016
1513
  msgid "Finnish"
1514
  msgstr ""
1515
 
1516
+ #: classes/helpers/FrmAppHelper.php:3017
1517
  msgid "French"
1518
  msgstr ""
1519
 
1520
+ #: classes/helpers/FrmAppHelper.php:3018
1521
  msgid "French/Canadian"
1522
  msgstr ""
1523
 
1524
+ #: classes/helpers/FrmAppHelper.php:3019
1525
  msgid "French/Swiss"
1526
  msgstr ""
1527
 
1528
+ #: classes/helpers/FrmAppHelper.php:3020
1529
+ msgid "Galician"
1530
+ msgstr ""
1531
+
1532
+ #: classes/helpers/FrmAppHelper.php:3021
1533
+ msgid "Georgian"
1534
+ msgstr ""
1535
+
1536
+ #: classes/helpers/FrmAppHelper.php:3022
1537
  msgid "German"
1538
  msgstr ""
1539
 
1540
+ #: classes/helpers/FrmAppHelper.php:3023
1541
  msgid "German/Austria"
1542
  msgstr ""
1543
 
1544
+ #: classes/helpers/FrmAppHelper.php:3024
1545
  msgid "German/Switzerland"
1546
  msgstr ""
1547
 
1548
+ #: classes/helpers/FrmAppHelper.php:3025
1549
  msgid "Greek"
1550
  msgstr ""
1551
 
1552
+ #: classes/helpers/FrmAppHelper.php:3026
1553
+ msgid "Gujarati"
1554
+ msgstr ""
1555
+
1556
+ #: classes/helpers/FrmAppHelper.php:3027
1557
+ #: classes/helpers/FrmAppHelper.php:3028
1558
  msgid "Hebrew"
1559
  msgstr ""
1560
 
1561
+ #: classes/helpers/FrmAppHelper.php:3029
1562
  msgid "Hindi"
1563
  msgstr ""
1564