HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: /var/www/html/bwcsports-site/wp-content/plugins/calculated-fields-form/inc/cpcff_main.inc.php
<?php
/**
 * Main class with main actions and filters: CPCFF_MAIN class
 *
 * @package CFF.
 * @since 1.0.170
 */

// phpcs:disable Squiz.PHP.EmbeddedPhp.ContentBeforeOpen
// phpcs:disable Squiz.PHP.EmbeddedPhp.ContentBeforeEnd
// phpcs:disable Squiz.PHP.EmbeddedPhp.ContentAfterEnd
// phpcs:disable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
// phpcs:disable Squiz.Commenting.FunctionComment.MissingParamTagSquiz.Commenting.FunctionComment.MissingParamTag

if ( ! class_exists( 'CPCFF_MAIN' ) ) {
	/**
	 * Class that defines the main actions and filters, and plugin's functionalities.
	 *
	 * @since  1.0.170
	 */
	class CPCFF_MAIN {

		/**
		 * Counter of forms in a same page
		 * Metaclass property.
		 *
		 * @since 1.0.170
		 * @var int $form_counter
		 */
		public static $form_counter = 0;

		/**
		 * Instance of the CPCFF_MAIN class
		 * Metaclass property to implement a singleton.
		 *
		 * @since 1.0.179
		 * @var object $_instance
		 */
		private static $_instance;

		/**
		 * Identifies if the class was instanciated from the public website or WordPress
		 * Instance property.
		 *
		 * @sinze 1.0.170
		 * @var bool $_is_admin
		 */
		private $_is_admin = false;

		/**
		 * Plugin URL
		 * Instance property.
		 *
		 * @sinze 1.0.170
		 * @var string $_plugin_url
		 */
		private $_plugin_url;

		/**
		 * Flag to know if the public resources were included
		 * Instance property.
		 *
		 * @sinze 1.0.170
		 * @var bool $_are_resources_loaded default false
		 */
		private $_are_resources_loaded = false;

		/**
		 * Forms list.
		 * List of instances of the CPCFF_FORM class.
		 * Instance property.
		 *
		 * @sinze 1.0.179
		 * @var object $_active_form
		 */
		private $_forms = array();

		/**
		 * List of forms categories.
		 * Instance property.
		 */
		private $_categories = array();

		/**
		 * Instance of the CPCFF_AMP class to manage the forms in AMP pages
		 * Instance property.
		 *
		 * @sinze 1.0.230
		 * @var object $_amp
		 */
		private $_amp;

		/**
		 * List of nonces for iframe loaded forms
		 * Instance property.
		 */
		private $_iframe_nonces;

		private $mail_obj;

		/**
		 * Constructs a CPCFF_MAIN object, and define the hooks to the filters and actions.
		 * The constructor is private because this class is a singleton
		 */
		private function __construct() {
			require_once CP_CALCULATEDFIELDSF_BASE_PATH . '/inc/cpcff_form.inc.php';
			require_once CP_CALCULATEDFIELDSF_BASE_PATH . '/inc/cpcff_amp.inc.php';

			// Initializes the $_is_admin property.
			$this->_is_admin = is_admin();

			// Initializes the $_plugin_url property.
			$this->_plugin_url = plugin_dir_url( CP_CALCULATEDFIELDSF_MAIN_FILE_PATH );

			// Initialize $_iframe_nonces.
			$this->_iframe_nonces = array();

			// Plugin activation/deactivation.
			$this->_activate_deactivate();

			// Load the language file.
			add_action( 'after_setup_theme', function(){ load_plugin_textdomain( 'calculated-fields-form', false, dirname( CP_CALCULATEDFIELDSF_BASE_NAME ) . '/languages/' ); } );
			add_action( 'plugins_loaded', array( $this, 'plugins_loaded' ) );

			// Instanciate the AMP object.
			$this->_amp = new CPCFF_AMP( $this );

			// Run the initialization code.
			add_action( 'init', array( $this, 'init' ), 1 );

			// Redirect after first time installation.
			add_action( 'activated_plugin', function($p1, $p2){
				if ( get_transient('cff-video-tutorial') ) {
					$redirect_url = admin_url( 'admin.php?page=cp_calculated_fields_form' );
					wp_safe_redirect(
						esc_url( $redirect_url )
					);
					exit;
				}
			}, 10, 2 );

			// Run the initialization code of widgets.
			add_action( 'widgets_init', array( $this, 'widgets_init' ), 1 );

			// Integration with Page Builders.
			require_once CP_CALCULATEDFIELDSF_BASE_PATH . '/inc/cpcff_page_builders.inc.php';
			CPCFF_PAGE_BUILDERS::run();
		} // End __construct.

		/**
		 * Returns the instance of the singleton.
		 *
		 * @since 1.0.179
		 * @return object self::$_instance
		 */
		public static function instance() {
			if ( ! isset( self::$_instance ) ) {
				self::$_instance = new self();
			}
			return self::$_instance;
		} // End instance.

		/**
		 * Loads the primary resources, previous to the plugin's initialization
		 *
		 * Loads resources like the laguages files, etc.
		 *
		 * @return void.
		 */
		public function plugins_loaded() {
			// Fix different troubleshoots.
			$this->troubleshoots();

			// Load controls scripts.
			$this->_load_controls_scrips();
		} // End plugins_loaded.

		/**
		 * Initializes the plugin, runs as soon as possible.
		 *
		 * Initilize the plugin's sections, intercepts the submissions, generates the resources etc.
		 *
		 * @return void.
		 */
		public function init() {
			CPCFF_AUXILIARY::clean_transients_hook(); // Set the hook for clearing the expired transients.

			if ( $this->_is_admin ) {
				require_once __DIR__ . '/cpcff_openai.inc.php';

				if (
					false === ( $CP_CALCULATEDFIELDSF_VERSION = get_option( 'CP_CALCULATEDFIELDSF_VERSION' ) ) || // phpcs:ignore Squiz.PHP.DisallowMultipleAssignments
					CP_CALCULATEDFIELDSF_VERSION != $CP_CALCULATEDFIELDSF_VERSION
				) {
					if ( class_exists( 'CPCFF_INSTALLER' ) ) {
						CPCFF_INSTALLER::install( is_multisite() );
					}
					update_option( 'CP_CALCULATEDFIELDSF_VERSION', CP_CALCULATEDFIELDSF_VERSION );
				}

				// Update metabox status if corresponds.
				$this->update_metabox_status();

				// Adds the plugin links in the plugins sections.
				add_filter( 'plugin_action_links_' . CP_CALCULATEDFIELDSF_BASE_NAME, array( $this, 'links' ) );

				// Creates the menu entries in the WordPress menu.
				add_action( 'admin_menu', array( $this, 'admin_menu' ) );
				add_action( 'admin_head', array( $this, 'admin_menu_styles' ), 11 );

				// Displays the shortcode insertion buttons.
				add_action( 'media_buttons', array( $this, 'media_buttons' ) );

				// Loads the admin resources.
				add_action( 'admin_enqueue_scripts', array( $this, 'admin_resources' ), 1 );
			}
			$this->_define_shortcodes();
			add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_loader' ) );
		} // End init.

		/**
		 * Registers the widgets.
		 *
		 * Registers the widget to include the forms on sidebars, and for loading the data collected by the forms in the dashboard.
		 *
		 * @since 1.0.178
		 *
		 * @return void.
		 */
		public function widgets_init() {
			// Replace the shortcodes into the text widgets.
			if ( ! $this->_is_admin ) {
				add_filter( 'widget_text', 'do_shortcode' );
			}
		} // End widgets_init.

		/**
		 * Adds the plugin's links in the plugins section.
		 *
		 * Links for accessing to the help, settings, developers website, etc.
		 *
		 * @param array $links.
		 *
		 * @return array.
		 */
		public function links( $links ) {
			array_unshift(
				$links,
				'<a href="https://cff.dwbooster.com/customization" target="_blank">' . __( 'Request custom changes' ) . '</a>',
				'<a href="admin.php?page=cp_calculated_fields_form">' . __( 'Settings' ) . '</a>',
				'<a href="https://cff.dwbooster.com/download" target="_blank">' . __( 'Upgrade' ) . '</a>',
				'<a href="https://wordpress.org/support/plugin/calculated-fields-form#new-post" target="_blank">' . __( 'Help' ) . '</a>'
			);
			return $links;
		} // End links.

		/**
		 * Prints the buttons for inserting the different shortcodes into the pages/posts contents.
		 *
		 * Prints the HTML code that appears beside the media button with the icons and code to insert the shortcodes:
		 *
		 * - CP_CALCULATED_FIELDS
		 * - CP_CALCULATED_FIELDS_VAR
		 *
		 * @return void.
		 */
		public function media_buttons() {
			print '<a href="javascript:cp_calculatedfieldsf_insertForm();" title="' . esc_attr__( 'Insert Calculated Fields Form', 'calculated-fields-form' ) . '"><img src="' . esc_attr( $this->_plugin_url ) . 'images/cp_form.gif" alt="' . esc_attr__( 'Insert Calculated Fields Form', 'calculated-fields-form' ) . '" /></a><a href="javascript:cp_calculatedfieldsf_insertVar();" title="' . esc_attr__( 'Create a JavaScript var from POST, GET, SESSION, or COOKIE var', 'calculated-fields-form' ) . '"><img src="' . esc_attr( $this->_plugin_url ) . 'images/cp_var.gif" alt="' . esc_attr__( 'Create a JavaScript var from POST, GET, SESSION, or COOKIE var', 'calculated-fields-form' ) . '" /></a>';
		} // End media_buttons.

		/**
		 * Generates the entries in the WordPress menu.
		 *
		 * @return void.
		 */
		public function admin_menu() {
			global $submenu;

			// Settings page.
			add_options_page( 'Calculated Fields Form Options', 'Calculated Fields Form', apply_filters( 'cpcff_forms_edition_capability', 'manage_options' ), 'cp_calculated_fields_form', array( $this, 'admin_pages' ) );

			// Menu option.
			add_menu_page( 'Calculated Fields Form Options', 'Calculated Fields Form', apply_filters( 'cpcff_forms_edition_capability', 'manage_options' ), 'cp_calculated_fields_form', array( $this, 'admin_pages' ) );

			// Submenu options.
			add_submenu_page( 'cp_calculated_fields_form', 'Calculated Fields Form', 'All Forms', apply_filters( 'cpcff_forms_edition_capability', 'manage_options' ), 'cp_calculated_fields_form', array( $this, 'admin_pages' ) );

			add_submenu_page( 'cp_calculated_fields_form', 'Calculated Fields Form - New Form', 'Add New', apply_filters( 'cpcff_forms_edition_capability', 'manage_options' ), 'cp_calculated_fields_form_sub_new', array( $this, 'admin_pages' ) );

			add_submenu_page( 'cp_calculated_fields_form', 'Calculated Fields Form - Troubleshoot Area & General Settings', 'Troubleshoot Area & General Settings', apply_filters( 'cpcff_forms_edition_capability', 'manage_options' ), 'cp_calculated_fields_form_sub_troubleshoots_settings', array( $this, 'admin_pages' ) );

			add_submenu_page( 'cp_calculated_fields_form', 'Upgrade', 'Upgrade', apply_filters( 'cpcff_forms_edition_capability', 'manage_options' ), 'cp_calculated_fields_form_sub_upgrade', array( $this, 'admin_pages' ) );

			add_submenu_page( 'cp_calculated_fields_form', 'Marketplace', 'Marketplace', apply_filters( 'cpcff_forms_edition_capability', 'manage_options' ), 'cp_calculated_fields_form_sub_marketplace', array( $this, 'admin_pages' ) );

			add_submenu_page( 'cp_calculated_fields_form', 'Documentation', 'Documentation', apply_filters( 'cpcff_forms_edition_capability', 'manage_options' ), 'cp_calculated_fields_form_sub_documentation', array( $this, 'admin_pages' ) );

			add_submenu_page( 'cp_calculated_fields_form', 'Online Help', 'Online Help', apply_filters( 'cpcff_forms_edition_capability', 'manage_options' ), 'cp_calculated_fields_form_sub_forum', array( $this, 'admin_pages' ) );

			// phpcs:disable WordPress.WP.GlobalVariablesOverride.Prohibited
			if ( ! empty( $submenu ) && is_array( $submenu ) && ! empty( $submenu['cp_calculated_fields_form'] ) ) {
				foreach ( $submenu['cp_calculated_fields_form'] as $index => $item ) {
					if ( 'cp_calculated_fields_form_sub_marketplace' == $item[2] ) {
						if ( isset( $item[4] ) ) {
							$submenu['cp_calculated_fields_form'][ $index ][4] .= ' calculated-fields-form-submenu-marketplace';
						} else {
							$submenu['cp_calculated_fields_form'][ $index ][] = 'calculated-fields-form-submenu-marketplace';
						}
					}

					if ( 'cp_calculated_fields_form_sub_upgrade' == $item[2] ) {
						if ( isset( $item[4] ) ) {
							$submenu['cp_calculated_fields_form'][ $index ][4] .= ' calculated-fields-form-submenu-upgrade';
						} else {
							$submenu['cp_calculated_fields_form'][ $index ][] = 'calculated-fields-form-submenu-upgrade';
						}
					}
				}
			}
			// phpcs:enable WordPress.WP.GlobalVariablesOverride.Prohibited
		} // End admin_menu.

		public function admin_menu_styles() {
			$styles = '';

			$styles .= 'a.calculated-fields-form-submenu-marketplace { background-color: #f0db4f !important; color: #323330 !important; font-weight: 600 !important; }';
			$styles .= 'a.calculated-fields-form-submenu-upgrade { background-color: #ee7878 !important; color: #ffffff !important; font-weight: 600 !important; }';

			// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
			printf( '<style>%s</style>', $styles );
		} // End admin_menu_styles.

		/**
		 * Loads the corresponding pages in the WordPress or redirects the user to the external URLs.
		 *
		 * Loads the webpage with the list of forms, addons activation, general settings, etc.
		 * or redirects to external webpages like plugin's documentation
		 *
		 * @since 1.0.181
		 */
		public function admin_pages() {
			// Settings page of the plugin.
			if ( isset( $_GET['cal'] ) && '' != $_GET['cal'] ) {
				@include_once CP_CALCULATEDFIELDSF_BASE_PATH . '/inc/cpcff_admin_int.inc.php';
			} else {
				// Redirecting outer website.
				if ( isset( $_GET['page'] ) && 'cp_calculated_fields_form_sub_upgrade' == $_GET['page'] ) {
					if ( @wp_redirect( 'https://cff.dwbooster.com/download' ) ) {
						exit;
					}
				} elseif ( isset( $_GET['page'] ) && 'cp_calculated_fields_form_sub_documentation' == $_GET['page'] ) {
					if ( @wp_redirect( 'https://cff.dwbooster.com/documentation' ) ) {
						exit;
					}
				} elseif ( isset( $_GET['page'] ) && 'cp_calculated_fields_form_sub_marketplace' == $_GET['page'] ) {
					if ( @wp_redirect( 'https://cff-bundles.dwbooster.com' ) ) {
						exit;
					}
				} elseif ( isset( $_GET['page'] ) && 'cp_calculated_fields_form_sub_forum' == $_GET['page'] ) {
					if ( @wp_redirect( 'https://wordpress.org/support/plugin/calculated-fields-form#new-post' ) ) {
						exit;
					}
				} else {
					@include_once CP_CALCULATEDFIELDSF_BASE_PATH . '/inc/cpcff_admin_int_list.inc.php';
				}
			}
		} // End admin_pages.

		/**
		 * Loads the javascript and style files.
		 *
		 * Checks if there is the settings page of the plugin for loading the corresponding JS and CSS files,
		 * or if it is a post or page the script for inserting the shortcodes in the content's editor.
		 *
		 * @since 1.0.171
		 *
		 * @param string $hook.
		 * @return void.
		 */
		public function admin_resources( $hook ) {
			// Checks if it is the plugin's page.
			if ( isset( $_GET['page'] ) ) {
				// Checks if it is to an external page.
				if (
					'cp_calculated_fields_form_sub_documentation' == $_GET['page'] ||
					'cp_calculated_fields_form_sub_marketplace' == $_GET['page'] ||
					'cp_calculated_fields_form_sub_upgrade' == $_GET['page'] ||
					'cp_calculated_fields_form_sub_forum' == $_GET['page']
				) {

					$redirect_url   = '';
					$cpcff_redirect = array();
					switch ( $_GET['page'] ) {
						case 'cp_calculated_fields_form_sub_documentation':
							$cpcff_redirect['url'] = 'https://cff.dwbooster.com/documentation';
							break;
						case 'cp_calculated_fields_form_sub_upgrade':
							$cpcff_redirect['url'] = 'https://cff.dwbooster.com/download';
							break;
						case 'cp_calculated_fields_form_sub_forum':
							$cpcff_redirect['url'] = 'https://wordpress.org/support/plugin/calculated-fields-form#new-post';
							break;
						case 'cp_calculated_fields_form_sub_marketplace':
							$cpcff_redirect['url'] = 'https://cff-bundles.dwbooster.com';
							break;
					}
					wp_enqueue_script( 'cp_calculatedfieldsf_redirect_script', plugins_url( '/js/redirect_script.js', CP_CALCULATEDFIELDSF_MAIN_FILE_PATH ), array(), CP_CALCULATEDFIELDSF_VERSION );
					wp_localize_script(
						'cp_calculatedfieldsf_redirect_script',
						'cpcff_redirect',
						$cpcff_redirect
					);

				} elseif (
					in_array( $_GET['page'], array( 'cp_calculated_fields_form', 'cp_calculated_fields_form_sub_new', 'cp_calculated_fields_form_sub_troubleshoots_settings' ) )
				) {

					wp_deregister_script( 'tribe-events-bootstrap-datepicker' );
					wp_register_script( 'tribe-events-bootstrap-datepicker', plugins_url( '/js/nope.js', CP_CALCULATEDFIELDSF_MAIN_FILE_PATH ), array(), CP_CALCULATEDFIELDSF_VERSION );

					wp_enqueue_script( 'jquery' );
					wp_enqueue_script( 'jquery-ui-core' );
					wp_enqueue_script( 'jquery-ui-sortable' );
					wp_enqueue_script( 'jquery-ui-tabs' );
					wp_enqueue_script( 'jquery-ui-droppable' );
					wp_enqueue_script( 'jquery-ui-button' );
					wp_enqueue_script( 'jquery-ui-datepicker' );

					// ULR to the admin resources.
					$admin_resources = admin_url( 'admin.php?page=cp_calculated_fields_form&cp_cff_resources=admin' );
					wp_enqueue_script( 'cp_calculatedfieldsf_builder_script', $admin_resources, array( 'jquery', 'jquery-ui-core', 'jquery-ui-sortable', 'jquery-ui-tabs', 'jquery-ui-droppable', 'jquery-ui-button', 'jquery-ui-accordion', 'jquery-ui-datepicker' ), CP_CALCULATEDFIELDSF_VERSION );

					wp_enqueue_script( 'cp_calculatedfieldsf_builder_library_script', plugins_url( '/js/library.js', CP_CALCULATEDFIELDSF_MAIN_FILE_PATH ), array( 'cp_calculatedfieldsf_builder_script' ), CP_CALCULATEDFIELDSF_VERSION );

					wp_localize_script(
						'cp_calculatedfieldsf_builder_library_script',
						'cpcff_forms_library_config',
						array(
							'version'     => 'free',
							'website_url' => 'admin.php?page=cp_calculated_fields_form&a=1&_cpcff_nonce=' . wp_create_nonce( 'cff-add-form' ),
						)
					);

					wp_enqueue_script( 'cp_calculatedfieldsf_builder_script_caret', plugins_url( '/vendors/jquery.caret.js', CP_CALCULATEDFIELDSF_MAIN_FILE_PATH ), array( 'jquery' ), CP_CALCULATEDFIELDSF_VERSION );
					wp_enqueue_style( 'cp_calculatedfieldsf_builder_style', plugins_url( '/css/style.css', CP_CALCULATEDFIELDSF_MAIN_FILE_PATH ), array(), CP_CALCULATEDFIELDSF_VERSION );
					wp_enqueue_style( 'cp_calculatedfieldsf_builder_library_style', plugins_url( '/css/stylelibrary.css', CP_CALCULATEDFIELDSF_MAIN_FILE_PATH ), array( 'cp_calculatedfieldsf_builder_style' ), CP_CALCULATEDFIELDSF_VERSION );
					wp_enqueue_style( 'jquery-style', '//ajax.googleapis.com/ajax/libs/jqueryui/1.8.2/themes/smoothness/jquery-ui.css', array(), CP_CALCULATEDFIELDSF_VERSION );

				}
			}

			// Checks if it is a page or post.
			if ( 'post.php' == $hook || 'post-new.php' == $hook ) {
				wp_enqueue_script( 'cp_calculatedfieldsf_script', plugins_url( '/js/cp_calculatedfieldsf_scripts.js', CP_CALCULATEDFIELDSF_MAIN_FILE_PATH ), array(), CP_CALCULATEDFIELDSF_VERSION );
			}
		} // End admin_resources.

		public function metabox_status( $metabox_id ) {
			$statuses = get_option( 'cff-metaboxes-statuses', array() );
			return ( ! empty( $statuses ) && is_array( $statuses ) && isset( $statuses[ $metabox_id ] ) && 0 == $statuses[ $metabox_id ] ) ? 'cff-metabox-closed' : 'cff-metabox-opened';
		} // End metabox_status.

		private function update_metabox_status() {
			if (
				! empty( $_POST['cff-metabox-nonce'] ) &&
				wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['cff-metabox-nonce'] ) ), 'cff-metabox-status' ) &&
				isset( $_POST['cff-metabox-id'] ) &&
				isset( $_POST['cff-metabox-action'] )
			) {
				$metabox_id     = sanitize_text_field( wp_unslash( $_POST['cff-metabox-id'] ) );
				$metabox_action = sanitize_text_field( wp_unslash( $_POST['cff-metabox-action'] ) );

				if ( ! empty( $metabox_id ) ) {
					$statuses = get_option( 'cff-metaboxes-statuses', array() );
					if ( empty( $statuses ) || ! is_array( $statuses ) ) {
						$statuses = array();
					}
					$statuses[ $metabox_id ] = $metabox_action == 'open' ? 1 : 0; // phpcs:ignore WordPress.PHP.YodaConditions
					update_option( 'cff-metaboxes-statuses', $statuses );
				}
			}
		} // End update_metabox_status.

		public function form_preview( $atts ) {
			if ( isset( $atts['shortcode_atts'] ) ) {
				error_reporting( E_ERROR | E_PARSE );
				global  $wp_styles, $wp_scripts;
				if ( ! empty( $wp_scripts ) ) {
					$wp_scripts->reset();
				}

				$message = (
					! empty( $atts['banner'] )
					? '
					<style>
					#codepeople-review-banner{box-sizing:border-box; border:10px solid #EEE;background:#FFF;display:table;visibility:visible !important;margin-bottom:15px;width:100% !important;}
					#codepeople-review-banner ul{margin-bottom:0;margin-top:5px;}
					#codepeople-review-banner ul li{margin-bottom:2px;}
					#codepeople-review-banner *{visibility:visible !important;}
					#codepeople-review-banner .codepeople-review-banner-content{padding:10px;}
					</style>
					<div id="codepeople-review-banner">
						<div class="codepeople-review-banner-content">
							<div class="codepeople-review-banner-text">
								<div>Upgrade to the <a href="https://cff.dwbooster.com/download" target="_blank" style="font-weight:700;color:#1582AB;">Professional plugin version</a> for advanced features. It\'s a one-time purchase with lifetime updates, and you can install it on all your websites. Thank you!
								<ul>
									<li>Improve user experience by emailing them a copy of the form data, including calculated field results.</li>
									<li>Save form data for analysis in tools like Excel or Google Sheets.</li>
									<li>Export the forms to your other websites easily.</li>
									<li>Integrate a payment gateway to charge users the calculated prices.</li>
								</ul>
								</div>
							</div>
						</div>
					</div>'
					: ''
				) . $this->public_form( $atts['shortcode_atts'] );

				ob_start();
				if ( ! empty( $wp_styles ) ) {
					$wp_styles->do_items();
				}
				if ( ! empty( $wp_scripts ) ) {
					$wp_scripts->do_items();
				}
				if ( class_exists( 'Error' ) ) {
					try {
						wp_footer(); } catch ( Error $err ) {
							error_log( $err->getMessage() );
						}
				}
				$message .= ob_get_contents();
				ob_end_clean();
				$page_title = ( ! empty( $atts['page_title'] ) ) ? $atts['page_title'] : '';
				remove_all_actions( 'shutdown' );
				if ( ! empty( $atts['wp_die'] ) ) {
					wp_die( $message . '<style>body{margin:1.5em !important;max-width:100% !important;box-shadow:none !important;background:white !important;padding:0 !important; border:0 !important;}html{background:white !important;}.wp-die-message{margin:0 !important;}.wp-die-message>*:not(form){visibility: hidden;}  .pac-container, .ui-tooltip, .ui-tooltip *,.ui-datepicker,.ui-datepicker *{visibility: visible;}</style>' . apply_filters( 'cpcff_form_preview_resources', '' ), esc_html( $page_title ), 200 ); // phpcs:ignore WordPress.Security.EscapeOutput
				} elseif ( ! empty( $atts['page'] ) ) {
					print '<!DOCTYPE html><html><head profile="http://gmpg.org/xfn/11">' .
					( get_option( 'CP_CALCULATEDFIELDSF_EXCLUDE_CRAWLERS', false ) ? '<meta name="robots" content="none" />' : '' ) .
					'<meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1"></head><body>';
					print $message; // phpcs:ignore WordPress.Security.EscapeOutput
					print '<style>body>*:not(form){visibility: hidden; width: 0; height: 0;} .pac-container, .ui-tooltip, .ui-tooltip *,.ui-datepicker,.ui-datepicker *{visibility: visible; width: auto; height: auto;}</style>' . apply_filters( 'cpcff_form_preview_resources', '' ) . '</body></html>'; // phpcs:ignore WordPress.Security.EscapeOutput
					exit;
				} else {
					print $message; // phpcs:ignore WordPress.Security.EscapeOutput
					exit;
				}
			}
		} // End form_preview.

		public function enqueue_loader() {
			global $post;

			if ( ! empty( $post ) && has_shortcode( $post->post_content, 'CP_CALCULATED_FIELDS' ) ) {
				wp_enqueue_style( 'cpcff_loader', plugins_url( '/css/loader.css', CP_CALCULATEDFIELDSF_MAIN_FILE_PATH ), array(), CP_CALCULATEDFIELDSF_VERSION );
			}
		} // End enqueue_loader.

		/**
		 * Returns the public version of the form wih its resources.
		 *
		 * The method calls the filters: cpcff_pre_form, and cpcff_the_form
		 *
		 * @since 1.0.171
		 * @param array $atts includes the attributes required to identify the form, and create the variables.
		 * @return string $content a text with the public version of the form and resources.
		 */
		public function public_form( $atts ) {
			// If the website is being visited by crawler, display empty text.
			if ( CPCFF_AUXILIARY::is_crawler() ) {
				return '';
			}
			if ( empty( $atts ) ) {
				$atts = array();
			}
			if ( ! $this->_is_admin && $this->_amp->is_amp() ) {
				$atts['iframe'] = 1;
				$content = $this->_amp->get_iframe( $atts );
			} else {
				global $wpdb, $cpcff_default_texts_array;

				if ( empty( $atts['id'] ) ) {
					$myrow = $wpdb->get_row( 'SELECT * FROM ' . $wpdb->prefix . CP_CALCULATEDFIELDSF_FORMS_TABLE ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
				} else {
					$myrow = $wpdb->get_row( $wpdb->prepare( 'SELECT * FROM ' . $wpdb->prefix . CP_CALCULATEDFIELDSF_FORMS_TABLE . ' WHERE id=%d', $atts['id'] ) ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
				}

				if ( empty( $myrow ) ) {
					return ''; // The form does not exists, or there are no forms.
				}
				$atts['id'] = $myrow->id; // If was not passed the form's id, uses the if of first form.
				$id         = $atts['id']; // Alias for the $atts[ 'id' ] variable.
				$form_template = ! empty( $atts[ 'template' ] ) ? trim( $atts[ 'template' ] ) : '';
				if ( ! empty( $atts['iframe'] ) ) {
					if ( ! isset( $this->_iframe_nonces[ $id ] ) ) {
						$this->_iframe_nonces[ $id ] = wp_create_nonce( 'cff-iframe-nonce-' . $id );
					}
					$form_obj = $this->get_form( $id );
					$url  = CPCFF_AUXILIARY::site_url( true );
					$url .= ( strpos( $url, '?' ) === false ? '?' : '&' ) . 'cff-form=' . $id . '&cff-form-target=_top&_nonce=' . $this->_iframe_nonces[ $id ] . ( ! empty( $form_template ) ? '&template=' . urlencode( $form_template ) : '' );

					// The attributes excepting "id", "iframe", "template", and "asynchronous" are converted in javascript variables with global scope
					if ( count( $atts ) > 1 ) {
						foreach ( $atts as $i => $v ) {
							if ( ! in_array( $i, array( 'id', 'iframe', 'class', 'asynchronous', 'template' ) ) && ! is_numeric( $i ) ) {
								$nV   = ( is_numeric( $v ) ) ? $v : sanitize_text_field( wp_unslash( $v ) ); // Sanitizing the attribute's value.
								$url .= '&' . urlencode( $i ) . '=' . urlencode( $nV );
							}
						}
					}

					$iframe_id  = uniqid( 'cff-iframe-' );
					$iframe_tag = '<script type="text/javascript">window.addEventListener("message", function(e) { if ("data" in e && typeof e.data == "object" && ! Array.isArray(e.data) && "cff_height" in e.data && "cff_iframe" in e.data) {try{ let el = document.getElementById(e.data.cff_iframe); el.style.height = e.data.cff_height + "px";el.style.minHeight="auto"; if( "parent" in window ) parent.postMessage({sentinel: "amp",type:"embed-size",height: e.data.cff_height+25}, "*"); }catch(err){}}}, false);</script><iframe ' . ' id="' . $iframe_id . '"';

					if ( ! empty( $form_obj ) ) {
						$iframe_tag = $form_obj->get_height( '#' . $iframe_id ) . $iframe_tag;
					}

					$url .= ( strpos( $url, '?' ) === false ? '?' : '&' ) . 'cff_iframe=' . $iframe_id;

					if ( ! empty( $atts['asynchronous'] ) ) {
						$iframe_tag = '<script>window.addEventListener("load", function(){let el = document.getElementById("' . $iframe_id . '"); if(el) el.setAttribute("src", el.getAttribute("data-cff-src"));});</script>' . $iframe_tag . ' src="about:blank" data-cff-src="' . esc_attr( $url ) . '"';
					} else {
						$iframe_tag .= ' src="' . esc_attr( $url ) . '"';
					}
					$iframe_tag .= ' style="border:none;width:100%;overflow-y:hidden;" onload="try{this.width=this.contentWindow.document.body.scrollWidth;this.height=this.contentWindow.document.body.scrollHeight+40;this.style.minHeight=\'auto\';}catch(err){}" scrolling="no"></iframe>';

					return $iframe_tag;
				}

				// Initializing the $form_counter.
				if ( ! isset( $GLOBALS['codepeople_form_sequence_number'] ) ) {
					$GLOBALS['codepeople_form_sequence_number'] = 0;
				}
				++$GLOBALS['codepeople_form_sequence_number'];
				self::$form_counter = $GLOBALS['codepeople_form_sequence_number']; // Current form.

				/**
				 * Filters applied before generate the form,
				 * is passed as parameter an array with the forms attributes, and return the list of attributes
				 */
				$atts = apply_filters( 'cpcff_pre_form', $atts );

				ob_start();

				// Constant defined to protect the "inc/cpcff_public_int.inc.php" file against direct accesses.
				if ( ! defined( 'CP_AUTH_INCLUDE' ) ) {
					define( 'CP_AUTH_INCLUDE', true );
				}

				$this->_public_resources( $id ); // Load form scripts and other resources.

				/* TO-DO: This method should be analyzed after moving other functions to the main class . */
				@include CP_CALCULATEDFIELDSF_BASE_PATH . '/inc/cpcff_public_int.inc.php';

				$content = ob_get_contents();

				// The attributes excepting "id" are converted in javascript variables with a global scope.
				if ( count( $atts ) > 1 ) {
					$content .= '<script>';
					foreach ( $atts as $i => $v ) {
						if ( 'id' != $i && 'class' != $i && ! is_numeric( $i ) ) {
							$nV = ( is_numeric( $v ) ) ? $v : json_encode( $v ); // Sanitizing the attribute's value.
							if ( is_scalar( $i ) ) {
								$i        = preg_replace( '/[^a-z0-9_\-]/i', '', $i );
								$content .= 'try{ if( ! ( "cff_var" in window ) )	window["cff_var"] = {}; window["cff_var"]["' . $i . '"]=' . $nV . '; if(typeof window["' . $i . '_arr"] == "undefined") window["' . $i . '_arr"]={}; window["' . $i . '_arr"]["_' . self::$form_counter . '"]=' . $nV . '; }catch( err ){}';
							}
						}
					}
					$content .= '</script>';
				}
				ob_end_clean();

				/**
				 * Filters applied after generate the form,
				 * is passed as parameter the HTML code of the form with the corresponding <LINK> and <SCRIPT> tags,
				 * and returns the HTML code to includes in the webpage
				 */
				$content = apply_filters( 'cpcff_the_form', $content, $atts['id'] );
			}

			return $content;
		} // End  public_form.

		/**
		 * Creates a javascript variable, from: Post, Get, Session or Cookie or directly.
		 *
		 * If the webpage is visited from a crawler or search engine spider, the shortcode is replaced by an empty text.
		 *
		 * @since 1.0.175
		 * @param array $atts includes the records:
		 *              - name, the variable's name.
		 *              - value, to create a variable splicitly with the value passed as attribute.
		 *              - from, identifies the variable source (POST, GET, SESSION or COOKIE), it is optional.
		 *              - default_value, used in combination with the from attribute to populate the variable
		 *                               with the default value of the source does not exist.
		 *
		 * @return string <script> tag with the variable's definition.
		 */
		public function create_variable_shortcode( $atts ) {
			if (
				! CPCFF_AUXILIARY::is_crawler() && // Checks for crawlers or search engine spiders.
				! empty( $atts['name'] ) &&
				( $var = trim( $atts['name'] ) ) != '' // phpcs:ignore Squiz.PHP.DisallowMultipleAssignments
			) {
				if ( isset( $atts['value'] ) ) {
					$value = json_encode( $atts['value'] );
				} else {
					$from = '_';
					if ( isset( $atts['from'] ) ) {
						$from .= strtoupper( trim( $atts['from'] ) );
					}
					if ( in_array( $from, array( '_POST', '_GET', '_SESSION', '_COOKIE' ) ) ) {
						if ( isset( $GLOBALS[ $from ][ $var ] ) ) {
							$value = json_encode( $GLOBALS[ $from ][ $var ] );
						} elseif ( isset( $atts['default_value'] ) ) {
							$value = json_encode( $atts['default_value'] );
						}
					} elseif ( isset( $_POST[ $var ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
						$value = json_encode( CPCFF_AUXILIARY::sanitize( $_POST[ $var ] ) ); // phpcs:ignore
					} elseif ( isset( $_GET[ $var ] ) ) {
						$value = json_encode( CPCFF_AUXILIARY::sanitize( $_GET[ $var ] ) ); // phpcs:ignore
					} elseif ( isset( $_SESSION[ $var ] ) ) {
						$value = json_encode( CPCFF_AUXILIARY::sanitize( $_SESSION[ $var ] ) ); // phpcs:ignore
					} elseif ( isset( $_COOKIE[ $var ] ) ) {
						$value = json_encode( CPCFF_AUXILIARY::sanitize( $_COOKIE[ $var ] ) ); // phpcs:ignore
					} elseif ( isset( $atts['default_value'] ) ) {
						$value = json_encode( CPCFF_AUXILIARY::sanitize( $atts['default_value'] ) ); // phpcs:ignore
					}
				}
				if ( isset( $value ) ) {
					if ( is_scalar( $var ) ) {
						$var = preg_replace( '/[^a-z0-9_\-]/i', '', $var );
						return '
						<script>
							try{
							if( ! ( "cff_var" in window ) )	window["cff_var"] = {};
							window["cff_var"]["' . $var . '"]=' . $value . ';
							}catch( err ){}
						</script>
						';
					}
				}
			}
			return '';
		} // End create_variable_shortcode.

		/**
		 * Return the list of categories associted with the forms
		 */
		public function get_categories( $html = '', &$current = null ) {
			global $wpdb;

			if ( empty( $this->_categories ) ) {
				$this->_categories = $wpdb->get_results( 'SELECT DISTINCT category FROM ' . $wpdb->prefix . CP_CALCULATEDFIELDSF_FORMS_TABLE . ' WHERE category IS NOT NULL AND category <> ""', ARRAY_A ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
			}
			if ( empty( $html ) ) {
				return $this->_categories;
			}

			$output = '';
			$flag   = false;

			if ( ! empty( $this->_categories ) ) {
				foreach ( $this->_categories as $category ) {
					$selected = '';

					if ( $current === $category['category'] ) {
						$selected = 'SELECTED';
						$flag     = true;
					}

					if ( 'SELECT' == $html ) {
						$output .= '<option value="' . esc_attr( $category['category'] ) . '" ' . $selected . ' >' . esc_html( $category['category'] ) . '</option>';
					} else // DATALIST.
					{
						$output .= '<option value="' . esc_attr( $category['category'] ) . '">';
					}
				}
			}

			if ( ! $flag ) {
				$current = '';
			}

			return $output;
		} // End get_categories.

		/**
		 * Returns an instance of the active form
		 *
		 * If there is not an active form generates the instance.
		 *
		 * @since 1.0.179
		 * @return object
		 */
		public function get_form( $id ) {
			if ( ! isset( $this->_forms[ $id ] ) ) {
				$this->_forms[ $id ] = new CPCFF_FORM( $id );
			}
			return $this->_forms[ $id ];
		} // End get_active_form.

		/**
		 * Creates a new form calling the static method CPCFF_FORM::create_default
		 *
		 * @since 1.0.179
		 *
		 * @param string $form_name, the name of form.
		 * @return mixed, an instance of the created form or false.
		 */
		public function create_form( $form_name, $category_name = '', $form_template = 0 ) {
			$form = CPCFF_FORM::create_default( $form_name, $category_name, $form_template );
			if ( $form ) {
				$this->_forms[ $form->get_id() ] = $form;
			}
			return $form;
		} // End create_form.

		/**
		 * Deletes the form.
		 * The methods throw the cpcff_delete_form hook after delete the form.
		 *
		 * @since 1.0.179
		 * @param integer $id, the form's id.
		 * @return mixed, the number of delete rows or false.
		 */
		public function delete_form( $id ) {
			$deleted = $this->get_form( $id )->delete_form();
			if ( $deleted ) {
				do_action( 'cpcff_delete_form', $id );
				unset( $this->_forms[ $id ] );
			}
			return $deleted;
		} // End delete_form.

		/**
		 * Clones a form.
		 *
		 * @since 1.0.179
		 * @param integer $id, the form's id.
		 * @return mixed, an instance of cloned form or false.
		 */
		public function clone_form( $id ) {
			if ( ! isset( $this->_forms[ $id ] ) ) {
				$this->_forms[ $id ] = new CPCFF_FORM( $id );
			}
			$cloned_form = $this->_forms[ $id ]->clone_form();
			if ( $cloned_form ) {
				/**
				 * Passes as parameter the original form's id, and the new form's id
				 */
				do_action( 'cpcff_clone_form', $id, $cloned_form->get_id() );
			}
			return $cloned_form;
		} // End clone_form.

		/*********************************** PRIVATE METHODS  ********************************************/

		/**
		 * Defines the activativation/deactivation hooks, and new blog hook.
		 *
		 * Requires the cpcff_install_uninstall.inc.php file with the activate/deactivate code, and the code to run with new blogs.
		 *
		 * @sinze 1.0.171
		 * @return void.
		 */
		private function _activate_deactivate() {
			require_once CP_CALCULATEDFIELDSF_BASE_PATH . '/inc/cpcff_install_uninstall.inc.php';
			register_activation_hook( CP_CALCULATEDFIELDSF_MAIN_FILE_PATH, array( 'CPCFF_INSTALLER', 'install' ) );
			register_deactivation_hook( CP_CALCULATEDFIELDSF_MAIN_FILE_PATH, array( 'CPCFF_INSTALLER', 'uninstall' ) );
			add_action( 'wpmu_new_blog', array( 'CPCFF_INSTALLER', 'new_blog' ), 10, 6 );
		} // End _activate_deactivate.

		/**
		 * Loads the controls scripts.
		 *
		 * Checks if there is defined the "cp_cff_resources" parameter, and loads the public or admin scripsts for the controls.
		 * If the scripsts are loaded the plugin exits the PHP execution.
		 *
		 * @return void.
		 */
		private function _load_controls_scrips() {
			if ( isset( $_REQUEST['cp_cff_resources'] ) ) {
				if ( ! defined( 'WP_DEBUG' ) || true != WP_DEBUG ) {
					error_reporting( E_ERROR | E_PARSE );
				}
				// Set the corresponding header.
				if ( ! headers_sent() ) {
					header( 'Content-type: application/javascript' );
				}

				if ( ! $this->_is_admin || 'public' == $_REQUEST['cp_cff_resources'] ) {
					require_once CP_CALCULATEDFIELDSF_BASE_PATH . '/js/fbuilder-loader-public.php';
				} else {
					require_once CP_CALCULATEDFIELDSF_BASE_PATH . '/js/fbuilder-loader-admin.php';
				}
				remove_all_actions( 'shutdown' );
				exit;
			}
		} // End _load_controls_scrips.

		/**
		 * Defines the shortcodes used by the plugin's code:
		 *
		 * - CP_CALCULATED_FIELDS
		 * - CP_CALCULATED_FIELDS_VAR
		 *
		 * @return void.
		 */
		private function _define_shortcodes() {
			add_shortcode( 'CP_CALCULATED_FIELDS', array( $this, 'public_form' ) );
			add_shortcode( 'CP_CALCULATED_FIELDS_VAR', array( $this, 'create_variable_shortcode' ) );
		} // End _define_shortcodes.
		/**
		 * Returns a JSON object with the configuration object.
		 *
		 * Uses the global variable $cpcff_default_texts_array, defined in the "config/cpcff_config.cfg.php"
		 *
		 * @sinze 1.0.171
		 * @param int $formid the form's id.
		 * @return string $json
		 */
		private function _get_form_configuration( $formid ) {
			$form_obj       = $this->get_form( $formid );
			$previous_label = $form_obj->get_option( 'vs_text_previousbtn', 'Previous' );
			$previous_label = ( '' == $previous_label ? 'Previous' : $previous_label );
			$next_label     = $form_obj->get_option( 'vs_text_nextbtn', 'Next' );
			$next_label     = ( '' == $next_label ? 'Next' : $next_label );

			$cpcff_texts_array = $form_obj->get_option('vs_all_texts', []);

			$obj = array(
				'pub'        => true,
				'identifier' => '_' . self::$form_counter,
				'messages'   => array(
					'required'       => $form_obj->get_option( 'vs_text_is_required', CP_CALCULATEDFIELDSF_DEFAULT_vs_text_is_required ),
					'email'          => $form_obj->get_option( 'vs_text_is_email', CP_CALCULATEDFIELDSF_DEFAULT_vs_text_is_email ),
					'datemmddyyyy'   => $form_obj->get_option( 'vs_text_datemmddyyyy', CP_CALCULATEDFIELDSF_DEFAULT_vs_text_datemmddyyyy ),
					'dateddmmyyyy'   => $form_obj->get_option( 'vs_text_dateddmmyyyy', CP_CALCULATEDFIELDSF_DEFAULT_vs_text_dateddmmyyyy ),
					'number'         => $form_obj->get_option( 'vs_text_number', CP_CALCULATEDFIELDSF_DEFAULT_vs_text_number ),
					'digits'         => $form_obj->get_option( 'vs_text_digits', CP_CALCULATEDFIELDSF_DEFAULT_vs_text_digits ),
					'max'            => $form_obj->get_option( 'vs_text_max', CP_CALCULATEDFIELDSF_DEFAULT_vs_text_max ),
					'min'            => $form_obj->get_option( 'vs_text_min', CP_CALCULATEDFIELDSF_DEFAULT_vs_text_min ),
					'previous'       => $previous_label,
					'next'           => $next_label,
					'pageof'         => $cpcff_texts_array['page_of_text']['text'],
					'audio_tutorial' => $cpcff_texts_array['audio_tutorial_text']['text'],
					'minlength'      => $cpcff_texts_array['errors']['minlength']['text'],
					'maxlength'      => $cpcff_texts_array['errors']['maxlength']['text'],
					'equalTo'        => $cpcff_texts_array['errors']['equalTo']['text'],
					'accept'         => $cpcff_texts_array['errors']['accept']['text'],
					'upload_size'    => $cpcff_texts_array['errors']['upload_size']['text'],
					'phone'          => $cpcff_texts_array['errors']['phone']['text'],
					'currency'       => $cpcff_texts_array['errors']['currency']['text'],
				),
			);
				return json_encode( $obj );
		} // End _get_form_configuration.

		/**
		 * Loads the javascript and style files used by the public forms.
		 *
		 * Checks if the plugin was configured for loading HTML tags directly, or to use the WordPress functions.
		 *
		 * @since 1.0.171
		 * @param int $formid the form's id.
		 * @return void.
		 */
		private function _public_resources( $formid ) {
			if (
				get_option( 'CP_CALCULATEDFIELDSF_USE_CACHE', CP_CALCULATEDFIELDSF_USE_CACHE ) &&
				file_exists( CP_CALCULATEDFIELDSF_BASE_PATH . '/js/cache/all.js' )
			) {
				$public_js_path = plugins_url( '/js/cache/all.js', CP_CALCULATEDFIELDSF_MAIN_FILE_PATH );
			}

			if ( empty( $public_js_path ) ) {
				global $cff_backend_script_generator, $cff_script_generator_min;

				$cff_backend_script_generator = 1;
				$cff_script_generator_min     = get_option( 'CP_CALCULATEDFIELDSF_USE_CACHE', CP_CALCULATEDFIELDSF_USE_CACHE );
				include_once CP_CALCULATEDFIELDSF_BASE_PATH . '/js/fbuilder-loader-public.php';
			}

			if (
				file_exists( CP_CALCULATEDFIELDSF_BASE_PATH . '/js/cache/all.js' )
			) {
				$public_js_path = plugins_url( '/js/cache/all.js', CP_CALCULATEDFIELDSF_MAIN_FILE_PATH );
			} else {
				$public_js_path = CPCFF_AUXILIARY::wp_current_url() . ( ( strpos( CPCFF_AUXILIARY::wp_current_url(), '?' ) === false ) ? '?' : '&' ) . 'cp_cff_resources=public&min=' . get_option( 'CP_CALCULATEDFIELDSF_USE_CACHE', CP_CALCULATEDFIELDSF_USE_CACHE );
			}

			$config_json = $this->_get_form_configuration( $formid );

			if ( $GLOBALS['CP_CALCULATEDFIELDSF_DEFAULT_DEFER_SCRIPTS_LOADING'] ) {
				wp_enqueue_script( 'jquery' );
				wp_enqueue_script( 'jquery-ui-core' );
				wp_enqueue_script( 'jquery-ui-button' );
				wp_enqueue_script( 'jquery-ui-widget' );
				wp_enqueue_script( 'jquery-ui-position' );
				wp_enqueue_script( 'jquery-ui-tooltip' );
				wp_enqueue_script( 'jquery-ui-datepicker' );
				wp_enqueue_script( 'jquery-ui-slider' );

				wp_deregister_script( 'cp_calculatedfieldsf_validate_script' );
				wp_register_script( 'cp_calculatedfieldsf_validate_script', plugins_url( '/vendors/jquery.validate.js', CP_CALCULATEDFIELDSF_MAIN_FILE_PATH ), array( 'jquery' ), 'pro' );
				wp_enqueue_script( 'cp_calculatedfieldsf_builder_script', $public_js_path, array( 'jquery', 'jquery-ui-core', 'jquery-ui-button', 'jquery-ui-widget', 'jquery-ui-position', 'jquery-ui-tooltip', 'cp_calculatedfieldsf_validate_script', 'jquery-ui-datepicker', 'jquery-ui-slider' ), CP_CALCULATEDFIELDSF_VERSION, true );

				wp_localize_script( 'cp_calculatedfieldsf_builder_script', 'cp_calculatedfieldsf_fbuilder_config_' . self::$form_counter, array( 'obj' => $config_json ) );
			} else {
				// This code won't be used in most cases. This code is for preventing problems in wrong WP themes and conflicts with third party plugins.
				if ( ! $this->_are_resources_loaded ) {
					global $wp_version;
					$this->_are_resources_loaded = true; // Resources loaded.

					$includes_url = includes_url();

					// Used for compatibility with old versions of WordPress.
					$prefix_ui = ( @file_exists( CP_CALCULATEDFIELDSF_BASE_PATH . '/../../../wp-includes/js/jquery/ui/jquery.ui.core.min.js' ) ) ? 'jquery.ui.' : '';

					if ( ! wp_script_is( 'jquery', 'done' ) ) {
						print '<script type="text/javascript" src="' . esc_attr( $includes_url ) . 'js/jquery/jquery.js"></script>'; // phpcs:ignore WordPress.WP.EnqueuedResources
					}
					if ( ! wp_script_is( 'jquery-ui-core', 'done' ) ) {
						print '<script type="text/javascript" src="' . esc_attr( $includes_url ) . 'js/jquery/ui/' . esc_attr( $prefix_ui ) . 'core.min.js"></script>'; // phpcs:ignore WordPress.WP.EnqueuedResources
					}
					if ( ! wp_script_is( 'jquery-ui-datepicker', 'done' ) ) {
						print '<script type="text/javascript" src="' . esc_attr( $includes_url ) . 'js/jquery/ui/' . esc_attr( $prefix_ui ) . 'datepicker.min.js"></script>'; // phpcs:ignore WordPress.WP.EnqueuedResources
					}

					if ( version_compare( $wp_version, '5.5.4', '<' ) ) {
						if ( ! wp_script_is( 'jquery-ui-widget', 'done' ) ) {
							print '<script type="text/javascript" src="' . esc_attr( $includes_url ) . 'js/jquery/ui/' . esc_attr( $prefix_ui ) . 'widget.min.js"></script>'; // phpcs:ignore WordPress.WP.EnqueuedResources
						}
						if ( ! wp_script_is( 'jquery-ui-position', 'done' ) ) {
							print '<script type="text/javascript" src="' . esc_attr( $includes_url ) . 'js/jquery/ui/' . esc_attr( $prefix_ui ) . 'position.min.js"></script>'; // phpcs:ignore WordPress.WP.EnqueuedResources
						}
					}

					if ( ! wp_script_is( 'jquery-ui-tooltip', 'done' ) ) {
						print '<script type="text/javascript" src="' . esc_attr( $includes_url ) . 'js/jquery/ui/' . esc_attr( $prefix_ui ) . 'tooltip.min.js"></script>'; // phpcs:ignore WordPress.WP.EnqueuedResources
					}
					if ( ! wp_script_is( 'jquery-ui-mouse', 'done' ) ) {
						print '<script type="text/javascript" src="' . esc_attr( $includes_url ) . 'js/jquery/ui/' . esc_attr( $prefix_ui ) . 'mouse.min.js"></script>'; // phpcs:ignore WordPress.WP.EnqueuedResources
					}
					if ( ! wp_script_is( 'jquery-ui-slider', 'done' ) ) {
						print '<script type="text/javascript" src="' . esc_attr( $includes_url ) . 'js/jquery/ui/' . esc_attr( $prefix_ui ) . 'slider.min.js"></script>'; // phpcs:ignore WordPress.WP.EnqueuedResources
					}
					?>
					<script type='text/javascript'> if( typeof fbuilderjQuery == 'undefined' && typeof jQuery != 'undefined' ) fbuilderjQuery = jQuery;</script>
					<script type='text/javascript' src='<?php echo esc_attr( plugins_url( 'vendors/jquery.validate.js', CP_CALCULATEDFIELDSF_MAIN_FILE_PATH ) ); // phpcs:ignore WordPress.WP.EnqueuedResources ?>'></script>
					<script type='text/javascript' src='<?php echo esc_attr( $public_js_path . ( ( strpos( $public_js_path, '?' ) == false ) ? '?' : '&' ) . 'ver=' . CP_CALCULATEDFIELDSF_VERSION ); // phpcs:ignore WordPress.WP.EnqueuedResources ?>'></script>
					<?php
				}
				?>
				<pre style="display:none !important;"><script type='text/javascript'><?php
					print 'cp_calculatedfieldsf_fbuilder_config_' . esc_js( self::$form_counter ) . '={"obj":' . $config_json . '};'; // phpcs:ignore WordPress.Security.EscapeOutput
				?></script></pre>
				<?php
			}
		} // End _public_resources.

		/** TROUBLESHOOTS SECTION **/
		public function compatibility_warnings() {
			require_once CP_CALCULATEDFIELDSF_BASE_PATH . '/inc/cpcff_compatibility.inc.php';
			return CPCFF_COMPATIBILITY::warnings();
		} // End compatibility_warnings.

		private function troubleshoots() {
			if ( ! $this->_is_admin ) {
				if ( get_option( 'CP_CALCULATEDFIELDSF_OPTIMIZATION_PLUGIN', CP_CALCULATEDFIELDSF_OPTIMIZATION_PLUGIN ) * 1 ) {
					// Solves a conflict caused by the "Speed Booster Pack" plugin.
					add_filter( 'option_sbp_settings', 'CPCFF_MAIN::speed_booster_pack_troubleshoot' );

					// Solves a conflict caused by the "Autoptimize" plugin.
					if ( class_exists( 'autoptimizeOptionWrapper' ) ) {
						$GLOBALS['CP_CALCULATEDFIELDSF_DEFAULT_DEFER_SCRIPTS_LOADING'] = true;
						add_filter(
							'cpcff_pre_form',
							function ( $atts ) {
								add_filter(
									'autoptimize_js_include_inline',
									function ( $p ) {
										return false;
									}
								);
								add_filter(
									'autoptimize_filter_js_noptimize',
									function ( $p1, $p2 ) {
										return true;
									},
									10,
									2
								);
								add_filter(
									'autoptimize_filter_html_noptimize',
									function ( $p1, $p2 ) {
										return true;
									},
									10,
									2
								);
								return $atts;
							}
						);
					}

					// Solves conflicts with "LiteSpeed Cache" plugin.
					if ( function_exists( 'run_litespeed_cache' ) ) {
						add_action( 'the_post', 'CPCFF_MAIN::litespeed_control_set_nocache' );
						add_filter( 'litespeed_optimize_js_excludes', 'CPCFF_MAIN::rocket_exclude_js' );
					}

					// Solves a conflict caused by the "WP Rocket" plugin.
					add_filter( 'rocket_exclude_js', 'CPCFF_MAIN::rocket_exclude_js' );
					add_filter( 'rocket_exclude_defer_js', 'CPCFF_MAIN::rocket_exclude_js' );
					add_filter( 'rocket_delay_js_exclusions', 'CPCFF_MAIN::rocket_exclude_js' );

					// Some "WP Rocket" functions can be use with "WP-Optimize".
					add_filter( 'wp-optimize-minify-blacklist', 'CPCFF_MAIN::rocket_exclude_js' );
					add_filter( 'wp-optimize-minify-default-exclusions', 'CPCFF_MAIN::rocket_exclude_js' );
				}
				add_filter( 'rocket_excluded_inline_js_content', 'CPCFF_MAIN::rocket_exclude_inline_js' );
				add_filter( 'rocket_defer_inline_exclusions', 'CPCFF_MAIN::rocket_exclude_inline_js' );
				add_filter( 'rocket_delay_js_exclusions', 'CPCFF_MAIN::rocket_exclude_inline_js' );

				// For Breeze conflicts.
				if ( defined( 'BREEZE_VERSION' ) ) {
					add_filter( 'breeze_filter_html_before_minify', 'CPCFF_MAIN::breeze_check_content', 10 );
					add_filter( 'breeze_html_after_minify', 'CPCFF_MAIN::breeze_return_content', 10 );
				}
			}
		} // End troubleshoots.

		public static function litespeed_control_set_nocache( &$post ) {
			try {
				if (
					is_object( $post ) &&
					isset( $post->post_content ) &&
					stripos( $post->post_content, '[CP_CALCULATED_FIELDS' ) !== false
				) {
					do_action( 'litespeed_control_set_nocache', 'nocache CFF Form' );
				}
			} catch ( Exception $err ) {
				error_log( $err->getMessage() );}
			return $post;
		} // End litespeed_control_set_nocache.

		public static function speed_booster_pack_troubleshoot( $option ) {
			if ( is_array( $option ) && isset( $option['jquery_to_footer'] ) ) {
				unset( $option['jquery_to_footer'] );
			}
			return $option;
		} // End speed_booster_pack_troubleshoot.

		public static function rocket_exclude_js( $excluded_js ) {
			$excluded_js[] = '/jquery.js';
			$excluded_js[] = '/jquery.min.js';
			$excluded_js[] = '/jquery/';
			$excluded_js[] = '/calculated-fields-form/';

			$excluded_js[] = '/jquery/(.*)';
			$excluded_js[] = '(.*)/jquery.js';
			$excluded_js[] = '(.*)/jquery.min.js';
			$excluded_js[] = '(.*)/jquery/(.*)';
			$excluded_js[] = '(.*)/calculated-fields-form/(.*)';
			return $excluded_js;
		} // End rocket_exclude_js.

		public static function rocket_exclude_inline_js( $excluded_js = array() ) {
			$excluded_js[] = 'form_structure_';
			$excluded_js[] = 'fbuilderjQuery';
			$excluded_js[] = 'fbuilderjQuery(.*)';
			$excluded_js[] = '(.*)fbuilderjQuery(.*)';
			$excluded_js[] = 'doValidate_';
			$excluded_js[] = 'cpcff_default';
			$excluded_js[] = 'cp_calculatedfieldsf_fbuilder_config_';
			$excluded_js[] = 'form_structure(.*)';
			$excluded_js[] = 'doValidate(.*)';
			$excluded_js[] = 'cp_calculatedfieldsf_fbuilder_config(.*)';
			return $excluded_js;
		} // End rocket_exclude_inline_js.

		public static function breeze_check_content( $content ) {
			if ( strpos( $content, 'form_structure_' ) !== false || strpos( $content, 'cp_calculatedfieldsf_fbuilder_config_' ) !== false ) {
				global $cff_breeze_content_bk;
				$cff_breeze_content_bk = $content;
			}
			return $content;
		} // End breeze_check_content.

		public static function breeze_return_content( $content ) {
			global $cff_breeze_content_bk;
			if ( ! empty( $cff_breeze_content_bk ) ) {
				$content = $cff_breeze_content_bk;
				unset( $cff_breeze_content_bk );
			}
			return $content;
		} // End breeze_return_content.
	} // End CPCFF_MAIN.
}