diff --git a/classes/controllers/FrmFormActionsController.php b/classes/controllers/FrmFormActionsController.php
index 05da258b6c..55a5910c70 100644
--- a/classes/controllers/FrmFormActionsController.php
+++ b/classes/controllers/FrmFormActionsController.php
@@ -54,6 +54,7 @@ public static function register_actions() {
$action_classes = array(
'on_submit' => 'FrmOnSubmitAction',
'email' => 'FrmEmailAction',
+ 'gated_content' => 'FrmGatedContentAction',
'wppost' => 'FrmDefPostAction',
'register' => 'FrmDefRegAction',
'paypal' => 'FrmDefPayPalAction',
diff --git a/classes/controllers/FrmGatedContentController.php b/classes/controllers/FrmGatedContentController.php
new file mode 100644
index 0000000000..ad893b1e00
--- /dev/null
+++ b/classes/controllers/FrmGatedContentController.php
@@ -0,0 +1,621 @@
+is_main_query() || is_admin() ) {
+ return;
+ }
+
+ $post_id = self::get_requested_post_id( $query );
+ if ( ! $post_id ) {
+ return;
+ }
+
+ if ( ! self::has_valid_token_for_post( $post_id ) ) {
+ return;
+ }
+
+ $statuses = $query->get( 'post_status' );
+ if ( ! is_array( $statuses ) ) {
+ $statuses = $statuses ? array( $statuses ) : array( 'publish' );
+ }
+ if ( ! in_array( 'private', $statuses, true ) ) {
+ $statuses[] = 'private';
+ $query->set( 'post_status', $statuses );
+ }
+ }
+
+ /**
+ * Attempt to unlock a gated post (password-protected or private) using a token.
+ *
+ * Hooked on 'wp' so get_queried_object_id() is available. Private pages are
+ * already in the query by this point (via maybe_include_private_pages), so
+ * only password-protected pages need the post_password_required filter.
+ *
+ * Resolution order:
+ * 1. URL query parameter access_code (raw token → hashed via obtain_token).
+ * 2. Any frm_gc_* cookie whose hash validates against the current post.
+ *
+ * @return void
+ */
+ public static function maybe_unlock_post() {
+ $post_id = get_queried_object_id();
+ if ( ! $post_id ) {
+ return;
+ }
+
+ // Detect whether the token arrived via URL param before falling back to cookies.
+ $access_code = FrmAppHelper::simple_get( 'access_code' );
+ $from_url_param = is_string( $access_code ) && '' !== $access_code;
+
+ // Try URL query parameter first (obtain_token with no action_id uses URL param only).
+ $hash = FrmGatedTokenHelper::obtain_token();
+
+ // No URL param — scan frm_gc_* cookies to find one that grants access to this page.
+ if ( ! $hash ) {
+ $hash = self::find_valid_cookie_hash_for_post( $post_id );
+ }
+
+ if ( ! $hash ) {
+ return;
+ }
+
+ // Fetch the row once and reuse for both validation and cookie/redirect logic.
+ $row = FrmGatedTokenHelper::get_row_by_hash( $hash );
+
+ if ( FrmGatedTokenHelper::validate_hash( $hash, $post_id, 'page', $row ) ) {
+ $post = get_post( $post_id );
+
+ // Password-protected pages need an explicit filter; private pages are
+ // already accessible because maybe_include_private_pages widened the query.
+ if ( $post && '' !== $post->post_password ) {
+ self::$unlocked_post_id = $post_id;
+ add_filter( 'post_password_required', 'FrmGatedContentController::filter_password_required', 10, 2 );
+ }
+
+ // Refresh the frm_gc_ cookie so subsequent visits skip the URL param.
+ if ( $row ) {
+ FrmGatedTokenHelper::set_cookie( (int) $row->action_id, $hash, $row->expired_at );
+ }
+
+ // Strip the raw token from the URL to prevent leakage via browser history,
+ // server logs, and Referer headers. The cookie set above grants access on
+ // the redirected request without the query parameter.
+ if ( $from_url_param ) {
+ wp_safe_redirect( remove_query_arg( 'access_code' ) );
+ exit;
+ }
+
+ return;
+ }
+
+ // Token present but invalid (expired or revoked) — redirect if action configured it.
+ if ( ! $row ) {
+ return;
+ }
+
+ $action = get_post( (int) $row->action_id );
+ if ( ! $action ) {
+ return;
+ }
+
+ $settings = FrmAppHelper::maybe_json_decode( $action->post_content );
+ if ( ! empty( $settings['show_form_page'] ) ) {
+ $redirect_url = get_permalink( (int) $settings['show_form_page'] );
+ if ( $redirect_url ) {
+ wp_safe_redirect( $redirect_url );
+ exit;
+ }
+ }
+ }
+
+ /**
+ * Filter callback: return false for the single post unlocked by maybe_unlock_post().
+ *
+ * Fires on the 'post_password_required' filter. Only overrides the result for
+ * the specific post ID stored in self::$unlocked_post_id — all other posts are
+ * passed through unchanged.
+ *
+ * @param bool $required Whether the password is required.
+ * @param WP_Post $post Post being checked.
+ *
+ * @return bool
+ */
+ public static function filter_password_required( $required, $post ) {
+ if ( $post->ID === self::$unlocked_post_id ) {
+ return false;
+ }
+ return $required;
+ }
+
+ /**
+ * Resolve the post ID being requested from query vars, including private posts.
+ *
+ * Called from maybe_include_private_pages() during pre_get_posts, before the
+ * DB query runs. Uses post_status => 'any' so private pages are returned
+ * regardless of whether the visitor is logged in.
+ *
+ * @param WP_Query $query Current query object.
+ *
+ * @return int Post ID, or 0 if it cannot be determined.
+ */
+ private static function get_requested_post_id( $query ) {
+ if ( ! empty( $query->query_vars['page_id'] ) ) {
+ return (int) $query->query_vars['page_id'];
+ }
+
+ if ( empty( $query->query_vars['pagename'] ) ) {
+ return 0;
+ }
+
+ $pages = get_posts(
+ array(
+ 'pagename' => $query->query_vars['pagename'],
+ 'post_type' => 'page',
+ 'post_status' => 'any',
+ 'posts_per_page' => 1,
+ 'no_found_rows' => true,
+ )
+ );
+
+ return ! empty( $pages ) ? $pages[0]->ID : 0;
+ }
+
+ /**
+ * Check whether the current request carries any valid token for a given post.
+ *
+ * Checks the URL access_code parameter first, then frm_gc_* cookies. Used by
+ * maybe_include_private_pages() to decide whether to widen the query.
+ *
+ * @param int $post_id Post ID to validate against.
+ *
+ * @return bool True if a valid token is found.
+ */
+ private static function has_valid_token_for_post( $post_id ) {
+ $access_code = FrmAppHelper::simple_get( 'access_code' );
+ if ( '' !== $access_code ) {
+ $hash = hash( 'sha256', $access_code );
+ if ( FrmGatedTokenHelper::validate_hash( $hash, $post_id, 'page' ) ) {
+ return true;
+ }
+ }
+
+ return null !== self::find_valid_cookie_hash_for_post( $post_id );
+ }
+
+ /**
+ * Scan frm_gc_* cookies and return the first hash that validates against a post.
+ *
+ * Used as a fallback when no access_code URL parameter is present, allowing
+ * return visits to stay unlocked without re-clicking the emailed link.
+ *
+ * @param int $post_id Post ID to validate against.
+ *
+ * @return string|null Validated token hash, or null if none found.
+ */
+ private static function find_valid_cookie_hash_for_post( $post_id ) {
+ foreach ( $_COOKIE as $name => $value ) {
+ if ( 0 !== strpos( $name, 'frm_gc_' ) ) {
+ continue;
+ }
+ $hash = sanitize_text_field( $value );
+ if ( FrmGatedTokenHelper::validate_hash( $hash, $post_id, 'page' ) ) {
+ return $hash;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Delete all gated tokens linked to a gated content action when it is permanently deleted.
+ *
+ * Fires on 'before_delete_post'. Only acts on frm_form_actions posts whose
+ * post_excerpt identifies them as gated_content actions.
+ *
+ * @param int $post_id Post ID being deleted.
+ * @param WP_Post $post Post object being deleted.
+ *
+ * @return void
+ */
+ public static function on_action_deleted( $post_id, $post ) {
+ if ( 'frm_form_actions' !== $post->post_type || FrmGatedContentAction::$slug !== $post->post_excerpt ) {
+ return;
+ }
+ FrmGatedTokenHelper::delete_by_action( $post_id );
+ }
+
+ /**
+ * Generate a gated content token when a form action fires.
+ *
+ * @param object $action Form action post object (post_excerpt = 'gated_content').
+ * @param object $entry Submitted form entry object.
+ * @param object $form Form object.
+ * @param string $event Trigger event ('create', 'update', or 'import').
+ *
+ * @return void
+ */
+ public static function trigger( $action, $entry, $form, $event ) {
+ $raw_user_id = get_current_user_id();
+ $user_id = $raw_user_id ? $raw_user_id : null;
+
+ // On update, revoke any existing tokens for this action+entry pair before
+ // issuing a fresh one — prevents unbounded row accumulation and ensures the
+ // old token cannot be used once the entry owner receives a new one.
+ // Skip deletion when the action is configured to keep the old token.
+ if ( 'update' === $event && empty( $action->post_content['keep_token_on_update'] ) ) {
+ FrmGatedTokenHelper::delete_by_action_and_entry( $action->ID, $entry->id );
+ }
+
+ FrmGatedTokenHelper::generate( $action->ID, $entry->id, $user_id );
+ }
+
+ /**
+ * Default attributes for the [frm_gated_content] shortcode.
+ *
+ * - id (required) Action post ID.
+ * - item (optional) 0-indexed item position. Omit to render the full item list.
+ * - show (optional) 'link' (default) | 'url' | 'access_token' | 'expired_time'.
+ * 'link' — link tag(s). Without item:
+
+ '.concat(e.message," of links. With item: single .
+ * 'url' — Plain URL string. Without item:
of plain URLs. With item: single URL.
+ * 'access_token' — Raw access token string.
+ * 'expired_time' — Formatted expiry date/time (empty if token never expires).
+ *
+ * @return array
element, or empty string when no items produce a URL.
+ */
+ public static function render_item_list( $items, $raw_token ) {
+ if ( empty( $items ) ) {
+ return '';
+ }
+
+ $list_items = '';
+
+ foreach ( $items as $item ) {
+ if ( ! is_array( $item ) || empty( $item['id'] ) || empty( $item['type'] ) ) {
+ continue;
+ }
+
+ $url = self::get_item_url( (int) $item['id'], $item['type'], $raw_token );
+ if ( ! $url ) {
+ continue;
+ }
+
+ $label = self::get_item_title( (int) $item['id'], $item['type'] );
+ if ( ! $label ) {
+ $label = $url;
+ }
+
+ $list_items .= '
' . $list_items . '
';
+ }
+
+ /**
+ * Render an unordered list of plain URLs (no link tags) for all items in an action.
+ *
+ * Used when show="url" is set without an item index.
+ *
+ * @param array $items Array of item arrays from action settings (each with 'id' and 'type' keys).
+ * @param string $raw_token Raw access token.
+ *
+ * @return string HTML element of plain-text URLs, or empty string when no items produce a URL.
+ */
+ public static function render_item_url_list( $items, $raw_token ) {
+ if ( empty( $items ) ) {
+ return '';
+ }
+
+ $list_items = '';
+
+ foreach ( $items as $item ) {
+ if ( ! is_array( $item ) || empty( $item['id'] ) || empty( $item['type'] ) ) {
+ continue;
+ }
+
+ $url = self::get_item_url( (int) $item['id'], $item['type'], $raw_token );
+ if ( ! $url ) {
+ continue;
+ }
+
+ $list_items .= '
' . $list_items . '
';
+ }
+
+ /**
+ * Return the formatted expiry time for a raw token.
+ *
+ * @param string $raw_token Raw access token.
+ *
+ * @return string Localised date/time string, or empty string if the token never expires or is not found.
+ */
+ public static function get_formatted_expiry( $raw_token ) {
+ return self::get_formatted_expiry_by_hash( hash( 'sha256', $raw_token ) );
+ }
+
+ /**
+ * Return the formatted expiry time for a token hash.
+ *
+ * @param string $hash SHA-256 hex hash of the access token.
+ *
+ * @return string Localised date/time string, or empty string if the token never expires or is not found.
+ */
+ private static function get_formatted_expiry_by_hash( $hash ) {
+ $row = FrmGatedTokenHelper::get_row_by_hash( $hash );
+
+ if ( ! $row || null === $row->expired_at ) {
+ return '';
+ }
+
+ return date_i18n( get_option( 'date_format' ) . ' ' . get_option( 'time_format' ), (int) $row->expired_at );
+ }
+}
diff --git a/classes/controllers/FrmHooksController.php b/classes/controllers/FrmHooksController.php
index d5383d9eb9..39a354520b 100644
--- a/classes/controllers/FrmHooksController.php
+++ b/classes/controllers/FrmHooksController.php
@@ -112,6 +112,18 @@ public static function load_hooks() {
// Summary emails.
add_action( 'frm_daily_event', 'FrmEmailSummaryController::maybe_send_emails' );
+ // Gated Content — daily cleanup of expired tokens.
+ add_action( 'frm_daily_event', 'FrmGatedTokenHelper::cleanup_expired' );
+
+ // Gated Content Controller.
+ add_action( 'frm_trigger_gated_content_action', 'FrmGatedContentController::trigger', 10, 4 );
+ // pre_get_posts: allows private pages into the query when a valid token is present.
+ add_action( 'pre_get_posts', 'FrmGatedContentController::maybe_include_private_pages' );
+ // 'wp' fires after WP::query_posts() so get_queried_object_id() is available.
+ add_action( 'wp', 'FrmGatedContentController::maybe_unlock_post' );
+ add_action( 'before_delete_post', 'FrmGatedContentController::on_action_deleted', 10, 2 );
+ add_shortcode( 'frm_gated_content', 'FrmGatedContentController::shortcode' );
+
FrmTransLiteHooksController::load_hooks();
FrmStrpLiteHooksController::load_hooks();
FrmSquareLiteHooksController::load_hooks();
diff --git a/classes/helpers/FrmAppHelper.php b/classes/helpers/FrmAppHelper.php
index 2fd40f9648..3a58b7d412 100644
--- a/classes/helpers/FrmAppHelper.php
+++ b/classes/helpers/FrmAppHelper.php
@@ -10,7 +10,7 @@ class FrmAppHelper {
*
* @var int
*/
- public static $db_version = 105;
+ public static $db_version = 106;
/**
* Used by the API add-on.
diff --git a/classes/helpers/FrmGatedTokenHelper.php b/classes/helpers/FrmGatedTokenHelper.php
new file mode 100644
index 0000000000..9331cb73bc
--- /dev/null
+++ b/classes/helpers/FrmGatedTokenHelper.php
@@ -0,0 +1,460 @@
+
+ */
+ private static $generated_tokens = array();
+
+ /**
+ * Per-request cache of token rows indexed by SHA-256 hash.
+ * Populated by get_row_by_hash() so multiple shortcodes for the same
+ * action on one page do not each issue a separate DB query.
+ *
+ * @var array
+ $frm_gc_item ) : ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ` elements.
+ *
+ * @since x.x
+ *
+ * @param int $frm_gc_action_id ID of the current gated content action post.
+ */
+ do_action( 'frm_gated_content_shortcodes', $frm_gc_action_id );
+ ?>
+
+
+
+
+
+
+ {var n;!function(){"use strict";var o={not_string:/[^s]/,not_bool:/[^t]/,not_type:/[^T]/,not_primitive:/[^v]/,number:/[diefg]/,numeric_arg:/[bcdiefguxX]/,json:/[j]/,not_json:/[^j]/,text:/^[^\x25]+/,modulo:/^\x25{2}/,placeholder:/^\x25(?:([1-9]\d*)\$|\(([^)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijostTuvxX])/,key:/^([a-z_][a-z_\d]*)/i,key_access:/^\.([a-z_][a-z_\d]*)/i,index_access:/^\[(\d+)\]/,sign:/^[+-]/};function i(e){return function(e,t){var r,n,a,l,s,c,d,f,u,m=1,_=e.length,p="";for(n=0;n<_;n++)if("string"==typeof e[n])p+=e[n];else if("object"==typeof e[n]){if((l=e[n]).keys)for(r=t[m],a=0;a").addClass("frm_grid_container frm_sorting").append(e)))}),r}function Ue(e){var t=s("ul",{className:"frm_grid_container frm_sorting"}),r=s("li",{className:"frm_field_box",child:t});e.replaceWith(r),t.append(e),$(t),X(r,".frm-move")}function We(e,t){var r,n,o=/id="(\S+)"/.exec(e),i=document.getElementById(o[1]),l="#".concat(o[1],".edit_field_type_divider ul.frm_sorting.start_divider"),s=jQuery(l),d=i.getAttribute("data-type");r=e,(n=c()).innerHTML=r,n.querySelectorAll(".form-field").forEach(Ve);var f,u,m=!1;if(Po(),V(l),"quantity"===d&&function(e){var t=e.getAttribute("data-fid"),r=document.getElementById("field_options[product_field_".concat(t,"]"));r&&(rt(r),oo(document.getElementById("frm-single-settings-".concat(t))))}(i),"product"!==d&&"quantity"!==d||Ie(),s.length)s.parent(".frm_field_box").children(".frm_no_section_fields").addClass("frm_block");else{var _=jQuery(i).closest("ul.frm_sorting.start_divider");_.length&&(An(_),m=!0)}e.includes("frm-collapse-page")&&Fr(),u="frm-newly-added",(f=i).classList?f.classList.add(u):f.className+=" ".concat(u),setTimeout(function(){i.classList.remove("frm-newly-added")},1e3);var p,g=i.querySelector("#frm-last-row-fields-order");if(g&&((p=JSON.parse(g.value))&&"object"===a(p)&&Object.keys(p).forEach(function(e){var t=document.querySelector('input[name="field_options[field_order_'.concat(e,']"]'));t&&(t.value=p[e])})),t){var y=i.getBoundingClientRect(),v=document.getElementById("post-body-content");y.top>=0&&y.left>=0&&y.right<=(window.innerWidth||document.documentElement.clientWidth)&&y.bottom<=(window.innerHeight||document.documentElement.clientHeight)||v.scroll({top:v.scrollHeight,left:0,behavior:"smooth"}),!1===m&&An(s)}Ke(),ci(),document.getElementById("frm-show-fields").classList.remove("frm-over-droppable"),function(e){var t=document.getElementById(e);null!=t&&t.dataset.limit&&kr(e)>=t.dataset.limit&&t.classList.add("frm_at_limit")}(d),i.querySelectorAll("[data-toggle]").forEach(function(e){return e.setAttribute("data-bs-toggle",e.getAttribute("data-toggle"))}),i.querySelectorAll(".frm-dropdown-menu").forEach(function(e){return e.classList.add("dropdown-menu")});var h=new Event("frm_added_field",{bubbles:!1});h.frmField=i,h.frmSection=l,h.frmType=d,h.frmToggles=m,document.dispatchEvent(h)}function Ve(e){if(e.dataset.fid){var t=document.getElementById("draft_fields");t&&(""===t.value?t.value=e.dataset.fid:t.value.split(",").includes(e.dataset.fid)||(t.value+=",".concat(e.dataset.fid)))}}function $e(e){jQuery("#new_fields .frm-single-settings").addClass("frm_hidden"),jQuery("#frm-options-panel > .frm-single-settings").removeClass("frm_hidden"),Ke(e)}function Ke(e){jQuery("li.ui-state-default.selected").removeClass("selected"),jQuery(".frm-show-field-settings.selected").removeClass("selected"),e||yr()}function Je(){var e=this.value,t=function(e){var t,r=[],n=e.split(""),o=n.length,a=["{","[","("],l={"}":"{",")":"(","]":"["},s=!1;for(t=0;t
6)return t.append(Gt(e,"even")),t;if(5!==e&&t.append(Gt(e,"even")),e%2==1&&t.append(Gt(e,"middle")),e<6)t.append(Gt(e,"left")),t.append(Gt(e,"right"));else{var r=c();r.classList.add("frm_fourth"),t.prepend(r)}return t}(e),l=t.closest("ul.frm_sorting");return l&&function(e,t){for(var r=t.children.length,n=0;n
Imported ').concat(r.data.name,"
"),e.find(".status").prepend(n),e.find(".status").show(),C.importQueue=jQuery.grep(C.importQueue,function(e){return e!=t}),C.imported++,0===C.importQueue.length?(e.find(".process-count").hide(),e.find(".forms-completed").text(C.imported),e.find(".process-completed").show()):(e.find(".form-current").text(C.imported+1),ei(e)))})}function ti(e){e.preventDefault();var t=!1,r=jQuery('input[name="frm_export_forms[]"]');jQuery('input[name="frm_export_forms[]"]:checked').val()||(r.closest(".frm-table-box").addClass("frm_blank_field"),t="stop");var n=jQuery('input[name="type[]"]');if(jQuery('input[name="type[]"]:checked').val()||"checkbox"!==n.attr("type")||(n.closest("p").addClass("frm_blank_field"),t="stop"),"stop"===t)return!1;e.stopPropagation(),this.submit()}function ri(){var e=jQuery(this).closest(".frm_blank_field");if(void 0!==e){var t=this.name;("type[]"===t&&jQuery('input[name="type[]"]:checked').val()||"frm_export_forms[]"===t&&jQuery(this).val())&&e.removeClass("frm_blank_field")}}function ni(){null!==jQuery(this).val().match(/\.csv$/i)?jQuery(".show_csv").fadeIn():jQuery(".show_csv").fadeOut()}function oi(){var e=document.querySelector('select[name="format"]');return e?e.value:""}function ii(e){var t,r,n=e.target.value;li(n),ai.call(e.target),t=n,r=document.getElementById("frm-export-select-all"),"csv"===t?(r.checked=!1,r.disabled=!0):r.disabled=!1}function ai(){var e=jQuery(this),t=e.find(":selected"),r=t.data("support"),n=r.indexOf("|");jQuery('input[name="type[]"]').each(function(){this.checked=!1,r.includes(this.value)?(this.disabled=!1,-1===n&&(this.checked=!0)):this.disabled=!0}),"csv"===e.val()?(jQuery(".csv_opts").show(),jQuery(".xml_opts").hide()):(jQuery(".csv_opts").hide(),jQuery(".xml_opts").show());var o=t.data("count"),i=jQuery('input[name="frm_export_forms[]"]');"single"===o?(i.prop("multiple",!1),i.prop("checked",!1)):(i.prop("multiple",!0),i.prop("disabled",!1)),e.trigger("change")}function li(e){if(""!==e){var t=document.querySelectorAll(".frm-is-repeater");t.length&&("csv"===e?t.forEach(function(e){e.classList.remove("frm_hidden")}):t.forEach(function(e){e.classList.add("frm_hidden")}),Qi.call(document.querySelector(".frm-auto-search")))}}function si(){var e=jQuery("select[name=format]").find(":selected").data("count"),t=jQuery('input[name="frm_export_forms[]"]');"single"===e&&this.checked?(t.prop("disabled",!0),this.removeAttribute("disabled")):t.prop("disabled",!1)}function ci(){jQuery(".frm_multiselect").hide().each(frmDom.bootstrap.multiselect.init)}function di(e){e.preventDefault(),mi(this,"frm_multiple_addons")}function fi(e){e.preventDefault(),mi(this,"frm_activate_addon")}function ui(e){e.preventDefault(),mi(this,"frm_install_addon")}function mi(e,t){r(1105).toggleAddonState(e,t)}function _i(){gi()}function pi(e){!function(e,t,r){var n=jQuery("#frm_leave_email_error");n.removeClass("frm_hidden").attr("frm-error",r),jQuery("#frm_leave_email").one("keyup",function(){n.addClass("frm_hidden")})}(0,0,e)}function gi(){var e=document.getElementById("frmapi-email-form");jQuery.ajax({dataType:"json",url:e.getAttribute("data-url"),success:function(t){var r=t.renderedHtml;r=r.replace(/]*(formidableforms.css|action=frmpro_css)[^>]*>/gi,""),e.innerHTML=r}})}function yi(e){frmDom.autocomplete.initSelectionAutocomplete(e)}function vi(e){var t=this.parentNode.parentNode,r=t.elements.type.value;e.preventDefault(),this.classList.add("frm_loading_button"),bi(t,r,this)}function hi(e){var t=this.elements.type.value,r=this.querySelector("button");e.preventDefault(),r.classList.add("frm_loading_button"),bi(this,t,r)}function bi(e,t,r){var n=function(e){var t,r,n={},o=e.elements;for(r=0;r'.concat(e.message,"
Imported ').concat(r.data.name,"
"),e.find(".status").prepend(n),e.find(".status").show(),C.importQueue=jQuery.grep(C.importQueue,function(e){return e!=t}),C.imported++,0===C.importQueue.length?(e.find(".process-count").hide(),e.find(".forms-completed").text(C.imported),e.find(".process-completed").show()):(e.find(".form-current").text(C.imported+1),ei(e)))})}function ti(e){e.preventDefault();var t=!1,r=jQuery('input[name="frm_export_forms[]"]');jQuery('input[name="frm_export_forms[]"]:checked').val()||(r.closest(".frm-table-box").addClass("frm_blank_field"),t="stop");var n=jQuery('input[name="type[]"]');if(jQuery('input[name="type[]"]:checked').val()||"checkbox"!==n.attr("type")||(n.closest("p").addClass("frm_blank_field"),t="stop"),"stop"===t)return!1;e.stopPropagation(),this.submit()}function ri(){var e=jQuery(this).closest(".frm_blank_field");if(void 0!==e){var t=this.name;("type[]"===t&&jQuery('input[name="type[]"]:checked').val()||"frm_export_forms[]"===t&&jQuery(this).val())&&e.removeClass("frm_blank_field")}}function ni(){null!==jQuery(this).val().match(/\.csv$/i)?jQuery(".show_csv").fadeIn():jQuery(".show_csv").fadeOut()}function oi(){var e=document.querySelector('select[name="format"]');return e?e.value:""}function ii(e){var t,r,n=e.target.value;li(n),ai.call(e.target),t=n,r=document.getElementById("frm-export-select-all"),"csv"===t?(r.checked=!1,r.disabled=!0):r.disabled=!1}function ai(){var e=jQuery(this),t=e.find(":selected"),r=t.data("support"),n=r.indexOf("|");jQuery('input[name="type[]"]').each(function(){this.checked=!1,r.includes(this.value)?(this.disabled=!1,-1===n&&(this.checked=!0)):this.disabled=!0}),"csv"===e.val()?(jQuery(".csv_opts").show(),jQuery(".xml_opts").hide()):(jQuery(".csv_opts").hide(),jQuery(".xml_opts").show());var o=t.data("count"),i=jQuery('input[name="frm_export_forms[]"]');"single"===o?(i.prop("multiple",!1),i.prop("checked",!1)):(i.prop("multiple",!0),i.prop("disabled",!1)),e.trigger("change")}function li(e){if(""!==e){var t=document.querySelectorAll(".frm-is-repeater");t.length&&("csv"===e?t.forEach(function(e){e.classList.remove("frm_hidden")}):t.forEach(function(e){e.classList.add("frm_hidden")}),Qi.call(document.querySelector(".frm-auto-search")))}}function si(){var e=jQuery("select[name=format]").find(":selected").data("count"),t=jQuery('input[name="frm_export_forms[]"]');"single"===e&&this.checked?(t.prop("disabled",!0),this.removeAttribute("disabled")):t.prop("disabled",!1)}function ci(){jQuery(".frm_multiselect").hide().each(frmDom.bootstrap.multiselect.init)}function di(e){e.preventDefault(),mi(this,"frm_multiple_addons")}function fi(e){e.preventDefault(),mi(this,"frm_activate_addon")}function ui(e){e.preventDefault(),mi(this,"frm_install_addon")}function mi(e,t){r(1105).toggleAddonState(e,t)}function _i(){gi()}function pi(e){!function(e,t,r){var n=jQuery("#frm_leave_email_error");n.removeClass("frm_hidden").attr("frm-error",r),jQuery("#frm_leave_email").one("keyup",function(){n.addClass("frm_hidden")})}(0,0,e)}function gi(){var e=document.getElementById("frmapi-email-form");jQuery.ajax({dataType:"json",url:e.getAttribute("data-url"),success:function(t){var r=t.renderedHtml;r=r.replace(/]*(formidableforms.css|action=frmpro_css)[^>]*>/gi,""),e.innerHTML=r}})}function yi(e){frmDom.autocomplete.initSelectionAutocomplete(e)}function vi(e){var t=this.parentNode.parentNode,r=t.elements.type.value;e.preventDefault(),this.classList.add("frm_loading_button"),bi(t,r,this)}function hi(e){var t=this.elements.type.value,r=this.querySelector("button");e.preventDefault(),r.classList.add("frm_loading_button"),bi(this,t,r)}function bi(e,t,r){var n=function(e){var t,r,n={},o=e.elements;for(r=0;r