<?php
/**
 * Add an element to fusion-builder.
 *
 * @package fusion-builder
 * @since 2.2
 */

if ( fusion_is_element_enabled( 'fusion_tb_related' ) ) {

	if ( ! class_exists( 'FusionTB_Related' ) ) {
		/**
		 * Shortcode class.
		 *
		 * @since 2.2
		 */
		class FusionTB_Related extends Fusion_Component {

			/**
			 * $fusion_settings object.
			 *
			 * @access protected
			 * @since 2.2
			 * @var object
			 */
			protected $fusion_settings = null;

			/**
			 * The internal container counter.
			 *
			 * @access private
			 * @since 2.2
			 * @var int
			 */
			private $counter = 1;

			/**
			 * Target post's post type.
			 *
			 * @access protected
			 * @since 2.2
			 * @var string
			 */
			protected $post_type;

			/**
			 * Constructor.
			 *
			 * @access public
			 * @since 2.2
			 */
			public function __construct() {
				parent::__construct( 'fusion_tb_related' );
				add_filter( 'fusion_attr_fusion_tb_related-shortcode', [ $this, 'attr' ] );

				$this->fusion_settings = awb_get_fusion_settings();

				add_filter( 'fusion_attr_related-component-carousel', [ $this, 'carousel_attr' ] );

				// Ajax mechanism for query related part.
				add_action( 'wp_ajax_get_fusion_related_posts', [ $this, 'ajax_query' ] );
			}


			/**
			 * Check if component should render
			 *
			 * @access public
			 * @since 2.2
			 * @return boolean
			 */
			public function should_render() {
				return is_singular() || wp_is_json_request();
			}

			/**
			 * Gets the default values.
			 *
			 * @static
			 * @access public
			 * @since 2.2
			 * @return array
			 */
			public static function get_element_defaults() {
				$fusion_settings = awb_get_fusion_settings();
				return [
					'number_related_posts'         => $fusion_settings->get( 'number_related_posts' ),
					'related_posts_image_size'     => $fusion_settings->get( 'related_posts_image_size' ),
					'related_posts_columns'        => $fusion_settings->get( 'related_posts_columns' ),
					'related_posts_layout'         => $fusion_settings->get( 'related_posts_layout' ),
					'related_posts_navigation'     => $fusion_settings->get( 'related_posts_navigation' ),
					'related_posts_autoplay'       => $fusion_settings->get( 'related_posts_autoplay' ),
					'related_posts_swipe'          => $fusion_settings->get( 'related_posts_swipe' ),
					'related_posts_column_spacing' => $fusion_settings->get( 'related_posts_column_spacing' ),
					'related_posts_swipe_items'    => $fusion_settings->get( 'related_posts_swipe_items' ),
					'heading_enable'               => 'yes',
					'heading_size'                 => '3',
					'margin_bottom'                => '',
					'margin_left'                  => '',
					'margin_right'                 => '',
					'margin_top'                   => '',
					'hide_on_mobile'               => fusion_builder_default_visibility( 'string' ),
					'class'                        => '',
					'id'                           => '',
					'animation_type'               => '',
					'animation_direction'          => 'down',
					'animation_speed'              => '0.1',
					'animation_delay'              => '',
					'animation_offset'             => $fusion_settings->get( 'animation_offset' ),
					'animation_color'              => '',
				];
			}

			/**
			 * Maps settings to param variables.
			 *
			 * @static
			 * @access public
			 * @since 2.2
			 * @return array
			 */
			public static function settings_to_params() {
				return [
					'number_related_posts'         => 'number_related_posts',
					'related_posts_image_size'     => 'related_posts_image_size',
					'related_posts_columns'        => 'related_posts_columns',
					'related_posts_navigation'     => 'related_posts_navigation',
					'related_posts_autoplay'       => 'related_posts_autoplay',
					'related_posts_swipe'          => 'related_posts_swipe',
					'related_posts_column_spacing' => 'related_posts_column_spacing',
					'related_posts_swipe_items'    => 'related_posts_swipe_items',
					'animation_offset'             => 'animation_offset',
				];
			}

			/**
			 * Used to set any other variables for use on front-end editor template.
			 *
			 * @static
			 * @access public
			 * @since 2.2
			 * @return array
			 */
			public static function get_element_extras() {
				$fusion_settings = awb_get_fusion_settings();
				return [
					'title_margin'       => $fusion_settings->get( 'title_margin' ),
					'title_border_color' => $fusion_settings->get( 'title_border_color' ),
					'title_style_type'   => $fusion_settings->get( 'title_style_type' ),
					'content_width'      => apply_filters( 'fusion_library_content_width', 1170 ),
				];
			}

			/**
			 * Maps settings to extra variables.
			 *
			 * @static
			 * @access public
			 * @since 2.2
			 * @return array
			 */
			public static function settings_to_extras() {

				return [
					'title_margin'       => 'title_margin',
					'title_border_color' => 'title_border_color',
					'title_style_type'   => 'title_style_type',
				];
			}

			/**
			 * Gets the query data.
			 *
			 * @access public
			 * @since 2.2
			 * @return void
			 */
			public function ajax_query() {
				check_ajax_referer( 'fusion_load_nonce', 'fusion_load_nonce' );

				if ( isset( $_POST['model'] ) && isset( $_POST['model']['params'] ) && ! apply_filters( 'fusion_builder_live_request', false ) ) { // phpcs:ignore WordPress.Security.NonceVerification
					$defaults = $_POST['model']['params']; // phpcs:ignore WordPress.Security
					fusion_set_live_data();
					add_filter( 'fusion_builder_live_request', '__return_true' );

					$this->emulate_post();

					$this->post_type = get_post_type( $this->get_target_post() );

					$fusion_query = $this->query( $defaults );

					$this->restore_post();

					// Build live query response.
					$return_data = [];

					// There are no related posts, return placeholder.
					if ( ! $fusion_query->have_posts() ) {
						echo wp_json_encode( $return_data );
						wp_die();
					}

					/**
					 * Get the correct image size.
					 */
					$featured_image_size = ( 'cropped' === $defaults['related_posts_image_size'] ) ? 'fixed' : 'full';
					$data_image_size     = ( 'cropped' === $defaults['related_posts_image_size'] ) ? 'fixed' : 'auto';

					/**
					 * Loop through related posts.
					 */
					while ( $fusion_query->have_posts() ) :
						$fusion_query->the_post();

						$post_id = get_the_ID(); // phpcs:ignore WordPress.WP.GlobalVariablesOverride
						// $content .= '<li class="fusion-carousel-item"' . $carousel_item_css . ' >'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped

						$display_post_title = 'title_on_rollover' === $defaults['related_posts_layout'] ? 'default' : 'disable';

						if ( 'auto' === $data_image_size ) {
							fusion_library()->images->set_grid_image_meta(
								[
									'layout'  => 'related-posts',
									'columns' => $defaults['related_posts_columns'],
								]
							);
						}

						fusion_library()->images->set_grid_image_meta( [] );

						ob_start();
						comments_popup_link( __( '0 Comments', 'fusion-builder' ), __( '1 Comment', 'fusion-builder' ), __( '% Comments', 'fusion-builder' ) );
						$comments = ob_get_clean();

						$date_format = $this->fusion_settings->get( 'date_format' );
						$date_format = $date_format ? $date_format : get_option( 'date_format' );

						$return_data['related_items'][] = [
							'featured_image' => fusion_render_first_featured_image_markup( $post_id, $featured_image_size, get_permalink( $post_id ), true, false, false, 'disable', $display_post_title, 'related' ),
							'link'           => esc_url_raw( get_permalink( get_the_ID() ) ),
							'title_attr'     => esc_attr( get_the_title() ),
							'title'          => get_the_title(),
							'date'           => get_the_time( $date_format, $post_id ),
							'comments_open'  => comments_open( $post_id ),
							'comments'       => $comments,
						];
					endwhile;

					wp_reset_postdata();

					echo wp_json_encode( $return_data );
					wp_die();
				}
			}

			/**
			 * WIP: Gets the query data.
			 *
			 * @access public
			 * @since 2.0.0
			 * @param array $defaults The default args.
			 * @return object
			 */
			public function query( $defaults ) {

				// Return if there's a query override.
				$query_override = apply_filters( 'fusion_blog_shortcode_query_override', null, $defaults );

				if ( $query_override ) {
					return $query_override;
				}

				$number_related_posts = $defaults['number_related_posts'];
				$number_related_posts = ( '0' == $number_related_posts ) ? '-1' : $number_related_posts; // phpcs:ignore Universal.Operators.StrictComparisons

				$fusion_query = 'post' === $this->post_type
								? $this->get_related_posts( get_the_ID(), $number_related_posts )
								: $this->get_custom_posttype_related_posts( get_the_ID(), $number_related_posts, $this->post_type );

				return $fusion_query;
			}

			/**
			 * Render the shortcode
			 *
			 * @access public
			 * @since 2.2
			 * @param  array  $args    Shortcode parameters.
			 * @param  string $content Content between shortcode.
			 * @return string          HTML output.
			 */
			public function render( $args, $content = '' ) {

				// Set defaults.
				$this->defaults = self::get_element_defaults();
				$this->args     = FusionBuilder::set_shortcode_defaults( $this->defaults, $args, 'fusion_tb_related' );

				// Validate and normalize args.
				$this->validate_args();

				$this->emulate_post();

				$this->post_type = get_post_type( $this->get_target_post() );

				// Set the needed variables according to post type.
				$main_heading = esc_html__( 'Related Posts', 'fusion-builder' );

				if ( 'avada_portfolio' === $this->post_type ) {
					$main_heading = esc_html__( 'Related Projects', 'fusion-builder' );
				} elseif ( 'avada_faq' === $this->post_type ) {
					$main_heading = esc_html__( 'Related Faqs', 'fusion-builder' );
				}

				$fusion_query = $this->query( $this->args );

				// If there are related posts, display them.
				if ( isset( $fusion_query ) && $fusion_query->have_posts() ) {

					$content .= '<section ' . FusionBuilder::attributes( 'fusion_tb_related-shortcode' ) . '>';

					if ( 'yes' === $this->args['heading_enable'] ) {
						$content .= fusion_render_title( $this->args['heading_size'], apply_filters( 'fusion_related_posts_heading_text', $main_heading, $this->post_type ) );
					}

					/**
					 * Get the correct image size.
					 */
					$featured_image_size = ( 'cropped' === $this->args['related_posts_image_size'] ) ? 'fixed' : 'full';
					$data_image_size     = ( 'cropped' === $this->args['related_posts_image_size'] ) ? 'fixed' : 'auto';
					$carousel_item_css   = '';

					if ( count( $fusion_query->posts ) < $this->args['related_posts_columns'] ) {
						$carousel_item_css = ( apply_filters( 'fusion_library_content_width', 1170 ) - intval( $this->args['related_posts_column_spacing'] ) * ( intval( $this->args['related_posts_columns'] ) - 1 ) ) / intval( $this->args['related_posts_columns'] );
						$carousel_item_css = ' style="max-width: ' . esc_attr( $carousel_item_css ) . 'px;"';
					}

					$content .= '<div ' . FusionBuilder::attributes( 'related-component-carousel' ) . '>';
					$content .= '<div class="swiper-wrapper">';

					/**
					 * Loop through related posts.
					 */
					while ( $fusion_query->have_posts() ) :
						$fusion_query->the_post();
						$post_id  = get_the_ID(); // phpcs:ignore WordPress.WP.GlobalVariablesOverride
						$content .= '<div class="swiper-slide"' . $carousel_item_css . ' >'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
						$content .= '<div class="fusion-carousel-item-wrapper">';

						$display_post_title = 'title_on_rollover' === $this->args['related_posts_layout'] ? 'default' : 'disable';

						if ( 'auto' === $data_image_size ) {
							fusion_library()->images->set_grid_image_meta(
								[
									'layout'  => 'related-posts',
									'columns' => $this->args['related_posts_columns'],
								]
							);
						}

						$content .= fusion_render_first_featured_image_markup( $post_id, $featured_image_size, get_permalink( $post_id ), true, false, false, 'disable', $display_post_title, 'related' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped

						fusion_library()->images->set_grid_image_meta( [] );
						if ( 'title_below_image' === $this->args['related_posts_layout'] ) { // Title on rollover layout.

							/**
							 * Get the post title.
							 */

							$content .= '<h4 class="fusion-carousel-title">';
							$content .= '<a class="fusion-related-posts-title-link" href="' . esc_url_raw( get_permalink( get_the_ID() ) ) . '" target="_self" title="' . esc_attr( get_the_title() ) . '">' . get_the_title() . '</a>';
							$content .= '</h4>';

							$content .= '<div class="fusion-carousel-meta">';

							$date_format = Avada()->settings->get( 'date_format' );
							$date_format = $date_format ? $date_format : get_option( 'date_format' );

							$content .= '<span class="fusion-date">' . esc_attr( get_the_time( $date_format, $post_id ) ) . '</span>';

							if ( comments_open( $post_id ) ) {
								$content .= '<span class="fusion-inline-sep">|</span>';
								$content .= '<span>';
								ob_start();
								comments_popup_link( __( '0 Comments', 'fusion-builder' ), __( '1 Comment', 'fusion-builder' ), __( '% Comments', 'fusion-builder' ) );
								$content .= ob_get_clean();
								$content .= '</span>';
							}
							$content .= '</div><!-- fusion-carousel-meta -->';
						}

							$content .= '</div><!-- fusion-carousel-item-wrapper -->';
							$content .= '</div>';
					endwhile;
					$content .= '</div><!-- swiper-wrapper -->';

					/**
					 * Add navigation if needed.
					 */
					if ( true === $this->args['related_posts_navigation'] ) {
						$content .= awb_get_carousel_nav();
					}

					$content .= '</div><!-- fusion-carousel -->';
					$content .= '</section><!-- related-posts -->';

					wp_reset_postdata();

				} elseif ( isset( $_POST['action'] ) && 'get_shortcode_render' === $_POST['action'] ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing

					// Add preview for Live Builder.
					$content .= $this->get_placeholder();
				} elseif ( fusion_is_preview_frame() ) {
					$content .= '';
				}

				$this->restore_post();

				$this->counter++;

				$this->on_render();

				return apply_filters( 'fusion_component_' . $this->shortcode_handle . '_content', $content, $args );
			}

			/**
			 * Validates args.
			 *
			 * @since 2.2
			 */
			protected function validate_args() {
				$this->args['related_posts_navigation'] = ( 'yes' === $this->args['related_posts_navigation'] || '1' === $this->args['related_posts_navigation'] ) ? true : false;
				$this->args['related_posts_autoplay']   = ( 'yes' === $this->args['related_posts_autoplay'] || '1' === $this->args['related_posts_autoplay'] ) ? true : false;
				$this->args['related_posts_swipe']      = ( 'yes' === $this->args['related_posts_swipe'] || '1' === $this->args['related_posts_swipe'] ) ? true : false;
			}

			/**
			 * Builds the attributes array.
			 *
			 * @access public
			 * @since 2.2
			 * @return array
			 */
			public function attr() {
				$attr = [
					'class' => 'related-posts single-related-posts fusion-related-tb fusion-related-tb-' . $this->counter,
					'style' => '',
				];

				$attr = fusion_builder_visibility_atts( $this->args['hide_on_mobile'], $attr );

				if ( $this->args['animation_type'] ) {
					$attr = Fusion_Builder_Animation_Helper::add_animation_attributes( $this->args, $attr );
				}

				$attr['style'] .= Fusion_Builder_Margin_Helper::get_margins_style( $this->args );

				if ( $this->args['class'] ) {
					$attr['class'] .= ' ' . $this->args['class'];
				}

				if ( $this->args['id'] ) {
					$attr['id'] = $this->args['id'];
				}

				return $attr;
			}

			/**
			 * Get related posts by category
			 *
			 * @param  integer $post_id      Current post id.
			 * @param  integer $number_posts Number of posts to fetch.
			 * @return object                Object with posts info.
			 */
			protected function get_related_posts( $post_id, $number_posts = -1 ) {

				$args = '';

				$number_posts = (int) $number_posts;
				if ( 0 === $number_posts ) {
					$query = new WP_Query();
					return $query;
				}

				$args = wp_parse_args(
					$args,
					apply_filters(
						'fusion_related_posts_query_args',
						[
							'category__in'        => wp_get_post_categories( $post_id ),
							'ignore_sticky_posts' => 0,
							'posts_per_page'      => $number_posts,
							'post__not_in'        => [ $post_id ],
							'post_status'         => 'publish',
						]
					)
				);

				// If placeholder images are disabled,
				// add the _thumbnail_id meta key to the query to only retrieve posts with featured images.
				if ( ! $this->fusion_settings->get( 'featured_image_placeholder' ) ) {
					$args['meta_key'] = '_thumbnail_id'; // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
				}

				return fusion_cached_query( $args );
			}

			/**
			 * Get related posts by a custom post type category taxonomy.
			 *
			 * @param  integer $post_id      Current post id.
			 * @param  integer $number_posts Number of posts to fetch.
			 * @param  string  $post_type    The custom post type that should be used.
			 * @return object                Object with posts info.
			 */
			protected function get_custom_posttype_related_posts( $post_id, $number_posts = 8, $post_type = 'avada_portfolio' ) {

				$query = new WP_Query();

				$args = '';

				$number_posts = (int) $number_posts;
				if ( 0 === $number_posts || ! $number_posts ) {
					return $query;
				}

				$post_type = str_replace( 'avada_', '', $post_type );

				$item_cats = get_the_terms( $post_id, $post_type . '_category' );

				$item_array = [];
				if ( $item_cats && ! is_wp_error( $item_cats ) ) {
					foreach ( $item_cats as $item_cat ) {
						$item_array[] = $item_cat->term_id;
					}
				}

				if ( ! empty( $item_array ) ) {
					$args = wp_parse_args(
						$args,
						apply_filters(
							'fusion_related_posts_query_args',
							[
								'ignore_sticky_posts' => 0,
								'posts_per_page'      => $number_posts,
								'post__not_in'        => [ $post_id ],
								'post_type'           => 'avada_' . $post_type,
								'post_status'         => 'publish',
								'tax_query'           => [ // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_tax_query
									[
										'field'    => 'id',
										'taxonomy' => $post_type . '_category',
										'terms'    => $item_array,
									],
								],
							]
						)
					);

					// If placeholder images are disabled, add the _thumbnail_id meta key to the query to only retrieve posts with featured images.
					if ( ! $this->fusion_settings->get( 'featured_image_placeholder' ) ) {
						$args['meta_key'] = '_thumbnail_id'; // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
					}

					$query = fusion_cached_query( apply_filters( 'fusion_related_posts_args', $args ) );

				}

				return $query;
			}

			/**
			 * Builds the carousel wrapper attributes array.
			 *
			 * @access public
			 * @since 2.2
			 * @return array
			 */
			public function carousel_attr() {

				$attr['class'] = 'awb-carousel awb-swiper awb-swiper-carousel';
				$attr['style'] = $this->get_carousel_style_variables();
				if ( 'title_below_image' === $this->args['related_posts_layout'] ) {
					$attr['class'] .= ' fusion-carousel-title-below-image';
				}

				$attr['data-imagesize'] = ( 'cropped' === $this->args['related_posts_image_size'] ) ? 'fixed' : 'auto';

				/**
				 * Set the meta content variable.
				 */
				$attr['data-metacontent'] = ( 'title_on_rollover' === $this->args['related_posts_layout'] ) ? 'no' : 'yes';

				/**
				 * Set the autoplay variable.
				 */
				$attr['data-autoplay'] = ( $this->args['related_posts_autoplay'] ) ? 'yes' : 'no';

				/**
				 * Set the touch scroll variable.
				 */
				$attr['data-touchscroll'] = ( $this->args['related_posts_swipe'] ) ? 'yes' : 'no';

				$attr['data-columns']     = $this->args['related_posts_columns'];
				$attr['data-itemmargin']  = intval( $this->args['related_posts_column_spacing'] ) . 'px';
				$attr['data-itemwidth']   = 180;
				$attr['data-touchscroll'] = 'yes';

				$related_posts_swipe_items = $this->args['related_posts_swipe_items'];
				$related_posts_swipe_items = ( 0 == $related_posts_swipe_items ) ? '' : $related_posts_swipe_items; // phpcs:ignore Universal.Operators.StrictComparisons
				$attr['data-scrollitems']  = $related_posts_swipe_items;

				return $attr;
			}

			/**
			 * Get 'no related posts' placeholder.
			 *
			 * @since 2.2
			 * @return string
			 */
			protected function get_placeholder() {
				return '<div class="fusion-builder-placeholder">' . esc_html__( 'There are no related posts.', 'fusion-builder' ) . '</div>';
			}

			/**
			 * Sets the necessary scripts.
			 *
			 * @access public
			 * @since 3.2
			 * @return void
			 */
			public function on_first_render() {
				Fusion_Dynamic_JS::enqueue_script( 'fusion-lightbox' );
				Fusion_Dynamic_JS::enqueue_script( 'awb-carousel' );
			}

			/**
			 * Get the carousel style variables.
			 *
			 * @access protected
			 * @since 3.9
			 * @return string
			 */
			public function get_carousel_style_variables() {
				$custom_vars = [];
				if ( ! $this->is_default( 'related_posts_columns' ) ) {
					$custom_vars['columns'] = $this->args['related_posts_columns'];
				}
				if ( ! $this->is_default( 'related_posts_column_spacing' ) ) {
					$custom_vars['column_spacing'] = fusion_library()->sanitize->get_value_with_unit( $this->args['related_posts_column_spacing'] );
				}

				return $this->get_custom_css_vars( $custom_vars );
			}

			/**
			 * Load base CSS.
			 *
			 * @access public
			 * @since 3.0
			 * @return void
			 */
			public function add_css_files() {
				FusionBuilder()->add_element_css( FUSION_BUILDER_PLUGIN_DIR . 'assets/css/components/related.min.css' );
				FusionBuilder()->add_element_css( FUSION_BUILDER_PLUGIN_DIR . 'assets/css/shortcodes/image-carousel.min.css' );
			}
		}

	}

	new FusionTB_Related();
}

/**
 * Map shortcode to Avada Builder
 *
 * @since 2.2
 */
function fusion_component_related() {
	$fusion_settings = awb_get_fusion_settings();

	fusion_builder_map(
		fusion_builder_frontend_data(
			'FusionTB_Related',
			[
				'name'      => esc_html__( 'Related Posts', 'fusion-builder' ),
				'shortcode' => 'fusion_tb_related',
				'icon'      => 'fusiona-related-posts',
				'component' => true,
				'templates' => [ 'content' ],
				'callback'  => [
					'function' => 'fusion_ajax',
					'action'   => 'get_fusion_related_posts',
					'ajax'     => true,
				],
				'params'    => [
					[
						'heading'     => esc_html__( 'Layout', 'fusion-builder' ),
						'description' => esc_html__( 'Controls the layout style for related posts and related projects.', 'fusion-builder' ),
						'param_name'  => 'related_posts_layout',
						'default'     => 'title_on_rollover',
						'type'        => 'select',
						'value'       => [
							'title_on_rollover' => esc_html__( 'Title on rollover', 'fusion-builder' ),
							'title_below_image' => esc_html__( 'Title below image', 'fusion-builder' ),
						],
					],
					[
						'heading'     => esc_html__( 'Number of Related Posts', 'fusion-builder' ),
						'description' => esc_html__( 'Controls the number of related posts and projects that display on a single post.', 'fusion-builder' ),
						'param_name'  => 'number_related_posts',
						'value'       => '',
						'default'     => $fusion_settings->get( 'number_related_posts' ),
						'type'        => 'range',
						'min'         => '0',
						'max'         => '30',
						'step'        => '1',
						'callback'    => [
							'function' => 'fusion_ajax',
							'action'   => 'get_fusion_related_posts',
							'ajax'     => true,
						],
					],
					[
						'heading'     => esc_html__( 'Maximum Columns', 'fusion-builder' ),
						'description' => esc_html__( 'Controls the number of columns for the related posts and projects layout.', 'fusion-builder' ),
						'param_name'  => 'related_posts_columns',
						'value'       => '',
						'default'     => $fusion_settings->get( 'related_posts_columns' ),
						'type'        => 'range',
						'min'         => '1',
						'max'         => '6',
						'step'        => '1',
					],
					[
						'heading'     => esc_html__( 'Column Spacing', 'fusion-builder' ),
						'description' => esc_html__( 'Controls the amount of spacing between columns for the related posts.', 'fusion-builder' ),
						'param_name'  => 'related_posts_column_spacing',
						'value'       => '',
						'default'     => $fusion_settings->get( 'related_posts_column_spacing' ),
						'type'        => 'range',
						'min'         => '0',
						'step'        => '1',
						'max'         => '300',
					],
					[
						'heading'     => esc_html__( 'Image Size', 'fusion-builder' ),
						'description' => esc_html__( 'Controls if the featured image size is fixed (cropped) or auto (full image ratio) for related posts. IMPORTANT: Fixed works best with a standard 940px site width. Auto works best with larger site widths.', 'fusion-builder' ),
						'param_name'  => 'related_posts_image_size',
						'default'     => '',
						'type'        => 'radio_button_set',
						'value'       => [
							''        => esc_html__( 'Default', 'fusion-builder' ),
							'cropped' => esc_html__( 'Fixed', 'fusion-builder' ),
							'full'    => esc_html__( 'Auto', 'fusion-builder' ),
						],
						'callback'    => [
							'function' => 'fusion_ajax',
							'action'   => 'get_fusion_related_posts',
							'ajax'     => true,
						],
					],
					[
						'heading'     => esc_html__( 'Autoplay', 'fusion-builder' ),
						'description' => esc_html__( 'Turn on to autoplay the related posts carousel.', 'fusion-builder' ),
						'param_name'  => 'related_posts_autoplay',
						'default'     => '',
						'type'        => 'radio_button_set',
						'value'       => [
							''    => esc_html__( 'Default', 'fusion-builder' ),
							'yes' => esc_html__( 'Yes', 'fusion-builder' ),
							'not' => esc_html__( 'No', 'fusion-builder' ),
						],
					],
					[
						'heading'     => esc_html__( 'Show Navigation', 'fusion-builder' ),
						'description' => esc_html__( 'Turn on to display navigation arrows on the carousel.', 'fusion-builder' ),
						'param_name'  => 'related_posts_navigation',
						'default'     => '',
						'type'        => 'radio_button_set',
						'value'       => [
							''    => esc_html__( 'Default', 'fusion-builder' ),
							'yes' => esc_html__( 'Yes', 'fusion-builder' ),
							'not' => esc_html__( 'No', 'fusion-builder' ),
						],
					],
					[
						'heading'     => esc_html__( 'Mouse Scroll', 'fusion-builder' ),
						'description' => esc_html__( 'Turn on to enable mouse drag control on the carousel.', 'fusion-builder' ),
						'param_name'  => 'related_posts_swipe',
						'default'     => '',
						'type'        => 'radio_button_set',
						'value'       => [
							''    => esc_html__( 'Default', 'fusion-builder' ),
							'yes' => esc_html__( 'Yes', 'fusion-builder' ),
							'not' => esc_html__( 'No', 'fusion-builder' ),
						],
					],
					[
						'heading'     => esc_html__( 'Scroll Items', 'fusion-builder' ),
						'description' => esc_html__( 'Controls the number of items that scroll at one time. Set to 0 to scroll the number of visible items.', 'fusion-builder' ),
						'param_name'  => 'related_posts_swipe_items',
						'value'       => '',
						'default'     => $fusion_settings->get( 'related_posts_swipe_items' ),
						'type'        => 'range',
						'min'         => '0',
						'max'         => '15',
						'step'        => '1',
					],
					[
						'type'        => 'checkbox_button_set',
						'heading'     => esc_html__( 'Element Visibility', 'fusion-builder' ),
						'param_name'  => 'hide_on_mobile',
						'value'       => fusion_builder_visibility_options( 'full' ),
						'default'     => fusion_builder_default_visibility( 'array' ),
						'description' => esc_html__( 'Choose to show or hide the element on small, medium or large screens. You can choose more than one at a time.', 'fusion-builder' ),
					],
					[
						'type'        => 'textfield',
						'heading'     => esc_html__( 'CSS Class', 'fusion-builder' ),
						'description' => esc_html__( 'Add a class to the wrapping HTML element.', 'fusion-builder' ),
						'param_name'  => 'class',
						'value'       => '',
					],
					[
						'type'        => 'textfield',
						'heading'     => esc_html__( 'CSS ID', 'fusion-builder' ),
						'description' => esc_html__( 'Add an ID to the wrapping HTML element.', 'fusion-builder' ),
						'param_name'  => 'id',
						'value'       => '',
					],
					[
						'type'        => 'radio_button_set',
						'heading'     => esc_html__( 'Enable Heading', 'fusion-builder' ),
						'description' => esc_html__( 'Turn on if you want to display default heading.', 'fusion-builder' ),
						'param_name'  => 'heading_enable',
						'default'     => 'yes',
						'value'       => [
							'yes' => esc_html__( 'Yes', 'fusion-builder' ),
							'no'  => esc_html__( 'No', 'fusion-builder' ),
						],
						'group'       => esc_html__( 'Design', 'fusion-builder' ),
					],
					[
						'type'        => 'radio_button_set',
						'heading'     => esc_attr__( 'HTML Heading Tag', 'fusion-builder' ),
						'description' => esc_attr__( 'Choose HTML tag of the heading, either div, p or the heading tag, h1-h6.', 'fusion-builder' ),
						'param_name'  => 'heading_size',
						'value'       => [
							'1'   => 'H1',
							'2'   => 'H2',
							'3'   => 'H3',
							'4'   => 'H4',
							'5'   => 'H5',
							'6'   => 'H6',
							'div' => 'DIV',
							'p'   => 'P',
						],
						'default'     => '3',
						'group'       => esc_html__( 'Design', 'fusion-builder' ),
						'dependency'  => [
							[
								'element'  => 'heading_enable',
								'value'    => 'no',
								'operator' => '!=',
							],
						],
					],
					'fusion_margin_placeholder'    => [
						'param_name' => 'margin',
						'value'      => [
							'margin_top'    => '',
							'margin_right'  => '',
							'margin_bottom' => '',
							'margin_left'   => '',
						],
					],
					'fusion_animation_placeholder' => [
						'preview_selector' => '.fusion-related-tb',
					],
				],
			]
		)
	);
}
add_action( 'fusion_builder_before_init', 'fusion_component_related' );
