<?php
/**
 * @author      Elicus Technologies <hello@elicus.com>
 * @link        https://www.elicus.com/
 * @copyright   2020 Elicus Technologies Private Limited
 * @version     2.4.0
 */

defined( 'ABSPATH' ) || die( 'No script kiddies please!' );

if ( ! class_exists( 'El_Blog_Settings' ) ) {

	class El_Blog_Settings {

		/**
		 * Plugin option name.
		 *
		 * @static
		 * @var string
		 * @access private
		 */
		private static $option;

		/**
		 * Plugin version.
		 *
		 * @static
		 * @var string
		 * @access private
		 */
		private static $version;

		/**
		 * Setting page title.
		 *
		 * @static
		 * @var string
		 * @access private
		 */
		private static $page_title;

		/**
		 * Admin menu title.
		 *
		 * @static
		 * @var string
		 * @access private
		 */
		private static $menu_title;

		/**
		 * Settings page slug.
		 *
		 * @static
		 * @var string
		 * @access private
		 */
		private static $menu_slug;

		/**
		 * Plugin option page hook.
		 *
		 * @static
		 * @var string
		 * @access private
		 */
		private static $hook_suffix;

		/**
		 * wpkses allowed html tags.
		 *
		 * @static
		 * @var array
		 * @access private
		 */
		private static $allowed_html;

		/**
		 * Constructs the settings page.
		 *
		 * @uses el_admin_menu
		 * @uses el_plugin_settings
		 * @access public
		 */
		public function __construct( $option ) {
			self::$option       = $option;
			self::$version      = ELICUS_BLOG_VERSION;
			self::$page_title   = 'Divi Blog Extras';
			self::$menu_title   = 'Divi Blog Extras';
			self::$menu_slug    = 'divi-blog-extras-options';
			self::$allowed_html = array(
				'a'      => array(
					'href'  => array(),
					'title' => array(),
				),
				'em'     => array(),
				'strong' => array(
					'class' => array(),
				),
			);

			add_action( 'admin_menu', array( $this, 'el_admin_menu' ) );
			// Ignoring 'page' warning as sanitizing 'page' below.
			// phpcs:ignore WordPress,NonceVerification,NoNonce.
			if ( isset( $_GET['page'] ) && 'divi-blog-extras-options' === sanitize_key( wp_unslash( $_GET['page'] ) ) ) {
				add_action( 'admin_init', array( $this, 'el_plugin_settings' ) );
			}
		}

		/**
		 * Adds the admin menu.
		 *
		 * @uses el_plugin_options
		 * @access public
		 * @return void
		 */
		public function el_admin_menu() {
			self::$hook_suffix = add_options_page( esc_html( self::$page_title ), esc_html( self::$menu_title ), 'edit_others_posts', esc_html( self::$menu_slug ), array( $this, 'el_plugin_options' ) );
			add_action( 'admin_enqueue_scripts', array( $this, 'el_panel_styles' ) );
			add_action( 'admin_enqueue_scripts', array( $this, 'el_panel_scripts' ) );
		}

		/**
		 * Enqueue admin stylesheet for plugin panel.
		 *
		 * @return void
		 */
		public function el_panel_styles( $hook_suffix ) {
			if ( $hook_suffix === self::$hook_suffix ) {
				wp_register_style( 'el-blog-panel-style', plugins_url( '/panel/styles/panel.min.css', dirname( __FILE__ ) ), array(), self::$version, false );
				wp_enqueue_style( 'el-blog-panel-style' );
			}
		}

		/**
		 * Enqueue admin script for plugin panel.
		 *
		 * @return void
		 */
		public function el_panel_scripts( $hook_suffix ) {
			if ( $hook_suffix === self::$hook_suffix ) {
				wp_register_script( 'el-blog-panel-script', plugins_url( '/panel/scripts/panel.min.js', dirname( __FILE__ ) ), array( 'jquery' ), self::$version, false );
				wp_localize_script(
					'el-blog-panel-script',
					'el_blog_panel_ajax_object',
					array(
						'ajaxurl'   => admin_url( 'admin-ajax.php' ),
						'ajaxnonce' => wp_create_nonce( 'divi-blog-extras-panel-nonce' ),
					)
				);
				wp_enqueue_script( 'el-blog-panel-script' );
			}
		}

		/**
		 * Creates setting page.
		 *
		 * @usedby el_admin_menu
		 * @access public
		 * @return void
		 */
		public function el_plugin_options() {
			?>
			<div class="el-settings-panel-wrapper">
				<button class="el-settings-panel-save-btn"><?php esc_html_e( 'Save Changes', 'divi-blog-extras' ); ?></button>
				<div class="el-settings-panel-settings">
					<div class="el-settings-panel-header">
						<h1 id="el-settings-panel-title"><?php echo esc_html( self::$page_title ); ?></h1>
					</div>
					<ul class="el-settings-panel-mainmenu">
						<li class="el-settings-panel-mainmenu-tab el-settings-panel-active-tab">
							<span data-href="#el-settings-panel-general-wrap">General</span>
						</li>
						<li class="el-settings-panel-mainmenu-tab">
							<span data-href="#el-settings-panel-custom-posts-wrap">Custom Post Types</span>
						</li>
						<li class="el-settings-panel-mainmenu-tab">
							<span data-href="#el-settings-panel-archives-wrap">Archives</span>
						</li>
					</ul>
					<div class="el-settings-panel-content">
						<?php
							include_once plugin_dir_path( __FILE__ ) . 'tabs/general/menu.php';
							include_once plugin_dir_path( __FILE__ ) . 'tabs/custom-posts/menu.php';
							include_once plugin_dir_path( __FILE__ ) . 'tabs/archives/menu.php';
						?>
					</div>
				</div>
				<div class="info-section">
					<div class="info-desc">
						<div class="info-header"><span><?php esc_html_e( 'Help', 'divi-blog-extras' ); ?></span><span class="close-info"></span></div>
						<div class="info-body"><h3></h3><p></p></div>
					</div>
				</div>
				<button class="el-settings-panel-save-btn"><?php esc_html_e( 'Save Changes', 'divi-blog-extras' ); ?></button>
				<div id="el-settings-panel-ajax-saving">
					<img src="<?php echo esc_url( plugins_url( 'includes/panel/assets/ajax-loader.gif', dirname( __DIR__ ) ) ); ?>" alt="loading" id="loading">
				</div>
			</div>
			<?php
		}

		/**
		 * Creates setting fields.
		 *
		 * @access public
		 * @return void
		 */
		public function el_plugin_settings() {
			register_setting( 'el-settings-general-general-group', esc_html( self::$option ) );
			include_once plugin_dir_path( __FILE__ ) . 'tabs/general/general/options.php';

			$override_templates = el_blog_is_templates_override();
			if ( false !== $override_templates && is_array( $override_templates ) && ! empty( $override_templates ) ) {
				register_setting( 'el-settings-general-templates-group', esc_html( self::$option ) );
				include_once plugin_dir_path( __FILE__ ) . 'tabs/general/overrides/options.php';
			}

			register_setting( 'el-settings-custom-posts-general-group', esc_html( self::$option ) );
			include_once plugin_dir_path( __FILE__ ) . 'tabs/custom-posts/general/options.php';

			register_setting( 'el-settings-archives-category-group', esc_html( self::$option ) );
			include_once plugin_dir_path( __FILE__ ) . 'tabs/archives/category/options.php';

			register_setting( 'el-settings-archives-tag-group', esc_html( self::$option ) );
			include_once plugin_dir_path( __FILE__ ) . 'tabs/archives/tag/options.php';

			register_setting( 'el-settings-archives-author-group', esc_html( self::$option ) );
			include_once plugin_dir_path( __FILE__ ) . 'tabs/archives/author/options.php';

			register_setting( 'el-settings-archives-date-group', esc_html( self::$option ) );
			include_once plugin_dir_path( __FILE__ ) . 'tabs/archives/date/options.php';

			register_setting( 'el-settings-archives-taxonomy-group', esc_html( self::$option ) );
			include_once plugin_dir_path( __FILE__ ) . 'tabs/archives/taxonomy/options.php';
		}

		/**
		 * Render toggle field.
		 *
		 * @usedby el_plugin_settings
		 * @access public
		 */
		public function el_toggle_render( $args ) {
			$value     = isset( $args['default'] ) ? esc_attr( $args['default'] ) : '';
			$name      = isset( $args['field_id'] ) ? esc_attr( $args['field_id'] ) : '';
			$setting   = isset( $args['setting'] ) ? esc_attr( $args['setting'] ) : '';
			$id        = isset( $args['id'] ) ? esc_attr( $args['id'] ) : '';
			$data_type = isset( $args['data-type'] ) ? esc_attr( $args['data-type'] ) : esc_attr( self::$option );
			$info      = isset( $args['info'] ) ? sprintf( esc_html__( '%s', 'divi-blog-extras' ), esc_html( $args['info'] ) ) : '';
			$field_id  = $name;

			if ( '' !== $setting ) {
				$options = get_option( $setting );
				if ( isset( $options ) && isset( $options[ $field_id ] ) ) {
					$value = esc_attr( $options[ $field_id ] );
				}
			} else {
				$options = get_option( $field_id );
				if ( isset( $options ) && '' !== $options ) {
					$value = esc_attr( $options );
				}
			}

			$dependency = ( isset( $args['dependency'] ) && 'yes' === $args['dependency'] ) ?
						' el-dependency-control' :
						'';
			$dependent  = ( isset( $args['dependency'] ) && 'yes' === $args['dependency'] ) ?
						' data-dependent="' . implode( ',', array_map( 'esc_attr', $args['dependent'] ) ) . '"' :
						'';
			$depends_on = ( isset( $args['depends-on'] ) ) ?
						' data-depends-on="' . implode( ',', array_map( 'esc_attr', $args['depends-on'] ) ) . '"' :
						'';

			$checked = checked( $value, 'on', false );

			echo et_core_intentionally_unescaped(
				sprintf(
					'<div class="el-settings-panel-field el-settings-panel-toggle el-toggle-on-state">
                            <input id="%1$s" class="el-settings-panel-value-field el-settings-panel-toggle-field %2$s" type="checkbox" value="%3$s" name="%4$s" %5$s data-type="%6$s" %7$s %8$s />
                            <span class="el-settings-panel-toggle-slider"></span>
                            <span class="el-settings-panel-toggle-value-text el-settings-panel-toggle-on-value">Enabled</span>
                            <span class="el-settings-panel-toggle-value-text el-settings-panel-toggle-off-value">Disabled</span>
                        </div>
                        <span class="el-setting-help"></span>
                        <span class="el-setting-info">%9$s</span>',
					et_core_esc_previously( $id ),
					esc_html( $dependency ),
					et_core_esc_previously( $value ),
					et_core_esc_previously( $name ),
					esc_html( $checked ),
					et_core_esc_previously( $data_type ),
					et_core_esc_previously( $dependent ),
					et_core_esc_previously( $depends_on ),
					et_core_esc_previously( $info )
				),
				'html'
			);
		}

		/**
		 * Render dropdown field.
		 *
		 * @usedby el_plugin_settings
		 * @access public
		 */
		public function el_dropdown_render( $args ) {
			$value     = isset( $args['default'] ) ? esc_attr( $args['default'] ) : '';
			$name      = isset( $args['field_id'] ) ? esc_attr( $args['field_id'] ) : '';
			$setting   = isset( $args['setting'] ) ? esc_attr( $args['setting'] ) : '';
			$id        = isset( $args['id'] ) ? esc_attr( $args['id'] ) : '';
			$data_type = isset( $args['data-type'] ) ? esc_attr( $args['data-type'] ) : esc_attr( self::$option );
			$info      = isset( $args['info'] ) ? sprintf( esc_html__( '%s', 'divi-blog-extras' ), esc_html( $args['info'] ) ) : '';
			$field_id  = $name;

			if ( '' !== $setting ) {
				$options = get_option( $setting );
				if ( isset( $options ) && isset( $options[ $field_id ] ) ) {
					$value = esc_attr( $options[ $field_id ] );
				}
			} else {
				$options = get_option( $field_id );
				if ( isset( $options ) && '' !== $options ) {
					$value = esc_attr( $options );
				}
			}

			$depends_on = ( isset( $args['depends-on'] ) ) ?
						' data-depends-on="' . implode( ',', array_map( 'esc_attr', $args['depends-on'] ) ) . '"' :
						'';

			$list_options = isset( $args['list_options'] ) ? $args['list_options'] : '';

			if ( is_array( $list_options ) ) {
				$list_options = array_map( 'esc_attr', $list_options );
				$list         = '';
				foreach ( $list_options as $key => $option ) {
					$selected = selected( esc_attr( $key ), $value, false );
					$list    .= '<option value="' . esc_attr( $key ) . '" ' . esc_attr( $selected ) . '>' . esc_html( $option ) . '</option>';
				}

				echo et_core_intentionally_unescaped(
					sprintf(
						'<div class="el-settings-panel-field el-settings-panel-dropdown">
                                <select id="%1$s" class="el-settings-panel-value-field el-settings-panel-dropdown-field" name="%2$s" data-type="%3$s" %4$s>
                                    %5$s
                                </select>
                            </div>
                            <span class="el-setting-help"></span>
                            <span class="el-setting-info">%6$s</span>',
						et_core_esc_previously( $id ),
						et_core_esc_previously( $name ),
						et_core_esc_previously( $data_type ),
						et_core_esc_previously( $depends_on ),
						et_core_intentionally_unescaped( $list, 'html' ),
						et_core_esc_previously( $info )
					),
					'html'
				);
			} else {
				echo et_core_intentionally_unescaped(
					sprintf(
						'<div id="%1$s" class="el-settings-panel-field" %2$s>%3$s</div>
                              <span class="el-setting-help"></span>
                              <span class="el-setting-info">%4$s</span>',
						et_core_esc_previously( $id ),
						et_core_esc_previously( $depends_on ),
						wp_kses( $list_options, self::$allowed_html ),
						et_core_esc_previously( $info )
					),
					'html'
				);
			}
		}

		/**
		 * Render range slider field.
		 *
		 * @usedby el_plugin_settings
		 * @access public
		 */
		public function el_range_slider_render( $args ) {
			$value     = isset( $args['default'] ) ? esc_attr( $args['default'] ) : '';
			$name      = isset( $args['field_id'] ) ? esc_attr( $args['field_id'] ) : '';
			$setting   = isset( $args['setting'] ) ? esc_attr( $args['setting'] ) : '';
			$id        = isset( $args['id'] ) ? esc_attr( $args['id'] ) : '';
			$data_type = isset( $args['data-type'] ) ? esc_attr( $args['data-type'] ) : esc_attr( self::$option );
			$info      = isset( $args['info'] ) ? sprintf( esc_html__( '%s', 'divi-blog-extras' ), esc_html( $args['info'] ) ) : '';
			$field_id  = $name;

			if ( '' !== $setting ) {
				$options = get_option( $setting );
				if ( isset( $options ) && isset( $options[ $field_id ] ) ) {
					$value = esc_attr( $options[ $field_id ] );
				}
			} else {
				$options = get_option( $field_id );
				if ( isset( $options ) && '' !== $options ) {
					$value = esc_attr( $options );
				}
			}

			$depends_on = ( isset( $args['depends-on'] ) ) ?
						' data-depends-on="' . implode( ',', array_map( 'esc_attr', $args['depends-on'] ) ) . '"' :
						'';

			echo et_core_intentionally_unescaped(
				sprintf(
					'<div class="el-settings-panel-field el-settings-panel-range-slider">
                            <input id="%1$s" class="el-settings-panel-value-field el-settings-panel-range-slider-field" type="range" value="%2$s" name="%3$s" data-type="%4$s" min="%5$s" max="%6$s" step="%7$s" %8$s />
                            <span class="el-settings-panel-range-slider-field-value">%2$s</span>
                        </div>
                        <span class="el-setting-help"></span>
                        <span class="el-setting-info">%9$s</span>',
					et_core_esc_previously( $id ),
					et_core_esc_previously( $value ),
					et_core_esc_previously( $name ),
					et_core_esc_previously( $data_type ),
					intval( $args['min'] ),
					intval( $args['max'] ),
					intval( $args['step'] ),
					et_core_esc_previously( $depends_on ),
					et_core_esc_previously( $info )
				),
				'html'
			);
		}

		/**
		 * Render multiple checkbox field.
		 *
		 * @usedby el_plugin_settings
		 * @access public
		 */
		public function el_mutiple_checkbox_render( $args ) {
			$value     = isset( $args['default'] ) ? esc_attr( $args['default'] ) : '';
			$name      = isset( $args['field_id'] ) ? esc_attr( $args['field_id'] ) : '';
			$setting   = isset( $args['setting'] ) ? esc_attr( $args['setting'] ) : '';
			$id        = isset( $args['id'] ) ? esc_attr( $args['id'] ) : '';
			$data_type = isset( $args['data-type'] ) ? esc_attr( $args['data-type'] ) : esc_attr( self::$option );
			$info      = isset( $args['info'] ) ? sprintf( esc_html__( '%s', 'divi-blog-extras' ), esc_html( $args['info'] ) ) : '';
			$field_id  = $name;

			if ( '' !== $setting ) {
				$options = get_option( $setting );
				if ( isset( $options ) && isset( $options[ $field_id ] ) ) {
					$value = esc_attr( $options[ $field_id ] );
				}
			} else {
				$options = get_option( $field_id );
				if ( isset( $options ) && '' !== $options ) {
					$value = esc_attr( $options );
				}
			}

			$depends_on = ( isset( $args['depends-on'] ) ) ?
						' data-depends-on="' . implode( ',', array_map( 'esc_attr', $args['depends-on'] ) ) . '"' :
						'';

			$list_options = isset( $args['list_options'] ) ? $args['list_options'] : '';

			if ( is_array( $list_options ) ) {
				$list_options = array_map( 'esc_attr', $list_options );
				$list         = '';
				$value        = array_map( 'esc_attr', explode( ',', $value ) );

				foreach ( $list_options as $key => $option ) {
					$checked = in_array( $key, $value, true ) ? checked( 1, 1, false ) : '';
					$list   .= '<span><input type="checkbox" class="el-settings-panel-checkbox-field" id="' . esc_attr( $key ) . '" value="' . esc_attr( $key ) . '" ' . esc_attr( $checked ) . '><label for="' . esc_attr( $key ) . '">' . ucwords( esc_html( $option ) ) . '</label></span>';
				}

				echo et_core_intentionally_unescaped(
					sprintf(
						'<div class="el-settings-panel-field el-settings-panel-multiple-checkboxes">
                                %1$s
                                <input id="%2$s" type="hidden" value="%3$s" class="el-settings-panel-value-field" name="%4$s" data-type="%5$s" %6$s />
                            </div>
                            <span class="el-setting-help"></span>
                            <span class="el-setting-info">%7$s</span>',
						et_core_intentionally_unescaped( $list, 'html' ),
						et_core_esc_previously( $id ),
						esc_html( implode( ',', array_map( 'esc_attr', $value ) ) ),
						et_core_esc_previously( $name ),
						et_core_esc_previously( $data_type ),
						et_core_esc_previously( $depends_on ),
						et_core_esc_previously( $info )
					),
					'html'
				);
			} else {
				echo et_core_intentionally_unescaped(
					sprintf(
						'<div id="%1$s" class="el-settings-panel-field" %2$s>%3$s</div>
                              <span class="el-setting-help"></span>
                              <span class="el-setting-info">%4$s</span>',
						et_core_esc_previously( $id ),
						et_core_esc_previously( $depends_on ),
						wp_kses( $list_options, self::$allowed_html ),
						et_core_esc_previously( $info )
					),
					'html'
				);
			}
		}

		/**
		 * Render repeater field.
		 *
		 * @usedby el_plugin_settings
		 * @access public
		 */
		public function el_repeater_render( $args ) {
			$value     = isset( $args['default'] ) ? wp_specialchars_decode( $args['default'], ENT_COMPAT ) : '';
			$name      = isset( $args['field_id'] ) ? esc_attr( $args['field_id'] ) : '';
			$setting   = isset( $args['setting'] ) ? esc_attr( $args['setting'] ) : '';
			$id        = isset( $args['id'] ) ? esc_attr( $args['id'] ) : '';
			$data_type = isset( $args['data-type'] ) ? esc_attr( $args['data-type'] ) : esc_attr( self::$option );
			$info      = isset( $args['info'] ) ? sprintf( esc_html__( '%s', 'divi-blog-extras' ), esc_html( $args['info'] ) ) : '';
			$field_id  = $name;

			if ( '' !== $setting ) {
				$options = get_option( $setting );
				if ( isset( $options ) && isset( $options[ $field_id ] ) ) {
					$value = esc_attr( $options[ $field_id ] );
				}
			} else {
				$options = get_option( $field_id );
				if ( isset( $options ) && '' !== $options ) {
					$value = esc_attr( $options );
				}
			}

			$value      = wp_specialchars_decode( $value, ENT_COMPAT );
			$value      = wp_unslash( $value );
			$counter    = isset( json_decode( $value, true )['counter'] ) ? intval( json_decode( $value, true )['counter'] ) : 0;
			$depends_on = ( isset( $args['depends-on'] ) ) ?
						' data-depends-on="' . implode( ',', array_map( 'esc_attr', $args['depends-on'] ) ) . '"' :
						'';

			$fields = isset( $args['fields'] ) ? $args['fields'] : '';

			if ( is_array( $fields ) ) {
				$repeater_field_rows = array();
				if ( 1 < $counter ) {
					for ( $i = 1; $i <= $counter; $i++ ) {
						$repeater_fields = array();
						foreach ( $fields as $field ) {
							if ( isset( $field[2]['field_id'] ) && isset( $field[2]['id'] ) ) {
								$field[2]['field_id'] = preg_replace( '/[0-9]+/', $i, esc_html( $field[2]['field_id'] ) );
								$field[2]['id']       = preg_replace( '/[0-9]+/', $i, esc_html( $field[2]['id'] ) );
								$label                = isset( $field[0] ) ?
														sprintf(
															esc_html__( '%s', 'divi-blog-extras' ),
															esc_html( $field[0] )
														) :
														'';

								ob_start();
								if ( isset( $field[1], $field[2] ) ) {
									if ( method_exists( $this, $field[1] ) ) {
										call_user_func( array( $this, $field[1] ), $field[2] );
									}
								}
								$callback_field = ob_get_clean();

								$repeater_field = sprintf(
									'<div class="el-settings-panel-repeater-field">
                                        <label>%1$s</label>
                                        %2$s
                                    </div>',
									et_core_esc_previously( $label ),
									et_core_intentionally_unescaped( $callback_field, 'html' )
								);
								array_push( $repeater_fields, $repeater_field );
							}
						}
						$repeater_field_row = sprintf(
							'<div class="repeater-field-row">
                                %s
                                <p class="repeater-controls">
                                    <span class="remove-row row-control">-</span>
                                    <span class="add-row row-control">+</span>
                                </p>
                            </div>',
							et_core_intentionally_unescaped( implode( '', $repeater_fields ), 'html' )
						);
						array_push( $repeater_field_rows, $repeater_field_row );
					}
				} else {
					$repeater_fields = array();
					foreach ( $fields as $field ) {
						if ( isset( $field[2]['field_id'] ) && isset( $field[2]['id'] ) ) {
							$label = isset( $field[0] ) ?
													sprintf(
														esc_html__( '%s', 'divi-blog-extras' ),
														esc_html( $field[0] )
													) :
													'';

							ob_start();
							if ( isset( $field[1], $field[2] ) ) {
								if ( method_exists( $this, $field[1] ) ) {
									call_user_func( array( $this, $field[1] ), $field[2] );
								}
							}
							$callback_field = ob_get_clean();

							$repeater_field = sprintf(
								'<div class="el-settings-panel-repeater-field">
                                    <label>%1$s</label>
                                    %2$s
                                </div>',
								et_core_esc_previously( $label ),
								et_core_intentionally_unescaped( $callback_field, 'html' )
							);
							array_push( $repeater_fields, $repeater_field );
						}
					}

					$repeater_field_row = sprintf(
						'<div class="repeater-field-row">
                            %s
                            <p class="repeater-controls">
                                <span class="add-row row-control">+</span>
                            </p>
                        </div>',
						et_core_intentionally_unescaped( implode( '', $repeater_fields ), 'html' )
					);
					array_push( $repeater_field_rows, $repeater_field_row );
				}

				echo et_core_intentionally_unescaped(
					sprintf(
						'<div class="el-settings-panel-field el-settings-panel-repeater">
                            <input type="hidden" id="%1$s" class="el-settings-panel-value-field el-settings-panel-repeater-value" name="%2$s" data-type="%3$s" value="%4$s" %5$s />
                            <input type="hidden" class="row-counter" value="%6$s" />
                            <div class="repeater-field-rows">
                                %7$s
                            </div>
                        </div>
                        <span class="el-setting-help"></span>
                        <span class="el-setting-info">%8$s</span>',
						et_core_esc_previously( $id ),
						et_core_esc_previously( $name ),
						et_core_esc_previously( $data_type ),
						esc_attr( $value ),
						et_core_esc_previously( $depends_on ),
						et_core_esc_previously( $counter ),
						et_core_intentionally_unescaped( implode( '', $repeater_field_rows ), 'html' ),
						et_core_esc_previously( $info )
					),
					'html'
				);
			} else {
				echo et_core_intentionally_unescaped(
					sprintf(
						'<div id="%1$s" class="el-settings-panel-field" %2$s>%3$s</div>
                          <span class="el-setting-help"></span>
                          <span class="el-setting-info">%4$s</span>',
						et_core_esc_previously( $id ),
						et_core_esc_previously( $depends_on ),
						wp_kses( $fields, self::$allowed_html ),
						et_core_esc_previously( $info )
					),
					'html'
				);
			}

		}

		/**
		 * Render fieldset field.
		 *
		 * @usedby el_plugin_settings
		 * @access public
		 */
		public function el_fieldset_render( $args ) {
			$value     = isset( $args['default'] ) ? esc_attr( $args['default'] ) : '';
			$name      = isset( $args['field_id'] ) ? esc_attr( $args['field_id'] ) : '';
			$setting   = isset( $args['setting'] ) ? esc_attr( $args['setting'] ) : '';
			$id        = isset( $args['id'] ) ? esc_attr( $args['id'] ) : '';
			$data_type = isset( $args['data-type'] ) ? esc_attr( $args['data-type'] ) : esc_attr( self::$option );
			$info      = isset( $args['info'] ) ? sprintf( esc_html__( '%s', 'divi-blog-extras' ), esc_html( $args['info'] ) ) : '';
			$field_id  = $name;

			$depends_on = ( isset( $args['depends-on'] ) ) ?
						' data-depends-on="' . implode( ',', array_map( 'esc_attr', $args['depends-on'] ) ) . '"' :
						'';

			$fields = isset( $args['fields'] ) ? $args['fields'] : '';

			if ( is_array( $fields ) ) {
				$fieldset_fields = array();
				foreach ( $fields as $field ) {
					$label = isset( $field[0] ) ?
							sprintf(
								esc_html__( '%s', 'divi-blog-extras' ),
								esc_html( $field[0] )
							) :
							'';

					ob_start();
					if ( isset( $field[1], $field[2] ) ) {
						if ( method_exists( $this, $field[1] ) ) {
							call_user_func( array( $this, $field[1] ), $field[2] );
						}
					}
					$callback_field = ob_get_clean();

					$fieldset_field = sprintf(
						'<div class="el-settings-panel-fieldset-field">
                            <label>%1$s</label>
                            %2$s
                        </div>',
						et_core_esc_previously( $label ),
						et_core_intentionally_unescaped( $callback_field, 'html' )
					);
					array_push( $fieldset_fields, $fieldset_field );
				}

				echo et_core_intentionally_unescaped(
					sprintf(
						'<div id="%1$s" name="%2$s" class="el-settings-panel-field el-settings-panel-fieldset" %3$s>
                            %4$s
                        </div>
                        <span class="el-setting-help"></span>
                        <span class="el-setting-info">%5$s</span>',
						et_core_esc_previously( $id ),
						et_core_esc_previously( $name ),
						et_core_esc_previously( $depends_on ),
						et_core_intentionally_unescaped( implode( '', $fieldset_fields ), 'html' ),
						et_core_esc_previously( $info )
					),
					'html'
				);
			} else {
				echo et_core_intentionally_unescaped(
					sprintf(
						'<div id="%1$s" class="el-settings-panel-field el-settings-panel-fieldset" %2$s>%3$s</div>
                          <span class="el-setting-help"></span>
                          <span class="el-setting-info">%4$s</span>',
						et_core_esc_previously( $id ),
						et_core_esc_previously( $depends_on ),
						wp_kses( $fields, self::$allowed_html ),
						et_core_esc_previously( $info )
					),
					'html'
				);
			}
		}

		/**
		 * Render list field.
		 *
		 * @usedby el_plugin_settings
		 * @access public
		 */
		public function el_list_render( $args ) {
			$value     = isset( $args['default'] ) ? esc_attr( $args['default'] ) : '';
			$name      = isset( $args['field_id'] ) ? esc_attr( $args['field_id'] ) : '';
			$setting   = isset( $args['setting'] ) ? esc_attr( $args['setting'] ) : '';
			$id        = isset( $args['id'] ) ? esc_attr( $args['id'] ) : '';
			$data_type = isset( $args['data-type'] ) ? esc_attr( $args['data-type'] ) : esc_attr( self::$option );
			$info      = isset( $args['info'] ) ? sprintf( esc_html__( '%s', 'divi-blog-extras' ), esc_html( $args['info'] ) ) : '';
			$field_id  = $name;

			$depends_on = ( isset( $args['depends-on'] ) ) ?
						' data-depends-on="' . implode( ',', array_map( 'esc_attr', $args['depends-on'] ) ) . '"' :
						'';

			$list_options = isset( $args['list_options'] ) ? $args['list_options'] : '';

			if ( is_array( $list_options ) ) {
				$list = '';
				foreach ( $list_options as $option ) {
					$list .= '<li>' . wp_kses( $option, self::$allowed_html ) . '</li>';
				}

				echo et_core_intentionally_unescaped(
					sprintf(
						'<div class="el-settings-panel-field el-settings-panel-list">
                                <ul id="%1$s" class="el-settings-panel-list-field" name="%2$s" %3$s>
                                    %4$s
                                </ul>
                            </div>
                            <span class="el-setting-help"></span>
                            <span class="el-setting-info">%5$s</span>',
						et_core_esc_previously( $id ),
						et_core_esc_previously( $name ),
						et_core_esc_previously( $depends_on ),
						et_core_intentionally_unescaped( $list, 'html' ),
						et_core_esc_previously( $info )
					),
					'html'
				);
			} else {
				echo et_core_intentionally_unescaped(
					sprintf(
						'<div id="%1$s" class="el-settings-panel-field" %2$s>%3$s</div>
                          <span class="el-setting-help"></span>
                          <span class="el-setting-info">%4$s</span>',
						et_core_esc_previously( $id ),
						et_core_esc_previously( $depends_on ),
						wp_kses( $list_options, self::$allowed_html ),
						et_core_esc_previously( $info )
					),
					'html'
				);
			}
		}

	}//end class

	new El_Blog_Settings( ELICUS_BLOG_OPTION );

} // End of class_exists condition
