<?php

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

/**
 * Porto builders library
 *
 * @since 6.0
 */
class PortoBuilders {

	const BUILDER_SLUG = 'porto_builder';

	const ADMIN_MENU_SLUG = 'edit.php?post_type=' . self::BUILDER_SLUG;

	const BUILDER_TAXONOMY_SLUG = 'porto_builder_type';

	const BUILDER_CAP = 'edit_pages';

	private $lib_condition = null;

	private $post_terms = null;

	public $builder_types;

	/**
	 * Constructor
	 * 
	 * @since 3.1.0 - Added - display condition edits in templates list page.
	 * 
	 * @access public
	 */
	public function __construct() {
		global $porto_settings_optimize;
		if ( empty( $porto_settings_optimize ) ) {
			if ( ! is_customize_preview() ) {
				$porto_settings_optimize = get_option( 'porto_settings_optimize', array() );
			} else {
				$porto_settings_optimize = array();
			}
		}
		if ( ! is_admin() && ( isset( $_REQUEST['elementor-preview'] ) || ( defined( 'WPB_VC_VERSION' ) && isset( $_REQUEST['vc_editable'] ) ) ) ) {
			add_filter(
				'body_class',
				function( $classes ) {
					global $post;
					if ( $post && 'popup' == get_post_meta( (int) $post->ID, self::BUILDER_TAXONOMY_SLUG, true ) ) {
						$classes[] = 'porto-popup-template';
					}
					return $classes;
				}
			);
			//WPB Frontend Builder
			if ( isset( $_REQUEST['vc_editable'] ) ) {
				add_action(
					'wp_enqueue_scripts',
					function() {
						global $post;
						if ( $post && 'popup' == get_post_meta( (int) $post->ID, self::BUILDER_TAXONOMY_SLUG, true ) ) {
							ob_start();
							$popup_width = empty( get_post_meta( (int) $post->ID, 'popup_width', true ) ) ? '740px' : (int) get_post_meta( (int) $post->ID, 'popup_width', true ) . 'px';
							?>
						.page-wrapper {
							position: absolute;
							max-width: <?php echo porto_strip_script_tags( $popup_width ); ?>;
							width: 100%;
							left: 50%;
							top: 50%;
							transform: translate(-50%,-50%);
							z-index: 9999;
							background: #fff;
							<?php
							if ( $bg_color = get_post_meta( (int) $post->ID, 'popup_offcanvas_bg', true ) ) {
								?>
								background-color: <?php echo porto_filter_output( $bg_color ); ?>
								<?php
							}
							?>
						}
							<?php
							$style = ob_get_clean();
							wp_add_inline_style( 'porto-theme', $style );
						}
					},
					1001
				);
			}
		}
		$this->builder_types = array(
			'block'   => 'Block(Include Page Header)',
			'header'  => 'Header',
			'footer'  => 'Footer',
			'product' => 'Single Product',
			'shop'    => 'Product Archive',
			'archive' => 'Archive',
			'single'  => 'Single',
			'popup'   => 'Popup',
			'type'    => 'Post Type',
		);

		if ( ! empty( $porto_settings_optimize['disabled_pbs'] ) && is_array( $porto_settings_optimize['disabled_pbs'] ) ) {
			foreach ( $porto_settings_optimize['disabled_pbs'] as $key ) {
				if ( isset( $this->builder_types[ $key ] ) ) {
					unset( $this->builder_types[ $key ] );
				}
			}
		}

		$this->builder_types = apply_filters( 'porto_templates_builder_types', $this->builder_types );

		add_action( 'init', array( $this, 'add_builder_type' ) );
		add_action( 'admin_menu', array( $this, 'add_builder_menu' ), 20 );
		register_activation_hook(
			PORTO_FUNC_FILE,
			function() {
				$this->add_builder_type();
				flush_rewrite_rules();
			}
		);

		if ( is_admin() ) {
			add_action( 'admin_enqueue_scripts', array( $this, 'enqueue' ) );
			add_action( 'porto_builder_condition_pre_enqueue', array( $this, 'enqueue' ) );
			add_filter( 'views_edit-' . self::BUILDER_SLUG, array( $this, 'admin_print_tabs' ) );
			add_filter( 'manage_' . self::BUILDER_SLUG . '_posts_columns', array( $this, 'admin_column_header' ) );
			add_action( 'manage_' . self::BUILDER_SLUG . '_posts_custom_column', array( $this, 'admin_column_content' ), 10, 2 );
			add_action( 'admin_init', array( $this, 'add_builder_post' ), 1 );
			add_action( 'edit_form_after_title', array( $this, 'go_to_builder_button' ) );
			add_action( 'admin_footer', array( $this, 'print_gutenberg_go_builder_template' ) );

			add_action(
				'admin_footer',
				function() {
					include_once PORTO_BUILDERS_PATH . 'views/popup_content.php';
					if ( defined( 'WPB_VC_VERSION' ) && ( vc_is_inline() || 'post-new.php' == $GLOBALS['pagenow'] || 'post.php' == $GLOBALS['pagenow'] ) ) {
						include_once PORTO_BUILDERS_PATH . 'views/edit_area.tpl.php';
					}
				}
			);

			add_action(
				'init',
				function() {
					if ( defined( 'WPB_VC_VERSION' ) ) {
						require_once PORTO_BUILDERS_PATH . 'lib/class-builder-function.php';
					}
					$load_search_lib = false;
					if ( 'post.php' == $GLOBALS['pagenow'] && ( ( isset( $_REQUEST['post'] ) && self::BUILDER_SLUG == get_post_type( $_REQUEST['post'] ) ) || ( isset( $_REQUEST['post_id'] ) && self::BUILDER_SLUG == get_post_type( $_REQUEST['post_id'] ) ) ) ) {

						if ( isset( $_REQUEST['post'] ) ) {
							$post_id = (int) $_REQUEST['post'];
						} else {
							$post_id = (int) $_REQUEST['post_id'];
						}
						if ( 'block' != get_post_meta( $post_id, self::BUILDER_TAXONOMY_SLUG, true ) ) {
							$load_search_lib = true;
						}
					}

					if ( 'edit.php' == $GLOBALS['pagenow'] && ( ! empty( $_REQUEST['post_type'] ) && self::BUILDER_SLUG == $_REQUEST['post_type'] ) ) {
						$load_search_lib = true;
					}

					if ( wp_doing_ajax() && isset( $_REQUEST['action'] ) && 0 === strpos( $_REQUEST['action'], 'porto_builder_' ) ) {
						$load_search_lib = true;
					}

					if ( $load_search_lib ) {
						require_once PORTO_BUILDERS_PATH . 'lib/class-condition.php';
						new Porto_Builder_Condition;
					}
				}
			);

            add_action( 'trashed_post', array( $this, 'template_builder_trash' ), 99, 2 );
		}
		if ( ! empty( $_REQUEST['post'] ) && ! empty( get_post_meta( $_REQUEST['post'], PortoBuilders::BUILDER_TAXONOMY_SLUG, true ) ) ||
			! empty( $_REQUEST['post_id'] ) && ! empty( get_post_meta( $_REQUEST['post_id'], PortoBuilders::BUILDER_TAXONOMY_SLUG, true ) )
		 ) {
			add_filter(
				'porto_builder',
				function( $vars ) {
					$post_id = ! empty( $_REQUEST['post'] ) ? $_REQUEST['post'] : $_REQUEST['post_id'];
					$post_id = (int) $post_id;
					$vars['builder_type'] = get_post_meta( $post_id, PortoBuilders::BUILDER_TAXONOMY_SLUG, true );
					if ( 'header' == $vars['builder_type'] ) {
						$vars['header_type'] = get_post_meta( $post_id, 'header_type', true );
						if ( 'side' == $vars['header_type'] ) {
							$vars['header_side_width'] = get_post_meta( $post_id, 'header_side_width', true );
						}
					}
					return $vars;
				}
			);
			if ( 'header' == get_post_meta( ! empty( $_REQUEST['post'] ) ? $_REQUEST['post'] : $_REQUEST['post_id'], PortoBuilders::BUILDER_TAXONOMY_SLUG, true ) ) {
				add_filter( 'porto_header_builder', '__return_true' );
			}
		}
		// register builder elements
		add_action(
			'init',
			function() {
				global $porto_settings;
				// if ( ! defined( 'ELEMENTOR_VERSION' ) && ! defined( 'WPB_VC_VERSION' ) && ! empty( $porto_settings['enable-gfse'] ) ) {
				// 	require_once PORTO_BUILDERS_PATH . 'elements/header/init.php';
				// 	return;
				// }
				if ( is_admin() && defined( 'WPB_VC_VERSION' ) && ( ! empty( $_REQUEST['post'] ) || ! empty( $_REQUEST['post_id'] ) ) ) {
					$post_id = -1;
					if ( ! empty( $_REQUEST['post'] ) ) {
						$post_id = (int) $_REQUEST['post'];
					} else {
						$post_id = (int) $_REQUEST['post_id'];
					}

					$builder_type = get_post_meta( $post_id, PortoBuilders::BUILDER_TAXONOMY_SLUG, true );

					if ( 'header' == $builder_type || 'footer' == $builder_type ) {
						global $vc_row_layouts;

						$vc_row_layouts = array(
							array(
								'cells'      => 'flex1_flexauto',
								'mask'       => '215',
								'title'      => 'flex-1 + flex-auto',
								'icon_class' => 'flex-1_flex-auto',
							),
							array(
								'cells'      => 'flex1_flexauto_flex1',
								'mask'       => '216',
								'title'      => 'flex-1 + flex-auto + flex-1',
								'icon_class' => 'flex-1_flex-auto_flex-1',
							),
							array(
								'cells'      => 'flexauto_flex1_flexauto',
								'mask'       => '217',
								'title'      => 'flex-auto + flex-1 + flex-auto',
								'icon_class' => 'flex-auto_flex-1_flex-auto',
							),
							array(
								'cells'      => '11',
								'mask'       => '12',
								'title'      => '1/1',
								'icon_class' => '1-1',
							),
							array(
								'cells'      => '12_12',
								'mask'       => '26',
								'title'      => '1/2 + 1/2',
								'icon_class' => '1-2_1-2',
							),
							array(
								'cells'      => '23_13',
								'mask'       => '29',
								'title'      => '2/3 + 1/3',
								'icon_class' => '2-3_1-3',
							),
							array(
								'cells'      => '13_13_13',
								'mask'       => '312',
								'title'      => '1/3 + 1/3 + 1/3',
								'icon_class' => '1-3_1-3_1-3',
							),
							array(
								'cells'      => '14_14_14_14',
								'mask'       => '420',
								'title'      => '1/4 + 1/4 + 1/4 + 1/4',
								'icon_class' => '1-4_1-4_1-4_1-4',
							),
							array(
								'cells'      => '14_34',
								'mask'       => '212',
								'title'      => '1/4 + 3/4',
								'icon_class' => '1-4_3-4',
							),
							array(
								'cells'      => '14_12_14',
								'mask'       => '313',
								'title'      => '1/4 + 1/2 + 1/4',
								'icon_class' => '1-4_1-2_1-4',
							),
							array(
								'cells'      => '56_16',
								'mask'       => '218',
								'title'      => '5/6 + 1/6',
								'icon_class' => '5-6_1-6',
							),
							array(
								'cells'      => '16_16_16_16_16_16',
								'mask'       => '642',
								'title'      => '1/6 + 1/6 + 1/6 + 1/6 + 1/6 + 1/6',
								'icon_class' => '1-6_1-6_1-6_1-6_1-6_1-6',
							),
							array(
								'cells'      => '16_23_16',
								'mask'       => '319',
								'title'      => '1/6 + 4/6 + 1/6',
								'icon_class' => '1-6_2-3_1-6',
							),
							array(
								'cells'      => '16_16_16_12',
								'mask'       => '424',
								'title'      => '1/6 + 1/6 + 1/6 + 1/2',
								'icon_class' => '1-6_1-6_1-6_1-2',
							),
							array(
								'cells'      => '15_15_15_15_15',
								'mask'       => '530',
								'title'      => '1/5 + 1/5 + 1/5 + 1/5 + 1/5',
								'icon_class' => 'l_15_15_15_15_15',
							),
						);
					}
				}
				if ( array_key_exists( 'header', $this->builder_types ) ) {
					require_once PORTO_BUILDERS_PATH . 'elements/header/init.php';
				}

				if ( array_key_exists( 'type', $this->builder_types ) ) {
					require_once PORTO_BUILDERS_PATH . 'elements/type/init.php';
				}

				if ( class_exists( 'Woocommerce' ) ) {
					if ( array_key_exists( 'product', $this->builder_types ) ) {
						require_once PORTO_BUILDERS_PATH . 'elements/product/init.php';
					}

					if ( array_key_exists( 'shop', $this->builder_types ) ) {
						require_once PORTO_BUILDERS_PATH . 'elements/shop/init.php';
					}
				} else {
					unset( $this->builder_types['product'] );
					unset( $this->builder_types['shop'] );
				}

				if ( array_key_exists( 'archive', $this->builder_types ) ) {
					require_once PORTO_BUILDERS_PATH . 'elements/archive/init.php';
				}

				if ( array_key_exists( 'single', $this->builder_types ) ) {
					require_once PORTO_BUILDERS_PATH . 'elements/single/init.php';
				}
			},
			2
		);

		add_action(
			'wp',
			function () {
				if ( is_singular( PortoBuilders::BUILDER_SLUG ) ) {
					$this->post_terms = wp_get_post_terms( get_the_ID(), PortoBuilders::BUILDER_TAXONOMY_SLUG, array( 'fields' => 'names' ) );
					if ( empty( $this->post_terms ) ) {
						return;
					}
					if ( 'product' == $this->post_terms[0] ) {
						add_filter( 'body_class', array( $this, 'filter_body_class' ) );
						add_filter( 'porto_is_product', '__return_true' );
					}
					if ( 'shop' == $this->post_terms[0] ) {
						add_filter( 'body_class', array( $this, 'filter_body_class' ) );
						add_filter( 'porto_is_shop', '__return_true' );
					}
					if ( 'archive' == $this->post_terms[0] ) {
						add_filter( 'body_class', array( $this, 'filter_body_class' ) );
						add_filter( 'porto_is_archive', '__return_true' );
					}
					if ( 'single' == $this->post_terms[0] ) {
						add_filter( 'body_class', array( $this, 'filter_body_class' ) );
					}
				}
			}
		);

		// save edit area size
		add_action( 'wp_ajax_vc_save', array( $this, 'save_custom_panel_options' ), 9 );
		add_action( 'save_post', array( $this, 'save_custom_panel_options' ), 1 );
	}

	/**
	 * Go to the builder button
	 * 
	 * @since 3.6.0
	 */
	public function go_to_builder_button( $post ) {
		// Exit if Gutenberg are active.
		if ( did_action( 'enqueue_block_editor_assets' ) ) {
			return;
		}

		if ( ! empty( $post ) ) {
			$post_type = $post->post_type;
			switch( $post_type ) {
				case 'page':
				case 'ptu':
				case 'ptu_tax':
				case 'elementor_library':
				case 'acf-post-type':
				case 'acf-taxonomy':
				case 'acf-field-group':
				case 'yith-wcbm-badge':
				case 'porto_builder':
				case 'attachment':
				case 'cptm':
					break;
				case 'product':
					?>
					<a target="_blank" class="porto-edit-builder" href="<?php echo esc_url( admin_url( 'edit.php?post_type=porto_builder&porto_builder_type=product' ) ); ?>"><i class="porto-icon-studio"></i><?php esc_html_e( 'Build the layout with Product Builder', 'porto-functionality' ); ?></a>
					<?php
					break;
				default:
				?>
					<a target="_blank" class="porto-edit-builder" href="<?php echo esc_url( admin_url( 'edit.php?post_type=porto_builder&porto_builder_type=single' ) ); ?>"><i class="porto-icon-studio"></i><?php esc_html_e( 'Build the layout with Single Builder', 'porto-functionality' ); ?></a>
				<?php
					break;
			}
		?>
		<?php
		}
	}

	/**
	 * print the go builder button template for Gutenberg
	 * 
	 * @since 3.6.0
	 */
	public function print_gutenberg_go_builder_template() {
		if ( ! did_action( 'enqueue_block_editor_assets' ) ) {
			return;
		}
		global $pagenow;
		if ( ( isset( $_REQUEST['post'] ) && $post_id = (int)$_REQUEST['post'] ) || 'post-new.php' == $pagenow ) {
			if ( 'post-new.php' == $pagenow ) {
				$post_type = 'post';
				if ( isset( $_REQUEST['post_type'] ) ) {
					$post_type = $_REQUEST['post_type'];
				}
			} else {
				$post_type = get_post_type( $post_id );
			}
		?>
			<script id="porto-gutenberg-go-builder" type="text/html">
				<?php 
				switch( $post_type ) {
					case 'page':
					case 'ptu':
					case 'ptu_tax':
					case 'elementor_library':
					case 'acf-post-type':
					case 'acf-taxonomy':
					case 'acf-field-group':
					case 'yith-wcbm-badge':
					case 'porto_builder':
					case 'attachment':
					case 'cptm':
						break;
					case 'product':
						?>
						<a target="_blank" class="porto-edit-builder" href="<?php echo esc_url( admin_url( 'edit.php?post_type=porto_builder&porto_builder_type=product' ) ); ?>"><i class="porto-icon-studio"></i><?php esc_html_e( 'Build the layout with Product Builder', 'porto-functionality' ); ?></a>
						<?php
						break;
					default:
					?>
					<a target="_blank" class="porto-edit-builder" href="<?php echo esc_url( admin_url( 'edit.php?post_type=porto_builder&porto_builder_type=single' ) ); ?>"><i class="porto-icon-studio"></i><?php esc_html_e( 'Build the layout with Single Builder', 'porto-functionality' ); ?></a>
					<?php
						break;
				}
				?>
			</script>
		<?php
		}
	}

	/**
	 * Filters the body classes.
	 * 
	 * @since 2.6.0
	 */
	public function filter_body_class( $classes ) {
		global $post;
		if ( $post && PortoBuilders::BUILDER_SLUG == $post->post_type ) {
			$classes[] = 'product' == $this->post_terms[0] ? 'single-product' : $this->post_terms[0] . '-builder';
			if ( 'shop' == $this->post_terms[0] ) {
				$classes[] = 'woocommerce-page archive';
			}
		}
		return $classes;
	}

	/**
	 * Enqueue needed scripts
	 */
	public function enqueue() {
		$screen = get_current_screen();
		if ( defined( 'PORTO_JS' ) /*&& $screen && ( ( 'edit' == $screen->base && 'edit-porto_builder' == $screen->id ) || ( 'post' == $screen->base && self::BUILDER_SLUG == $screen->id ) )*/ ) {
			wp_enqueue_style( 'porto-builder-fonts', '//fonts.googleapis.com/css?family=Poppins%3A400%2C600%2C700&display=swap' );
			wp_enqueue_style( 'jquery-magnific-popup', PORTO_CSS . '/magnific-popup.min.css', false, '1.1.0', 'all' );
			wp_enqueue_script( 'jquery-magnific-popup', PORTO_JS . '/libs/jquery.magnific-popup.min.js', array( 'jquery-core' ), '1.1.0', true );
			wp_enqueue_script( 'porto-builder-admin', str_replace( '/shortcodes', '/builders', PORTO_SHORTCODES_URL ) . 'assets/admin.js', array( 'jquery-core' ), PORTO_FUNC_VERSION, true );
		}
	}

	/**
	 * Register builder post type and builder types as taxonomies
	 */
	public function add_builder_type() {
		global $porto_settings;
		// Gutenberg Full Site Editing
		// if ( ! defined( 'ELEMENTOR_VERSION' ) && ! defined( 'WPB_VC_VERSION' ) && ! empty( $porto_settings['enable-gfse'] ) ) {
		// 	return;
		// }
		$singular_name = __( 'Template Builder', 'porto-functionality' );
		$name          = __( 'Templates Builder', 'porto-functionality' );
		$current_type  = $singular_name;
		if ( ! empty( $_REQUEST[ self::BUILDER_TAXONOMY_SLUG ] ) && isset( $this->builder_types[ $_REQUEST[ self::BUILDER_TAXONOMY_SLUG ] ] ) ) {
			$current_type = $this->builder_types[ $_REQUEST[ self::BUILDER_TAXONOMY_SLUG ] ];
		}
		$labels = array(
			'name'               => $name,
			'singular_name'      => $current_type,
			/* translators: current type */
			'add_new'            => sprintf( __( 'Add New %s', 'porto-functionality' ), str_replace( $singular_name, '', $current_type ) ),
			/* translators: %s: content type singular name */
			'add_new_item'       => sprintf( __( 'Add New %s', 'porto-functionality' ), $current_type ),
			/* translators: %s: content type singular name */
			'edit_item'          => sprintf( __( 'Edit %s', 'porto-functionality' ), $current_type ),
			/* translators: %s: content type singular name */
			'new_item'           => sprintf( __( 'New %s', 'porto-functionality' ), $current_type ),
			/* translators: %s: content type singular name */
			'view_item'          => sprintf( __( 'View %s', 'porto-functionality' ), $current_type ),
			/* translators: %s: content type singular label */
			'search_items'       => sprintf( __( 'Search %s', 'porto-functionality' ), $name ),
			/* translators: %s: content type singular label */
			'not_found'          => sprintf( __( 'No %s found', 'porto-functionality' ), $name ),
			/* translators: %s: content type singular label */
			'not_found_in_trash' => sprintf( __( 'No %s found in Trash', 'porto-functionality' ), $name ),
			'parent_item_colon'  => '',
		);

		$args = array(
			'labels'               => $labels,
			'public'               => true,
			'rewrite'              => false,
			'menu_icon'            => 'dashicons-admin-page',
			'show_ui'              => true,
			'show_in_menu'         => false,
			'show_in_nav_menus'    => false,
			'exclude_from_search'  => true,
			'capability_type'      => 'post',
			'hierarchical'         => false,
			'show_in_rest'         => true,
			'supports'             => array(
				'title',
				'thumbnail',
				'author',
				'editor',
			),
			'register_meta_box_cb' => array( $this, 'add_meta_boxes' ),
		);
		if ( defined( 'ELEMENTOR_VERSION' ) ) {
			$args['supports'][] = 'elementor';
		}

		register_post_type( self::BUILDER_SLUG, $args );

		$args = array(
			'hierarchical'      => false,
			'show_ui'           => false,
			'show_in_nav_menus' => false,
			'show_admin_column' => true,
			'query_var'         => is_admin(),
			'rewrite'           => false,
			'public'            => false,
			'label'             => __( 'Type', 'porto-functionality' ),
			'show_in_rest'      => true,
		);
		register_taxonomy( self::BUILDER_TAXONOMY_SLUG, self::BUILDER_SLUG, $args );
	}

	public function add_builder_menu() {
		if ( is_admin() && ( current_user_can( 'edit_posts' ) || current_user_can( 'edit_pages' ) ) && ! current_user_can( 'manage_options' ) ) {
			add_menu_page( 'Porto', __( 'Porto', 'porto' ), 'edit_posts', 'edit.php?post_type=' . PortoBuilders::BUILDER_SLUG, null, 'dashicons-porto-logo', 54 );
		}
		// global $porto_settings;
		// Gutenberg Full Site Editing
		// if ( defined( 'ELEMENTOR_VERSION' ) || defined( 'WPB_VC_VERSION' ) || empty( $porto_settings['enable-gfse'] ) ) {
		add_submenu_page( 'porto', __( 'Templates Builder', 'porto-functionality' ), __( 'Templates Builder', 'porto-functionality' ), 'administrator', 'edit.php?post_type=' . PortoBuilders::BUILDER_SLUG );

		add_submenu_page( 'porto', __( 'Header Builder', 'porto-functionality' ), __( 'Header Builder', 'porto-functionality' ), 'administrator', 'edit.php?post_type=' . PortoBuilders::BUILDER_SLUG . '&porto_builder_type=header' );
		add_submenu_page( 'porto', __( 'Footer Builder', 'porto-functionality' ), __( 'Footer Builder', 'porto-functionality' ), 'administrator', 'edit.php?post_type=' . PortoBuilders::BUILDER_SLUG . '&porto_builder_type=footer' );
		add_submenu_page( 'porto', __( 'Popup Builder', 'porto-functionality' ), __( 'Popup Builder', 'porto-functionality' ), 'administrator', 'edit.php?post_type=' . PortoBuilders::BUILDER_SLUG . '&porto_builder_type=popup' );
		add_submenu_page( 'porto', __( 'Block Builder', 'porto-functionality' ), __( 'Block Builder', 'porto-functionality' ), 'administrator', 'edit.php?post_type=' . PortoBuilders::BUILDER_SLUG . '&porto_builder_type=block' );
		// }
	}

	public function add_meta_boxes() {
		if ( ! function_exists( 'get_current_screen' ) ) {
			return;
		}
		$screen = get_current_screen();
		if ( function_exists( 'add_meta_box' ) && $screen && 'post' == $screen->base && self::BUILDER_SLUG == $screen->id ) {
			add_meta_box(
				self::BUILDER_SLUG . '-meta-box',
				__( 'Layout Options', 'porto-functionality' ),
				'porto_block_meta_box',
				self::BUILDER_SLUG,
				'normal',
				'high'
			);
		}
	}

	public function admin_print_tabs( $views ) {
		if ( ! current_user_can( self::BUILDER_CAP ) ) {
			return;
		}

		$active_class = ' nav-tab-active';
		$current_type = '';

		if ( ! empty( $_REQUEST[ self::BUILDER_TAXONOMY_SLUG ] ) ) {
			$current_type = sanitize_text_field( $_REQUEST[ self::BUILDER_TAXONOMY_SLUG ] );
			$active_class = '';
		}

		$baseurl = add_query_arg( 'post_type', self::BUILDER_SLUG, admin_url( 'edit.php' ) );
		?>
		<div id="porto-builders-tabs" class="nav-tab-wrapper">
			<a class="nav-tab<?php echo esc_attr( $active_class ); ?>" href="<?php echo esc_url( $baseurl ); ?>"><?php esc_html_e( 'All', 'porto-functionality' ); ?></a>

		<?php
		foreach ( $this->builder_types as $type => $label ) :
			$active_class = '';
			if ( $current_type === $type ) {
				$active_class = ' nav-tab-active';
			}
			$builder_url = add_query_arg( self::BUILDER_TAXONOMY_SLUG, $type, $baseurl );
			echo '<a class="nav-tab' . $active_class . '" href="' . esc_url( $builder_url ) . '">' . esc_html( $label ) . '</a>';
		endforeach;
		?>
		</div>
		<?php
		return $views;
	}

	/**
	 * Add additional column to templates list table header
	 * 
	 * @since 3.1.0 - Remove author column from table header
	 * 
	 * @access public
	 */
	public function admin_column_header( $defaults ) {
		// Remove Author Field.
		unset( $defaults['author'] );

		$defaults['condition']      = __( 'Applied Conditions', 'porto-functionality' );
		$defaults['edit_condition'] = __( 'Edit Conditions', 'porto-functionality' );
		$defaults['shortcode']      = __( 'Shortcode', 'porto-functionality' );
		return $defaults;
	}

	/**
	 * Print Condition Status
	 * 
	 * @since 3.1.0 - Pring Display Condition Status on Templates List Table Column
	 * 
	 * @access public
	 * @static print_condition_status
	 */
	public static function print_condition_status( $conditions ) {
		if ( ! empty( $conditions ) ) {
			$names       = array(
				'archive/date'   => __( 'Date Archive', 'porto-functionaltiy' ),
				'archive/author' => __( 'Author Archive', 'porto-functionaltiy' ),
				'archive/search' => __( 'Search Results', 'porto-functionaltiy' ),
				'single/page'    => __( 'Pages', 'porto-functionaltiy' ),
				'single/404'     => __( '404 Page', 'porto-functionaltiy' ),
			);
			$_post_types = get_post_types( array( 'show_in_nav_menus' => true ), 'objects' );
			$post_types  = array();
			foreach ( $_post_types as $post_type => $object ) {
				$post_types[ $post_type ] = $object->labels->singular_name;
			}
			$post_types = apply_filters( 'porto_builder_post_types', $post_types );

			foreach ( $conditions as $index => $condition ) {
				if ( $index ) {
					echo '<br>';
				}

				echo '<span class="porto-template-condition-item">';

				if ( isset( $condition[0] ) && empty( $condition[0] ) ) {
					esc_html_e( 'All', 'porto-functionaltiy' );
					echo '</span>';
					continue;
				} /* elseif ( ! empty( $condition[0] ) ) {
					if ( 'single' == $condition[0] ) {
						esc_html_e( 'Single', 'porto-functionaltiy' );
					} else {
						esc_html_e( 'Archive', 'porto-functionaltiy' );
					}
				} */

				if ( ! empty( $condition[1] ) ) {

					if ( isset( $names[ $condition[1] ] ) ) {
						echo esc_html( $names[ $condition[1] ] );
					} elseif ( 0 === strpos( $condition[1], 'archive/' ) ) {
						$post_type = str_replace( 'archive/', '', $condition[1] );

						if ( 0 === strpos( $post_type, 'all' ) ) {
							$post_type = str_replace( 'all', '', $post_type );

							if ( isset( $post_types[ $post_type ] ) ) {
								printf( esc_html__( 'All %s Archives', 'porto-functionaltiy' ), esc_html( $post_types[ $post_type ] ) );
							}
						} else {
							if ( isset( $post_types[ $post_type ] ) ) {
								if ( 'product' == $post_type ) {
									esc_html_e( 'Shop Page', 'porto-functionaltiy' );
								} else if ( 'post' == $post_type ) {
									esc_html_e( 'Blog Page', 'porto-functionaltiy' );
								} else {
									printf( esc_html__( '%s Page', 'porto-functionaltiy' ), esc_html( $post_types[ $post_type ] ) );
								}
							}
						}
					} elseif ( 0 === strpos( $condition[1], 'single/' ) ) {
						$post_type = str_replace( 'single/', '', $condition[1] );

						if ( isset( $post_types[ $post_type ] ) ) {
							
							if ( empty( $condition[2] ) ) {
								printf( esc_html__( 'All %s pages', 'porto-functionaltiy' ), esc_html( $post_types[ $post_type ] ) );
							} else {
								$post_title = get_the_title( $condition[2] );

								printf( esc_html__( '%s page - "%s"', 'porto-functionaltiy' ), esc_html( $post_types[ $post_type ] ), $post_title );
							}
						}
					} elseif ( 0 === strpos( $condition[1], 'taxonomy/' ) ) {
						$tax_name = str_replace( 'taxonomy/', '', $condition[1] );
						$tax      = get_taxonomy( $tax_name );
						if ( $tax && ! empty( $tax->object_type ) && isset( $tax->label ) ) {
							if ( isset( $condition[0] ) && 'single' === $condition[0] ) {
								if ( ! empty( $condition[2] ) && ! empty( $condition[3] ) ) {
									printf( esc_html__( 'All %1$s pages of "%2$s"', 'porto-functionaltiy' ), ucfirst( $tax->object_type[0] ), esc_html( $condition[3] ) );
								} else {
									printf( esc_html__( 'All %1$s pages which have any %2$s', 'porto-functionaltiy' ), ucfirst( $tax->object_type[0] ), $tax->labels->singular_name );
								}
							} elseif ( isset( $condition[0] ) && 'archive' === $condition[0] ) {
								if ( ! empty( $condition[2] ) && ! empty( $condition[3] ) ) {
									printf( esc_html__( '%1$s - "%2$s"', 'porto-functionaltiy' ), esc_html( $tax->label ), esc_html( $condition[3] ) );
								} else {
									printf( esc_html__( 'All %s', 'porto-functionaltiy' ), esc_html( $tax->label ) );
								}
							}
						}
					}
				}

				/* if ( ! empty( $condition[2] ) && ! empty( $condition[3] ) ) {
					echo ' -> ';
					echo $condition[3];
				} */

				echo '</span>';
			}
		}
	}

	/**
	 * Template Builder Admin Page Table
	 * 
	 * @since 3.1.0 - Added - display condition edits in templates list page.
	 * 
	 * @access public
	 */
	public function admin_column_content( $column_name, $post_id ) {
		if ( 'condition' === $column_name ) {
			$conditions = get_post_meta( $post_id, '_porto_builder_conditions', true );

			PortoBuilders::print_condition_status( $conditions );
		} elseif ( 'edit_condition' == $column_name ) {

			$builder_type = get_post_meta( $post_id, self::BUILDER_TAXONOMY_SLUG, true );
			
			if ( 'type' != $builder_type && 'block' != $builder_type ) {
				printf( '<a href="#" data-post-id="%2$s" class="button button-primary button-large porto-template-edit-condition" title="%1$s"><i class="fas fa-network-wired" style="%3$s"></i><span class="text">%1$s</span></a><span class="spinner"></span>', esc_html__( 'Edit Display Conditions', 'porto-functionality' ), esc_attr( $post_id ), esc_attr( is_rtl() ? "margin-left: 5px;" : "margin-right: 5px;" ) );
			}

			if ( 'block' == $builder_type ) {
				printf( '<a href="%1$s" class="button button-primary button-large porto-go-page-layout" title="%2$s" target="_blank"><i class="fas fa-window-restore" style="%3$s"></i><span class="text">%2$s</span></a>', esc_url( admin_url( 'admin.php?page=porto-page-layouts' ) ), esc_html__( 'Go to Page Layout Builder', 'porto-functionality' ), esc_attr( is_rtl() ? "margin-left: 5px;" : "margin-right: 5px;" ) );
			}

		} elseif ( 'shortcode' === $column_name ) {
			$shortcode = sprintf( '[porto_block id="%d"]', $post_id );
			printf( '<input class="porto-input-shortcode" type="text" readonly="readonly" onfocus="this.select()" value="%s" />', esc_attr( $shortcode ) );
		}
	}

	public function add_builder_post() {
		if ( isset( $_POST['action'] ) && $_POST['action'] === 'porto-new-builder' ) {
			if ( current_user_can( self::BUILDER_CAP ) && ! empty( $_POST['builder_type'] ) && ! empty( $_POST['builder_name'] ) ) {
				check_admin_referer( 'porto-builder' );
				$builder_type = sanitize_text_field( $_POST['builder_type'] );
				$builder_name = sanitize_text_field( $_POST['builder_name'] );
	
				$post_meta = apply_filters( 'porto_create_new_builder_meta', array() );
	
				$post_data = array(
					'post_title' => $builder_name,
					'post_type'  => self::BUILDER_SLUG,
					'meta_input' => $post_meta,
				);
				$post_id   = wp_insert_post( $post_data );
				if ( $post_id && ! is_wp_error( $post_id ) ) {
					add_post_meta( $post_id, self::BUILDER_TAXONOMY_SLUG, $builder_type );
					/* Side Header Type Width */
					if ( ! empty( $_POST['header_type'] ) ) {
						add_post_meta( $post_id, 'header_type', $_POST['header_type'] );
						if ( 'side' ==  $_POST['header_type'] ) {
							if ( ! empty( $_POST['header_side_width'] ) ) {
								add_post_meta( $post_id, 'header_side_width', $_POST['header_side_width'] );
							}
							add_post_meta( $post_id, 'header_side_pos', $_POST['header_side_pos'] );
						}
					}
					// Content Preview Type for Type Builder
					if ( ! empty( $_POST['content_type'] ) ) {
						add_post_meta( $post_id, 'content_type', $_POST['content_type'] );
						if ( 'term' ==  $_POST['content_type'] ) {
							if ( ! empty( $_POST['content_type_term'] ) ) {
								add_post_meta( $post_id, 'content_type_term', $_POST['content_type_term'] );
							}
						}
					}
					if ( ( 'single' == $builder_type || 'archive' == $builder_type ) && ! empty( $_REQUEST['preview_type'] ) ) {
						if ( 'archive' == $builder_type ) {
							add_post_meta( $post_id, 'preview_id', sanitize_title( $_REQUEST['preview_type'] ) );
						} else {
							add_post_meta( $post_id, 'preview_type', sanitize_title( $_REQUEST['preview_type'] ) );
						}
					}
					wp_set_post_terms( $post_id, $builder_type, self::BUILDER_TAXONOMY_SLUG );
	
					$arg = array(
						'post'   => $post_id,
						'action' => 'edit',
					);
					if ( 'type' !== $builder_type ) {
						if ( defined( 'ELEMENTOR_VERSION' ) ) {
							$arg['action'] = 'elementor';
						} elseif ( defined( 'WPB_VC_VERSION' ) ) {
							$arg['classic-editor'] = '';
						}
					}
					wp_redirect(
						add_query_arg(
							$arg,
							esc_url( admin_url( 'post.php' ) )
						)
					);
					exit;
				}
			}
		}
	}

	public static function check_load_wpb_elements( $type ) {
		if ( ! defined( 'WPB_VC_VERSION' ) ) {
			return false;
		}
		global $porto_is_compile_infobox;
		if ( empty( $porto_is_compile_infobox ) ) {
			return true;
		}

		if ( 'post-new.php' == $GLOBALS['pagenow'] && isset( $_GET['post_type'] ) && PortoBuilders::BUILDER_SLUG == $_GET['post_type'] ) {
			return true;
		} elseif ( 'post.php' == $GLOBALS['pagenow'] && ( isset( $_GET['post'] ) || ! empty( $_REQUEST['post_ID'] ) ) ) {
			if ( isset( $_GET['post'] ) ) {
				$post = get_post( intval( $_GET['post'] ) );
				if ( ! $post ) {
					return false;
				}
				$post_type = $post->post_type;
			} else {
				$post_type = sanitize_text_field( $_REQUEST['post_type'] );
			}
			$post_id = isset( $_GET['post'] ) ? (int) $_GET['post'] : (int) $_REQUEST['post_ID'];

			if ( PortoBuilders::BUILDER_SLUG == $post_type && $type == get_post_meta( $post_id, PortoBuilders::BUILDER_TAXONOMY_SLUG, true ) ) {
				return true;
			}
		} elseif ( function_exists( 'porto_is_ajax' ) && porto_is_ajax() && isset( $_REQUEST['post_id'] ) ) {
			$post = get_post( intval( $_REQUEST['post_id'] ) );
			if ( is_object( $post ) && ( PortoBuilders::BUILDER_SLUG == $post->post_type || $type == $post->post_type ) ) {
				return true;
			}
		} elseif ( wp_doing_ajax() && isset( $_REQUEST['action'] ) && 0 === strpos( $_REQUEST['action'], 'porto_import_dummy' ) ) { // in demo import
			return true;
		} elseif ( function_exists( 'vc_is_inline' ) && vc_is_inline() ) {
			if ( is_admin() && isset( $_GET['post_type'] ) && PortoBuilders::BUILDER_SLUG == $_GET['post_type'] && isset( $_GET['post_id'] ) ) {
				$terms = wp_get_post_terms( (int) $_GET['post_id'], PortoBuilders::BUILDER_TAXONOMY_SLUG, array( 'fields' => 'names' ) );
				if ( ! empty( $terms ) && $type == $terms[0] ) {
					return true;
				}
			} elseif ( ! is_admin() ) {
				$post_id = (int) vc_get_param( 'vc_post_id' );
				if ( $post_id ) {
					$post  = get_post( $post_id );
					$terms = wp_get_post_terms( $post_id, PortoBuilders::BUILDER_TAXONOMY_SLUG, array( 'fields' => 'names' ) );
					if ( is_object( $post ) && PortoBuilders::BUILDER_SLUG == $post->post_type && ! empty( $terms ) && $type == $terms[0] ) {
						return true;
					}
				}
			}
		}
		return false;
	}

	/**
	 * save_custom_panel_options
	 *
	 * saves custom panel options on ajax save event
	 * - edit area size
	 *
	 * @since 6.1.0
	 */
	public function save_custom_panel_options( $post_id ) {
		if ( isset( $post_id ) && is_numeric( $post_id ) ) { // post save
			// save edit area size
			if ( isset( $_POST['porto_edit_area_width'] ) ) {
				update_post_meta( $post_id, 'porto_edit_area_width', esc_attr( $_POST['porto_edit_area_width'] ) );
			}
		} else { // ajax save
			$post_id = intval( vc_post_param( 'post_id' ) );
			vc_user_access()->checkAdminNonce()->validateDie()->wpAny( 'edit_posts', 'edit_pages' )->validateDie()->canEdit( $post_id )->validateDie();
			// save edit area size
			$edit_area_width = vc_post_param( 'porto_edit_area_width' );
			if ( $post_id > 0 && isset( $edit_area_width ) ) {
				update_post_meta( $post_id, 'porto_edit_area_width', esc_attr( $edit_area_width ) );
			}
		}
	}

	/**
	 * Reset condition after template builder is trashed
	 * 
	 * @since 3.1.0
	*/
	public function template_builder_trash( $post_id, $previous_status = '' ) {
		if ( 'porto_builder' == get_post_type( $post_id ) && ! empty( get_post_meta( $post_id, '_porto_builder_conditions', true ) ) ) {
			$builder_type = get_post_meta( $post_id, self::BUILDER_TAXONOMY_SLUG, true );
			
			if ( false !== strpos( $builder_type, 'block' ) ) {
				delete_post_meta( $post_id, '_porto_block_pos' );
			}
			delete_post_meta( $post_id, '_porto_builder_conditions' );
			$admin_tools = new Porto_Admin_Tools();
			$admin_tools->reset_conditions();
		}
	}
}

new PortoBuilders;
