File "class-eztoc-admin.php"

Full Path: /home/timepamn/dailynetworth.org/wp-content/plugins/easy-table-of-contents/includes/class-eztoc-admin.php
File size: 39.37 KB
MIME-type: text/x-php
Charset: utf-8

<?php

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

if ( ! class_exists( 'ezTOC_Admin' ) ) {

	/**
	 * Class ezTOC_Admin
	 */
	final class ezTOC_Admin {

		/**
		 * Setup plugin for admin use.
		 *
		 * @access private
		 * @since  1.0
		 * @static
		 */
		public function __construct() {

			$this->hooks();
		}

		/**
		 * Add the core admin hooks.
		 *
		 * @access private
		 * @since  1.0
		 * @static
		 */
		private function hooks() {
            global $pagenow;
			//phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Nonce verification not required here.
            if($pagenow == 'options-general.php' && isset($_REQUEST['page']) && !empty($_REQUEST['page']) && $_REQUEST['page'] == 'table-of-contents') {
                add_action( 'admin_head', array( $this,'_clean_other_plugins_stuff' ) );
            }
			add_action( 'admin_init', array( $this, 'registerScripts' ) );
			add_action( 'admin_menu', array( $this, 'menu' ) );
			add_action( 'init', array( $this, 'registerMetaboxes' ), 99 );
			add_filter( 'plugin_action_links_' . EZ_TOC_BASE_NAME, array( $this, 'pluginActionLinks' ), 10, 2 );
			add_action( 'admin_enqueue_scripts', array( $this, 'load_scripts' ) );
			add_action('wp_ajax_eztoc_send_query_message', array( $this, 'eztoc_send_query_message'));
			add_action('wp_ajax_eztoc_migrate_tocplus',  array( $this, 'eztoc_migrate_tocplus'));
		}

        /**
         * Attach to admin_head hook to hide all admin notices.
         *
         * @scope public
         * @since  2.0.33
         * @return void
         * @uses remove_all_actions()
         */
        public function _clean_other_plugins_stuff()
        {
            remove_all_actions('admin_notices');
            remove_all_actions('network_admin_notices');
            remove_all_actions('all_admin_notices');
            remove_all_actions('user_admin_notices');
        }

        /**
		 * Callback to add the Settings link to the plugin action links.
		 *
		 * @access private
		 * @since  1.0
		 * @static
		 *
		 * @param $links
		 * @param $file
		 *
		 * @return array
		 */
		public  function pluginActionLinks( $links, $file ) {

		    $url = add_query_arg( 'page', 'table-of-contents', self_admin_url( 'options-general.php' ) );
		    $setting_link = '<a href="' . esc_url( $url ) . '">' .esc_html__( 'Settings', 'easy-table-of-contents' ) . '</a> |';
		 	$setting_link .= '<a href="https://tocwp.com/contact/" target="_blank">' .esc_html__( ' Support', 'easy-table-of-contents' ) . '</a> |';
		 	$setting_link .= '<a href="https://tocwp.com/pricing/" target="_blank">' .esc_html__( ' Upgrade', 'easy-table-of-contents' ) . '</a> |';
		 	$setting_link .= '<a href="https://tocwp.com/" target="_blank">' .esc_html__( ' Website', 'easy-table-of-contents' ) . '</a>';
		    array_push( $links, $setting_link );
		    return $links;
		}

		/**
		 * Register the scripts used in the admin.
		 *
		 * @access private
		 * @since  1.0
		 * @static
		 */
		public function registerScripts() {
			
			$dismissed = explode ( ',', get_user_meta ( wp_get_current_user()->ID, 'dismissed_wp_pointers', true ) );
			$do_tour   = !in_array ( 'eztoc_subscribe_pointer', $dismissed );
			if ( $do_tour ) {
					wp_enqueue_style ( 'wp-pointer' );
					wp_enqueue_script ( 'wp-pointer' );						
			}	
			$min = defined ( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
			wp_register_script( 'cn_toc_admin_script', EZ_TOC_URL . "assets/js/admin{$min}.js", array( 'jquery', 'wp-color-picker' ), ezTOC::VERSION, true );
			wp_register_style( 'cn_toc_admin_style', EZ_TOC_URL . "assets/css/admin{$min}.css", array( 'wp-color-picker' ), ezTOC::VERSION );

			wp_enqueue_script( 'cn_toc_admin_script' );
            $data = array(
                'ajax_url'      		       => admin_url( 'admin-ajax.php' ),
                'eztoc_security_nonce'         => wp_create_nonce('eztoc_ajax_check_nonce'),
				'is_amp_activated'			   => (function_exists('ez_toc_is_amp_activated') && ez_toc_is_amp_activated())?1:0
            );

            $data = apply_filters( 'eztoc_localize_filter', $data, 'eztoc_admin_data' );

            wp_localize_script( 'cn_toc_admin_script', 'cn_toc_admin_data', $data );
		}
				                
		/**
		 * Callback to add plugin as a submenu page of the Options page.
		 *
		 * This also adds the action to enqueue the scripts to be loaded on plugin's admin pages only.
		 *
		 * @access private
		 * @since  1.0
		 * @static
		 */
		public function menu() {

			$page = add_submenu_page(
				'options-general.php',
				esc_html__( 'Table of Contents', 'easy-table-of-contents' ),
				esc_html__( 'Table of Contents', 'easy-table-of-contents' ),
				'manage_options',
				'table-of-contents',
				array( $this, 'page' )
			);

			add_action( 'admin_print_styles-' . $page, array( $this, 'enqueueScripts' ) );
		}

		/**
		 * Enqueue the scripts.
		 *
		 * @access private
		 * @since  1.0
		 * @static
		 */
		public function enqueueScripts() {

			wp_enqueue_script( 'cn_toc_admin_script' );
			wp_enqueue_style( 'cn_toc_admin_style' );
		}

		/**
		 * Callback to add the action which will register the table of contents post  metaboxes.
		 *
		 * Metaboxes will only be registered for the post types per user preferences.
		 *
		 * @access private
		 * @since  1.0
		 * @static
		 */
		public function registerMetaboxes() {
			if(apply_filters('ez_toc_register_metaboxes_flag', true)){
			foreach ( get_post_types() as $type ) {

				if ( in_array( $type, ezTOC_Option::get( 'enabled_post_types', array() ) ) ) {

					add_action( "add_meta_boxes_$type", array( $this, 'metabox' ) );
					add_action( "save_post_$type", array( $this, 'save' ), 10, 3 );
				}
			}
		  }
		}

		/**
		 * Callback to register the table of contents metaboxes.
		 *
		 * @access private
		 * @since  1.0
		 * @static
		 */
		public function metabox() {

			add_meta_box( 'ez-toc', esc_html__( 'Table of Contents', 'easy-table-of-contents' ), array( $this, 'displayMetabox' ) );
		}

		/**
		 * Callback to render the content of the table of contents metaboxes.
		 *
		 * @access private
		 * @since  1.0
		 * @static
		 *
		 * @param object $post The post object.
		 * @param        $atts
		 */
		public function displayMetabox( $post, $atts ) {

			// Add an nonce field so we can check for it on save.
			wp_nonce_field( 'ez_toc_save', '_ez_toc_nonce' );

			$suppress      = get_post_meta( $post->ID, '_ez-toc-disabled', true ) == 1 ? true : false;
			$insert        = get_post_meta( $post->ID, '_ez-toc-insert', true ) == 1 ? true : false;
			$header_label  = get_post_meta( $post->ID, '_ez-toc-header-label', true );
			$alignment     = get_post_meta( $post->ID, '_ez-toc-alignment', true );
			$headings      = get_post_meta( $post->ID, '_ez-toc-heading-levels', true );
			$exclude       = get_post_meta( $post->ID, '_ez-toc-exclude', true );
			$altText       = get_post_meta( $post->ID, '_ez-toc-alttext', true );
			$initial_view  = get_post_meta( $post->ID, '_ez-toc-visibility_hide_by_default', true );
			$initial_view_device  = get_post_meta( $post->ID, '_ez-toc-visibility_hide_by_device', true );
			$hide_counter  = get_post_meta( $post->ID, '_ez-toc-hide_counter', true );
			$device_target = get_post_meta( $post->ID, '_ez-toc-device-target', true );

			$position  = get_post_meta( $post->ID, '_ez-toc-position-specific', true );			

			$custom_para_number  = get_post_meta( $post->ID, '_ez-toc-s_custom_para_number', true );		

			$blockqoute_checkbox  = get_post_meta( $post->ID, '_ez-toc-s_blockqoute_checkbox', true );		

			$custom_img_number  = get_post_meta( $post->ID, '_ez-toc-s_custom_img_number', true );

			if ( ! is_array( $headings ) ) {

				$headings = array();
			}
			?>

			<table class="form-table">

				<tbody>

				<tr>
					<th scope="row"></th>
					<td>

						<?php if ( in_array( get_post_type( $post ), ezTOC_Option::get( 'auto_insert_post_types', array() ) ) ) :

							ezTOC_Option::checkbox(
								array(
									'id'      => 'disabled-toc',
									'desc'    => esc_html__( 'Disable the automatic insertion of the table of contents.', 'easy-table-of-contents' ),
									'default' => $suppress,
								),
								$suppress
							);

						elseif( in_array( get_post_type( $post ), ezTOC_Option::get( 'enabled_post_types', array() ) ) ):

							ezTOC_Option::checkbox(
								array(
									'id'      => 'insert-toc',
									'desc'    => esc_html__( 'Insert table of contents.', 'easy-table-of-contents' ),
									'default' => $insert,
								),
								$insert
							);

						endif; ?>

					</td>
				</tr>

				<tr>
					<th scope="row"><?php esc_html_e( 'Header Label', 'easy-table-of-contents' ); ?></th>
					<td>
						<?php
						ezTOC_Option::text(
							array(
								'id' => 'header-label',
								'desc' => '<br>'.__( 'Eg: Contents, Table of Contents, Page Contents', 'easy-table-of-contents' ),
								'default' => $header_label,
							),
							$header_label
						);
						?>
					</td>
				</tr>

				<tr>
					<th scope="row"><?php esc_html_e( 'Position', 'easy-table-of-contents' ); ?></th>
					<td>
						<?php
						ezTOC_Option::select(
							array(
								'id' => 'position-specific',
								'desc' =>esc_html__( 'Choose where where you want to display the table of contents.', 'easy-table-of-contents' ), 
								'options' => array(
									'' =>esc_html__( 'Select Position', 'easy-table-of-contents' ),
									'before' =>esc_html__( 'Before first heading (default)', 'easy-table-of-contents' ),
									'after' =>esc_html__( 'After first heading', 'easy-table-of-contents' ),
									'afterpara' =>esc_html__( 'After first paragraph', 'easy-table-of-contents' ),
									'aftercustompara' =>esc_html__( 'After paragraph number', 'easy-table-of-contents' ),
									'aftercustomimg' =>esc_html__( 'After Image number', 'easy-table-of-contents' ),
									'top' =>esc_html__( 'Top', 'easy-table-of-contents' ),
									'bottom' =>esc_html__( 'Bottom', 'easy-table-of-contents' ),
								),
								'default' => $position,
							),
							$position
						);
						?>
					</td>
				</tr>
				<tr>
					<th scope="row"><?php esc_html_e( 'Select Image', 'easy-table-of-contents' ); ?></th>
					<td>
						<?php
							ezTOC_Option::number(
								array(
									'id' => 's_custom_img_number',
									'name' =>esc_html__( 'Select Paragraph', 'easy-table-of-contents' ),
									'desc' =>esc_html__( 'Select Image after which ETOC should get display', 'easy-table-of-contents' ),
									'type' => 'number',
									'size' => 'small',
									'default' => $custom_img_number,
							),
								$custom_img_number
							);
						?>
					</td>
				</tr>
				<tr>
					<th scope="row"><?php esc_html_e( 'Select Paragraph', 'easy-table-of-contents' ); ?></th>
					<td>
						<?php
							ezTOC_Option::number(
								array(
									'id' => 's_custom_para_number',
									'desc' =>esc_html__( 'Select paragraph after which ETOC should get display', 'easy-table-of-contents' ),
									'type' => 'number',
									'size' => 'small',
									'default' => $custom_para_number,
							),
								$custom_para_number
							);
						?>
					</td>
				</tr>
				<tr>
					<th scope="row"><?php esc_html_e( 'Exclude Blockqoute', 'easy-table-of-contents' ); ?></th>
					<td>
						<?php
							ezTOC_Option::checkbox(
								array(
								'id' => 's_blockqoute_checkbox',
								'name' =>esc_html__( 'Exclude Blockqoute', 'easy-table-of-contents' ),
								'desc' =>esc_html__( 'Do not consider Paragraphs which are inside Blockqoute.', 'easy-table-of-contents' ),
								'default' => false,
							),
								$blockqoute_checkbox
							);
						?>
					</td>
				</tr>

				<tr>
					<th scope="row"><?php esc_html_e( 'Appearance:', 'easy-table-of-contents' ); ?></th>
					<td>
						<?php
						ezTOC_Option::descriptive_text(
							array(
								'id' => 'appearance-desc',
								'desc' => '<p><strong>' . esc_html__( 'NOTE:', 'easy-table-of-contents' ) . '</strong></p>' .
								          '<ul>' .
								          '<li>' . esc_html__( 'Using the appearance options below will override the global Appearance settings.', 'easy-table-of-contents' ) . '</li>' .
								          '</ul>',
							)
						);
						?>
					</td>
				</tr>
				<tr>
					<th scope="row"><?php esc_html_e( 'Device Target', 'easy-table-of-contents' ); ?></th>
					<td>
						<?php
						ezTOC_Option::select(
							array(
								'id' => 'device-target',
								'options' => array(
									'' =>esc_html__( 'Select', 'easy-table-of-contents' ),
									'mobile' =>esc_html__( 'Mobile', 'easy-table-of-contents' ),
									'desktop' =>esc_html__( 'Desktop', 'easy-table-of-contents' )
								),
								'default' => $device_target,
							),
							$device_target
						);
						?>
					</td>
				</tr>				
				<tr>
					<th scope="row"><?php esc_html_e( 'Alignment', 'easy-table-of-contents' ); ?></th>
					<td>
						<?php
						ezTOC_Option::select(
							array(
								'id' => 'toc-alignment',
								'options' => array(
									'none' =>esc_html__( 'None (Default)', 'easy-table-of-contents' ),
									'left' =>esc_html__( 'Left', 'easy-table-of-contents' ),
									'right' =>esc_html__( 'Right', 'easy-table-of-contents' ),
									'center' =>esc_html__( 'Center', 'easy-table-of-contents' ),
								),
								'default' => $alignment,
							),
							$alignment
						);
						?>
					</td>
				</tr>
				<tr>
					<th scope="row"><?php esc_html_e( 'Advanced:', 'easy-table-of-contents' ); ?></th>
					<td>
						<?php
						ezTOC_Option::descriptive_text(
							array(
								'id' => 'exclude-desc',
								'name' => '',
								'desc' => '<p><strong>' . esc_html__( 'NOTE:', 'easy-table-of-contents' ) . '</strong></p>' .
								          '<ul>' .
								          '<li>' . esc_html__( 'Using the advanced options below will override the global advanced settings.', 'easy-table-of-contents' ) . '</li>' .
								          '</ul>',
							)
						);
						?>
					</td>
				</tr>

				<tr>
					<th scope="row"><?php esc_html_e( 'Headings:', 'easy-table-of-contents' ); ?></th>
					<td>
						<?php
						ezTOC_Option::checkboxgroup(
							array(
								'id' => 'heading-levels',
								'desc' => esc_html__( 'Select the heading to consider when generating the table of contents. Deselecting a heading will exclude it.', 'easy-table-of-contents' ),
								'options' => array(
									'1' =>esc_html__( 'Heading 1 (h1)', 'easy-table-of-contents' ),
									'2' =>esc_html__( 'Heading 2 (h2)', 'easy-table-of-contents' ),
									'3' =>esc_html__( 'Heading 3 (h3)', 'easy-table-of-contents' ),
									'4' =>esc_html__( 'Heading 4 (h4)', 'easy-table-of-contents' ),
									'5' =>esc_html__( 'Heading 5 (h5)', 'easy-table-of-contents' ),
									'6' =>esc_html__( 'Heading 6 (h6)', 'easy-table-of-contents' ),
								),
								'default' => array(),
							),
							array_map( 'absint', $headings )
						);
						?>
					</td>
				</tr>
                                <tr>
                                    <th scope="row"><?php esc_html_e( 'Initial View', 'easy-table-of-contents' ); ?></th>
                                    <td>
                                        <?php
                                            ezTOC_Option::checkbox(
                                                array(
							'id' => 'visibility_hide_by_default',
							'name' =>esc_html__( 'Initial View', 'easy-table-of-contents' ),
							'desc' =>esc_html__( 'Initially hide the table of contents.', 'easy-table-of-contents' ),
							'default' => false,
						),
                                                $initial_view
                                            );
                                        ?>
                                    </td>
                                </tr>
                <tr>
                    <th scope="row"><?php esc_html_e( 'Hide Counter', 'easy-table-of-contents' ); ?></th>
                    <td>
                        <?php
                            ezTOC_Option::checkbox(
                                array(
                            		'id' => 'hide_counter',
                            		'name' =>esc_html__( 'Hide Counter', 'easy-table-of-contents' ),
                            		'desc' =>esc_html__( 'Do not show counters for the table of contents.', 'easy-table-of-contents' ),
                            		'default' => false,
                                ),
                                $hide_counter
                            );
                        ?>
                    </td>
                </tr>

				<?php   do_action('eztoc_pro_single_post_settings' , $post->ID); ?>

				<tr>
					<th scope="row"><?php esc_html_e( 'Alternate Headings', 'easy-table-of-contents' ); ?></th>
					<td>
						<?php
						ezTOC_Option::textarea(
							array(
								'id' => 'alttext',
								'desc' =>esc_html__( 'Specify alternate table of contents header string. Add the header to be replaced and the alternate header on a single line separated with a pipe <code>|</code>. Put each additional original and alternate header on its own line.', 'easy-table-of-contents' ),
								'size' => 'large',
								'default' => '',
							),
							$altText
						);
						?>
					</td>
				</tr>
				<tr>
					<th scope="row"></th>
					<td>
						<?php
						ezTOC_Option::descriptive_text(
							array(
								'id' => 'alttext-desc',
								'name' => '',
								'desc' => '<p><strong>' . esc_html__( 'Examples:', 'easy-table-of-contents' ) . '</strong></p>' .
								          '<ul>' .
								          '<li><code>' . esc_html__( 'Level [1.1]|Alternate TOC Header' , 'easy-table-of-contents' ).'</code> '.esc_html__( 'Replaces Level [1.1] in the table of contents with Alternate TOC Header.', 'easy-table-of-contents' ) . '</li>' .
								          '</ul>' .
								          '<p><strong>' . esc_html__( 'Note:', 'easy-table-of-contents' ) . '</strong>' . esc_html__( 'This is case sensitive.', 'easy-table-of-contents' ) . '</p>',
							)
						);
						?>
					</td>
				</tr>
				<tr>
					<th scope="row"><?php esc_html_e( 'Exclude Headings', 'easy-table-of-contents' ); ?></th>
					<td>
						<?php
						ezTOC_Option::text(
							array(
								'id' => 'exclude',
								'desc' =>esc_html__( 'Specify headings to be excluded from appearing in the table of contents. Separate multiple headings with a pipe <code>|</code>. Use an asterisk <code>*</code> as a wildcard to match other text.', 'easy-table-of-contents' ),
								'size' => 'large',
								'default' => '',
							),
							$exclude
						);
						?>
					</td>
				</tr>
				<tr>
					<th scope="row"></th>
					<td>
						<?php
						ezTOC_Option::descriptive_text(
							array(
								'id' => 'exclude-desc',
								'name' => '',
								'desc' => '<p><strong>' . esc_html__( 'Examples:', 'easy-table-of-contents' ) . '</strong></p>' .
								          '<ul>' .
								          '<li><code>' . esc_html__( 'Fruit*', 'easy-table-of-contents' ) . '</code>' . esc_html__( 'Ignore headings starting with "Fruit".', 'easy-table-of-contents' ) . '</li>' .
								          '<li><code>' . esc_html__( '*Fruit Diet*', 'easy-table-of-contents' ) . '</code>' . esc_html__( 'Ignore headings with "Fruit Diet" somewhere in the heading.', 'easy-table-of-contents' ) . '</li>' .
								          '<li><code>' . esc_html__( 'Apple Tree|Oranges|Yellow Bananas', 'easy-table-of-contents' ) . '</code>' . esc_html__( 'Ignore headings that are exactly "Apple Tree", "Oranges" or "Yellow Bananas".', 'easy-table-of-contents' ) . '</li>' .
								          '</ul>' .
								          '<p><code>' .esc_html__( 'Note:', 'easy-table-of-contents' ) . '</strong>' . esc_html__( ' This is not case sensitive.', 'easy-table-of-contents' ) . '</p>',
							)
						);
						?>
					</td>
				</tr>
				
				</tbody>
			</table>

			<?php
		}

		/**
		 * Callback which saves the user preferences from the table of contents metaboxes.
		 *
		 * @access private
		 * @since  1.0
		 * @static
		 *
		 * @param int    $post_id The post ID.
		 * @param object $post    The post object.
		 * @param bool   $update  Whether this is an existing post being updated or not.
		 */
		public function save( $post_id, $post, $update ) {

			if ( current_user_can( 'edit_post', $post_id ) &&
			     isset( $_REQUEST['_ez_toc_nonce'] ) &&
			     wp_verify_nonce( $_REQUEST['_ez_toc_nonce'], 'ez_toc_save' )
			) {

				// Checkboxes are present if checked, absent if not.
				if ( isset( $_REQUEST['ez-toc-settings']['disabled-toc'] ) ) {

					update_post_meta( $post_id, '_ez-toc-disabled', true );

				} else {

					update_post_meta( $post_id, '_ez-toc-disabled', false );

				}

				if ( isset( $_REQUEST['ez-toc-settings']['insert-toc'] ) ) {

					update_post_meta( $post_id, '_ez-toc-insert', true );

				} else {

					update_post_meta( $post_id, '_ez-toc-insert', false );
				}

				if ( isset( $_REQUEST['ez-toc-settings']['header-label'] )) {
					$header_label = sanitize_text_field( $_REQUEST['ez-toc-settings']['header-label'] );					
					update_post_meta( $post_id, '_ez-toc-header-label', $header_label );
				} 

				if ( isset( $_REQUEST['ez-toc-settings']['device-target'] ) ) {
				    $align_values = array(
				                        '',
				                        'mobile',
				                        'desktop'
				                    );
				    $device_target = sanitize_text_field( $_REQUEST['ez-toc-settings']['device-target'] );					
				    if( in_array( $device_target, $align_values ) ) {
				        update_post_meta( $post_id, '_ez-toc-device-target', $device_target );
				    }
				}

				if ( isset( $_REQUEST['ez-toc-settings']['toc-alignment'] ) ) {
				    $align_values = array(
				                        'none',
				                        'left',
				                        'right',
				                        'center'
				                    );
				    $alignment = sanitize_text_field( $_REQUEST['ez-toc-settings']['toc-alignment'] );					
				    if( in_array( $alignment, $align_values ) ) {
				        update_post_meta( $post_id, '_ez-toc-alignment', $alignment );
				    }
				}

				if ( isset( $_REQUEST['ez-toc-settings']['heading-levels'] ) && ! empty( $_REQUEST['ez-toc-settings']['heading-levels'] ) ) {

					if ( is_array( $_REQUEST['ez-toc-settings']['heading-levels'] ) ) {

						$headings = array_map( 'absint', $_REQUEST['ez-toc-settings']['heading-levels'] );

					} else {

						$headings = array();
					}

					update_post_meta( $post_id, '_ez-toc-heading-levels', $headings );

				} else {

					update_post_meta( $post_id, '_ez-toc-heading-levels', array() );
				}

				if ( isset( $_REQUEST['ez-toc-settings']['alttext'] ) && ! empty( $_REQUEST['ez-toc-settings']['alttext'] ) ) {

					$alttext = '';
					
					if ( is_string( $_REQUEST['ez-toc-settings']['alttext'] ) ) {

						$alttext = trim( $_REQUEST['ez-toc-settings']['alttext'] );

							/*
						* This is basically `esc_html()` but does not encode quotes.
						* This is to allow angle brackets and such which `wp_kses_post` would strip as "evil" scripts.
						*/
						$alttext = wp_check_invalid_utf8( $alttext );
						$alttext = _wp_specialchars( $alttext, ENT_NOQUOTES );

					} 					

					update_post_meta( $post_id, '_ez-toc-alttext', wp_kses_post( $alttext ) );

				} else {

					update_post_meta( $post_id, '_ez-toc-alttext', '' );
				}
                                
                                if ( isset( $_REQUEST['ez-toc-settings']['visibility_hide_by_default'] ) && ! empty( $_REQUEST['ez-toc-settings']['visibility_hide_by_default'] ) ) {

					update_post_meta( $post_id, '_ez-toc-visibility_hide_by_default', true );

				} else {

					update_post_meta( $post_id, '_ez-toc-visibility_hide_by_default', false );
				}

				if ( isset( $_REQUEST['ez-toc-settings']['hide_counter'] ) ) {

					update_post_meta( $post_id, '_ez-toc-hide_counter', true );

				} else {

					update_post_meta( $post_id, '_ez-toc-hide_counter', false );
				}

				if ( isset( $_REQUEST['ez-toc-settings']['exclude'] ) && ! empty( $_REQUEST['ez-toc-settings']['exclude'] ) ) {

					$exclude = '';
					if ( is_string( $_REQUEST['ez-toc-settings']['exclude'] ) ) {

						$exclude = trim( $_REQUEST['ez-toc-settings']['exclude'] );

							/*
						* This is basically `esc_html()` but does not encode quotes.
						* This is to allow angle brackets and such which `wp_kses_post` would strip as "evil" scripts.
						*/
						$exclude = wp_check_invalid_utf8( $exclude );
						$exclude = _wp_specialchars( $exclude, ENT_NOQUOTES );

					} 					

					update_post_meta( $post_id, '_ez-toc-exclude', wp_kses_post( $exclude ) );

				} else {

					update_post_meta( $post_id, '_ez-toc-exclude', '' );
				}

				if ( isset( $_REQUEST['ez-toc-settings']['position-specific'] ) ) {
				    $align_values = array(
						'',
						'before',
						'after',
						'afterpara',
						'aftercustompara',
						'aftercustomimg',
						'top',
						'bottom',
					);
				    $position = sanitize_text_field( $_REQUEST['ez-toc-settings']['position-specific'] );					
				    if( in_array( $position, $align_values ) ) {
				        update_post_meta( $post_id, '_ez-toc-position-specific', $position );
				    }

					
					if($position == 'aftercustompara' ||  $position == 'afterpara') {
						if (isset($_REQUEST['ez-toc-settings']['s_blockqoute_checkbox'])) {
							update_post_meta( $post_id, '_ez-toc-s_blockqoute_checkbox', 1 );
						}else{
							update_post_meta( $post_id, '_ez-toc-s_blockqoute_checkbox', 0 );
						}
					}

				    if($position == 'aftercustompara' ) {	
						if (isset($_REQUEST['ez-toc-settings']['s_custom_para_number'])) {	
						$s_custom_para_number = sanitize_text_field( $_REQUEST['ez-toc-settings']['s_custom_para_number'] );			
				        update_post_meta( $post_id, '_ez-toc-s_custom_para_number', $s_custom_para_number );
						}
				    }

				    if($position == 'aftercustomimg' ) {
						if (isset($_REQUEST['ez-toc-settings']['s_custom_img_number'])) {	
						$s_custom_img_number = sanitize_text_field( $_REQUEST['ez-toc-settings']['s_custom_img_number'] );					
				        update_post_meta( $post_id, '_ez-toc-s_custom_img_number', $s_custom_img_number );
						}
				    }
				}

				do_action('eztoc_pro_single_post_save_settings' , $post_id , $_REQUEST);

			}

		}


	     /**
	     * Enqueue Admin js scripts
	     *
	     */
		public function load_scripts($pagenow){
			
			 if($pagenow == 'settings_page_table-of-contents'){
			 	$min = defined ( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
				wp_enqueue_script( 'eztoc-admin-js', EZ_TOC_URL . "assets/js/eztoc-admin{$min}.js",array('jquery'), ezTOC::VERSION,true );

				 $data = array(     
					'ajax_url'      		       => admin_url( 'admin-ajax.php' ),
					'eztoc_security_nonce'         => wp_create_nonce('eztoc_ajax_check_nonce'),  
				);								

				$data = apply_filters('eztoc_localize_filter',$data,'eztoc_admin_data');

				wp_localize_script( 'eztoc-admin-js', 'eztoc_admin_data', $data );

				$this->eztoc_dequeue_scripts();

			 }
			  
		}

     /**
     * This is a ajax handler function for sending email from user admin panel to us. 
     * @return type json string
     */

		public function eztoc_send_query_message(){   
		    
		        if ( ! isset( $_POST['eztoc_security_nonce'] ) ){
		           return; 
		        }
		        if ( !wp_verify_nonce( $_POST['eztoc_security_nonce'], 'eztoc_ajax_check_nonce' ) ){
		           return;  
		        }   
				if ( !current_user_can( 'manage_options' ) ) {
					return;  					
				}
		        $message        = $this->eztoc_sanitize_textarea_field($_POST['message']); 
		        $email          = sanitize_email($_POST['email']);
		                                
		        if(function_exists('wp_get_current_user')){

		            $user           = wp_get_current_user();

		         
		            $message = '<p>'.$message.'</p><br><br>'.'Query from Easy Table of Content plugin support tab';
		            
		            $user_data  = $user->data;        
		            $user_email = $user_data->user_email;     
		            
		            if($email){
		                $user_email = $email;
		            }            
		            //php mailer variables        
		            $sendto    = '[email protected]';
		            $subject   = "Easy Table of Content Query";
		            
		            $headers[] = 'Content-Type: text/html; charset=UTF-8';
		            $headers[] = 'From: '. esc_attr($user_email);            
		            $headers[] = 'Reply-To: ' . esc_attr($user_email);
		            // Load WP components, no themes.   

		            $sent = wp_mail($sendto, $subject, $message, $headers); 

		            if($sent){

		                 echo wp_json_encode(array('status'=>'t'));  

		            }else{

		                echo wp_json_encode(array('status'=>'f'));            

		            }
		            
		        }
		                        
		        wp_die();           
		}

		public function eztoc_sanitize_textarea_field( $str ) {

			if ( is_object( $str ) || is_array( $str ) ) {
				return '';
			}

			$str = (string) $str;

			$filtered = wp_check_invalid_utf8( $str );

			if ( strpos( $filtered, '<' ) !== false ) {
				$filtered = wp_pre_kses_less_than( $filtered );
				// This will strip extra whitespace for us.
				$filtered = wp_strip_all_tags( $filtered, false );

				// Use HTML entities in a special case to make sure no later
				// newline stripping stage could lead to a functional tag.
				$filtered = str_replace( "<\n", "&lt;\n", $filtered );
			}
			
			$filtered = trim( $filtered );

			$found = false;
			while ( preg_match( '/%[a-f0-9]{2}/i', $filtered, $match ) ) {
				$filtered = str_replace( $match[0], '', $filtered );
				$found    = true;
			}

			if ( $found ) {
				// Strip out the whitespace that may now exist after removing the octets.
				$filtered = trim( preg_replace( '/ +/', ' ', $filtered ) );
			}

			return $filtered;
		}

		/**
		 * Callback used to render the admin options page.
		 *
		 * @access private
		 * @since  1.0
		 * @static
		 */
		public function page() {

			include EZ_TOC_PATH . '/includes/inc.admin-options-page.php';
		}

		/**
		 * Function used to dequeue unwanted scripts on ETOC settings page.
		 *
		 * @since  2.0.52
		 */
		public function eztoc_dequeue_scripts() {						
				wp_dequeue_script( 'chats-js' ); 
				wp_dequeue_script( 'custom_wp_admin_js' );						            
		}

		/**
		 * migrate tocplus to eztoc
		 * @return void
		 */
		public function eztoc_migrate_tocplus(){

			if (!current_user_can('manage_options')) {
				wp_send_json_error(esc_html__('You do not have sufficient permissions to perform this action.', 'easy-table-of-contents'));
				wp_die();
			}
		
			check_ajax_referer('eztoc_ajax_check_nonce', 'nonce');

			if (!class_exists('TOC_Plus')) {
				wp_send_json_error(esc_html__('TOCPlus plugin is not installed.', 'easy-table-of-contents'));
				wp_die();
			}

			$options_to_update = get_option('ez-toc-settings') ? get_option('ez-toc-settings') : array();
			// tocplus default options
			$defaults = [  
				'fragment_prefix'                    => 'i',
				'position'                           => 1,
				'start'                              => 4,
				'show_heading_text'                  => true,
				'heading_text'                       => 'Contents',
				'auto_insert_post_types'             => [ 'page' ],
				'show_heirarchy'                     => true,
				'ordered_list'                       => true,
				'smooth_scroll'                      => false,
				'smooth_scroll_offset'               => 30,
				'visibility'                         => true,
				'visibility_show'                    => 'show',
				'visibility_hide'                    => 'hide',
				'visibility_hide_by_default'         => false,
				'width'                              => 'Auto',
				'width_custom'                       => '275',
				'width_custom_units'                 => 'px',
				'wrapping'                           => 0,
				'font_size'                          => '95',
				'font_size_units'                    => '%',
				'theme'                              => 1,
				'custom_background_colour'           => '#f9f9f9',
				'custom_border_colour'               => '#aaaaaa',
				'custom_title_colour'                => '#',
				'custom_links_colour'                => '#',
				'custom_links_hover_colour'          => '#',
				'custom_links_visited_colour'        => '#',
				'lowercase'                          => false,
				'hyphenate'                          => false,
				'bullet_spacing'                     => false,
				'include_homepage'                   => false,
				'exclude_css'                        => false,
				'exclude'                            => '',
				'heading_levels'                     => [ 1, 2, 3, 4, 5, 6 ],
				'restrict_path'                      => '',
				'css_container_class'                => '',
				'sitemap_show_page_listing'          => true,
				'sitemap_show_category_listing'      => true,
				'sitemap_heading_type'               => 3,
				'sitemap_pages'                      => 'Pages',
				'sitemap_categories'                 => 'Categories',
				'show_toc_in_widget_only'            => false,
				'show_toc_in_widget_only_post_types' => [ 'page' ],
				'rest_toc_output'                    => false,
				'schema_sitenav_checkbox'			 => false,
				'eztoc_schema_sitenav_yoast_compat'  => false,

			];
			
			$options       = get_option( 'toc-options', false );

			

			$options       = wp_parse_args( $options, $defaults );

			if( !$options ){
				wp_send_json_error(esc_html__('No data found to migrate.', 'easy-table-of-contents'));
				wp_die();
			}

			if( isset( $options['fragment_prefix'] )){
				$options_to_update['fragment_prefix'] = $options['fragment_prefix'];
			}

			if( isset( $options['position'] )){

				if($options['position'] == 1 ){
					$options_to_update['position'] = 'after';
				}
				if($options['position'] == 2 ){
					$options_to_update['position'] = 'top';
				}
				if($options['position'] == 3 ){
					$options_to_update['position'] = 'bottom';
				}
				if($options['position'] == 4 ){
					$options_to_update['position'] = 'before';
				}
				
			}

			if( isset( $options['start'] )){
				$options_to_update['start'] = $options['start'];
			}

			if( isset( $options['show_heading_text'] )){
				$options_to_update['show_heading_text'] = $options['show_heading_text'];
			}

			if( isset( $options['heading_text'] )){
				$options_to_update['heading_text'] = $options['heading_text'];
			}

			if( isset( $options['auto_insert_post_types'] )){
				$options_to_update['auto_insert_post_types'] = $options['auto_insert_post_types'];
				$options_to_update['enabled_post_types'] = $options['auto_insert_post_types'];
			}

			if( isset( $options['show_heirarchy'] )){
				$options_to_update['show_hierarchy'] = $options['show_heirarchy'];
			}

			if( isset( $options['ordered_list'] )){
				$options_to_update['counter'] = 'numeric';
			}

			if( isset( $options['smooth_scroll'] )){
				$options_to_update['smooth_scroll'] = $options['smooth_scroll'];
			}

			if( isset( $options['smooth_scroll_offset'] )){
				$options_to_update['smooth_scroll_offset'] = $options['smooth_scroll_offset'];
			}

			if( isset( $options['visibility'] )){
				$options_to_update['visibility'] = $options['visibility'];
			}

			if( isset( $options['visibility_hide_by_default'] )){
				$options_to_update['visibility_hide_by_default'] = $options['visibility_hide_by_default'];
			}

			if( isset( $options['width'] )){
				$options_to_update['width'] = $options['width'];
			}

			if( isset( $options['width_custom'] )){
				$options_to_update['width_custom'] = $options['width_custom'];
			}

			if( isset( $options['width_custom_units'] )){
				$options_to_update['width_custom_units'] = $options['width_custom_units'];
			}

			if( isset( $options['wrapping'] )){
				$options_to_update['wrapping'] = $options['wrapping'];
			}

			if( isset( $options['font_size'] )){
				$options_to_update['font_size'] = $options['font_size'];
			}

			if( isset( $options['font_size_units'] )){
				$options_to_update['font_size_units'] = $options['font_size_units'];
			}

			if( isset( $options['theme'] )){
				if($options['theme'] == 1){
					$options_to_update['theme'] = 'grey';
				}
				if($options['theme'] == 2){
					$options_to_update['theme'] = 'light-blue';
				}
				if($options['theme'] == 3){
					$options_to_update['theme'] = 'white';
				}
				if($options['theme'] == 4){
					$options_to_update['theme'] = 'black';
				}
				if($options['theme'] == 99){
					$options_to_update['theme'] = 'transparent';
				}
				if($options['theme'] == 100){
					$options_to_update['theme'] = 'custom';
				}
			}

			if( isset( $options['custom_background_colour'] )){
				$options_to_update['custom_background_colour'] = $options['custom_background_colour'];
			}

			if( isset( $options['custom_border_colour'] )){
				$options_to_update['custom_border_colour'] = $options['custom_border_colour'];
			}

			if( isset( $options['custom_title_colour'] )){
				$options_to_update['custom_title_colour'] = $options['custom_title_colour'];
			}

			if( isset( $options['custom_links_colour'] )){
				$options_to_update['custom_link_colour'] = $options['custom_links_colour'];
			}

			if( isset( $options['custom_links_hover_colour'] )){
				$options_to_update['custom_link_hover_colour'] = $options['custom_links_hover_colour'];
			}

			if( isset( $options['custom_links_visited_colour'] )){
				$options_to_update['custom_link_visited_colour'] = $options['custom_links_visited_colour'];
			}

			if( isset( $options['lowercase'] )){
				$options_to_update['lowercase'] = $options['lowercase'];
			}

			if( isset( $options['hyphenate'] )){
				$options_to_update['hyphenate'] = $options['hyphenate'];
			}


			if( isset( $options['include_homepage'] )){
				$options_to_update['include_homepage'] = $options['include_homepage'];
			}

			if( isset( $options['exclude_css'] )){
				$options_to_update['exclude_css'] = $options['exclude_css'];
			}

			if( isset( $options['exclude'] )){
				$options_to_update['exclude'] = $options['exclude'];
			}

			if( isset( $options['heading_levels'] )){
				$options_to_update['heading_levels'] = $options['heading_levels'];
			}

			if( isset( $options['restrict_path'] )){
				$options_to_update['restrict_path'] = $options['restrict_path'];
			}

			if( isset( $options['css_container_class'] )){
				$options_to_update['css_container_class'] = $options['css_container_class'];
			}

			if( isset( $options['rest_toc_output'] )){
				$options_to_update['disable_in_restapi'] = $options['rest_toc_output'] ? false : true;
			}
			
			if(!empty($options_to_update)){
				update_option('ez-toc-settings', $options_to_update);
				wp_send_json_success(esc_html__('Migration done successfully.', 'easy-table-of-contents'));
			}

		}
	}

	new ezTOC_Admin();

}