/home/arranoyd/eventrify/wp-content/plugins/content-protector/src/admin/class-ps-settings.php
<?php

namespace passster;


if ( !class_exists( 'PS_Settings' ) ) {
    class PS_Settings
    {
        /**
         * Sections array.
         *
         * @var   array
         * @since 1.0.0
         */
        private  $sections_array = array() ;
        /**
         * Fields array.
         *
         * @var   array
         * @since 1.0.0
         */
        private  $fields_array = array() ;
        /**
         * Constructor.
         *
         * @since  1.0.0
         */
        public function __construct()
        {
            // Enqueue the admin scripts.
            add_action( 'admin_enqueue_scripts', array( $this, 'admin_scripts' ) );
            // Hook it up.
            add_action( 'admin_init', array( $this, 'admin_init' ) );
            // Menu.
            add_action( 'admin_menu', array( $this, 'admin_menu' ) );
        }
        
        /**
         * Admin Scripts.
         *
         * @since 1.0.0
         */
        public function admin_scripts()
        {
            // jQuery is needed.
            wp_enqueue_script( 'jquery' );
            // Color Picker.
            wp_enqueue_script(
                'iris',
                admin_url( 'js/iris.min.js' ),
                array( 'jquery-ui-draggable', 'jquery-ui-slider', 'jquery-touch-punch' ),
                false,
                1
            );
            // Media Uploader.
            wp_enqueue_media();
        }
        
        /**
         * Set Sections.
         *
         * @param array $sections
         *
         * @since 1.0.0
         */
        public function set_sections( $sections )
        {
            // Bail if not array.
            if ( !is_array( $sections ) ) {
                return false;
            }
            // Assign to the sections array.
            $this->sections_array = $sections;
            return $this;
        }
        
        /**
         * Add a single section.
         *
         * @param array $section
         *
         * @since 1.0.0
         */
        public function add_section( $section )
        {
            // Bail if not array.
            if ( !is_array( $section ) ) {
                return false;
            }
            // Assign the section to sections array.
            $this->sections_array[] = $section;
            return $this;
        }
        
        /**
         * Set Fields.
         *
         * @since 1.0.0
         */
        public function set_fields( $fields )
        {
            // Bail if not array.
            if ( !is_array( $fields ) ) {
                return false;
            }
            // Assign the fields.
            $this->fields_array = $fields;
            return $this;
        }
        
        /**
         * Add a single field.
         *
         * @since 1.0.0
         */
        public function add_field( $section, $field_array )
        {
            // Set the defaults
            $defaults = array(
                'id'   => '',
                'name' => '',
                'desc' => '',
                'type' => 'text',
            );
            // Combine the defaults with user's arguements.
            $arg = wp_parse_args( $field_array, $defaults );
            // Each field is an array named against its section.
            $this->fields_array[$section][] = $arg;
            return $this;
        }
        
        /**
         * Initialize API.
         *
         * Initializes and registers the settings sections and fields.
         * Usually this should be called at `admin_init` hook.
         *
         * @since  1.0.0
         */
        function admin_init()
        {
            /**
             * Register the sections.
             *
             * Sections array is like this:
             *
             * $sections_array = array (
             *   $section_array,
             *   $section_array,
             *   $section_array,
             * );
             *
             * Section array is like this:
             *
             * $section_array = array (
             *   'id'    => 'section_id',
             *   'title' => 'Section Title'
             * );
             *
             * @since 1.0.0
             */
            foreach ( $this->sections_array as $section ) {
                if ( false == get_option( $section['id'] ) ) {
                    // Add a new field as section ID.
                    add_option( $section['id'] );
                }
                // Deals with sections description.
                
                if ( isset( $section['desc'] ) && !empty($section['desc']) ) {
                    // Build HTML.
                    $section['desc'] = '<div class="inside">' . $section['desc'] . '</div>';
                    // Create the callback for description.
                    $callback = function () use( $section ) {
                        echo  str_replace( '"', '\\"', $section['desc'] ) ;
                    };
                } elseif ( isset( $section['callback'] ) ) {
                    $callback = $section['callback'];
                } else {
                    $callback = null;
                }
                
                /**
                 * Add a new section to a settings page.
                 *
                 * @param string $id
                 * @param string $title
                 * @param callable $callback
                 * @param string $page | Page is same as section ID.
                 *
                 * @since 1.0.0
                 */
                add_settings_section(
                    $section['id'],
                    $section['title'],
                    $callback,
                    $section['id']
                );
            }
            // foreach ended.
            /**
             * Register settings fields.
             *
             * Fields array is like this:
             *
             * $fields_array = array (
             *   $section => $field_array,
             *   $section => $field_array,
             *   $section => $field_array,
             * );
             *
             *
             * Field array is like this:
             *
             * $field_array = array (
             *   'id'   => 'id',
             *   'name' => 'Name',
             *   'type' => 'text',
             * );
             *
             * @since 1.0.0
             */
            foreach ( $this->fields_array as $section => $field_array ) {
                foreach ( $field_array as $field ) {
                    // ID.
                    $id = ( isset( $field['id'] ) ? $field['id'] : false );
                    // Type.
                    $type = ( isset( $field['type'] ) ? $field['type'] : 'text' );
                    // Name.
                    $name = ( isset( $field['name'] ) ? $field['name'] : 'No Name Added' );
                    // Label for.
                    $label_for = "{$section}[{$field['id']}]";
                    // Description.
                    $description = ( isset( $field['desc'] ) ? $field['desc'] : '' );
                    // Premium.
                    $premium = ( isset( $field['premium'] ) ? $field['premium'] : '' );
                    // Size.
                    $size = ( isset( $field['size'] ) ? $field['size'] : null );
                    // Options.
                    $options = ( isset( $field['options'] ) ? $field['options'] : '' );
                    // Standard default value.
                    $default = ( isset( $field['default'] ) ? $field['default'] : '' );
                    // Standard default placeholder.
                    $placeholder = ( isset( $field['placeholder'] ) ? $field['placeholder'] : '' );
                    // Sanitize Callback.
                    $sanitize_callback = ( isset( $field['sanitize_callback'] ) ? $field['sanitize_callback'] : '' );
                    $args = array(
                        'id'                => $id,
                        'type'              => $type,
                        'name'              => $name,
                        'label_for'         => $label_for,
                        'desc'              => $description,
                        'premium'           => $premium,
                        'section'           => $section,
                        'size'              => $size,
                        'options'           => $options,
                        'std'               => $default,
                        'placeholder'       => $placeholder,
                        'sanitize_callback' => $sanitize_callback,
                    );
                    /**
                     * Add a new field to a section of a settings page.
                     *
                     * @param string $id
                     * @param string $title
                     * @param callable $callback
                     * @param string $page
                     * @param string $section = 'default'
                     * @param array $args = array()
                     *
                     * @since 1.0.0
                     */
                    // @param string 	$id
                    $field_id = $section . '[' . $field['id'] . ']';
                    add_settings_field(
                        $field_id,
                        $name,
                        array( $this, 'callback_' . $type ),
                        $section,
                        $section,
                        $args
                    );
                }
                // foreach ended.
            }
            // foreach ended.
            // Creates our settings in the fields table.
            foreach ( $this->sections_array as $section ) {
                /**
                 * Registers a setting and its sanitization callback.
                 *
                 * @param string $field_group | A settings group name.
                 * @param string $field_name | The name of an option to sanitize and save.
                 * @param callable $sanitize_callback = ''
                 *
                 * @since 1.0.0
                 */
                register_setting( $section['id'], $section['id'], array( $this, 'sanitize_fields' ) );
            }
            // foreach ended.
        }
        
        // admin_init() ended.
        /**
         * Sanitize callback for Settings API fields.
         *
         * @since 1.0.0
         */
        public function sanitize_fields( $fields )
        {
            foreach ( $fields as $field_slug => $field_value ) {
                $sanitize_callback = $this->get_sanitize_callback( $field_slug );
                // If callback is set, call it.
                
                if ( $sanitize_callback ) {
                    $fields[$field_slug] = call_user_func( $sanitize_callback, $field_value );
                    continue;
                }
            
            }
            return $fields;
        }
        
        /**
         * Get sanitization callback for given option slug
         *
         * @param string $slug option slug.
         *
         * @return mixed string | bool false
         * @since  1.0.0
         */
        function get_sanitize_callback( $slug = '' )
        {
            if ( empty($slug) ) {
                return false;
            }
            // Iterate over registered fields and see if we can find proper callback.
            foreach ( $this->fields_array as $section => $field_array ) {
                foreach ( $field_array as $field ) {
                    if ( $field['name'] != $slug ) {
                        continue;
                    }
                    // Return the callback name.
                    return ( isset( $field['sanitize_callback'] ) && is_callable( $field['sanitize_callback'] ) ? $field['sanitize_callback'] : false );
                }
            }
            return false;
        }
        
        /**
         * Get field description for display
         *
         * @param array $args settings field args
         */
        public function get_field_description( $args )
        {
            
            if ( !empty($args['desc']) ) {
                $desc = sprintf( '<p class="description">%s</p>', $args['desc'] );
            } else {
                $desc = '';
            }
            
            return $desc;
        }
        
        /**
         * Displays a title field for a settings field
         *
         * @param array $args settings field args
         */
        function callback_title( $args )
        {
            $value = esc_attr( $this->get_option( $args['id'], $args['section'], $args['std'] ) );
            
            if ( '' !== $args['name'] ) {
                $name = $args['name'];
            } else {
            }
            
            $type = ( isset( $args['type'] ) ? $args['type'] : 'title' );
            $html = '';
            echo  $html ;
        }
        
        /**
         * Displays a documentation field for a settings field
         *
         * @param array $args settings field args
         */
        function callback_documentation( $args )
        {
            $value = esc_attr( $this->get_option(
                $args['id'],
                $args['section'],
                $args['std'],
                $args['desc']
            ) );
            
            if ( '' !== $args['name'] ) {
                $name = $args['name'];
            } else {
            }
            
            if ( !empty($args['desc']) ) {
                $html = sprintf( '<p class="description">%s</p>', $args['desc'] );
            }
            $type = ( isset( $args['type'] ) ? $args['type'] : 'documentation' );
            echo  $html ;
        }
        
        /**
         * Displays a list table
         *
         * @param array $args settings field args
         */
        function callback_list_table( $args )
        {
            $list_table = new PS_List_Table();
            $list_table->prepare_items();
            ?>
	
			<div class="wrap password-list-table">
				<form id="password_list-filter" method="get">
					<input type="hidden" name="page" value="<?php 
            echo  $_REQUEST['page'] ;
            ?>"/>
					<?php 
            $list_table->display();
            ?>
					<div class="alignright">
						<span class="button button-primary action new-password-list"><?php 
            _e( 'Add new Password List', 'content-protector' );
            ?></span>
					</div>
				</form>
			</div>
			<?php 
            new PS_Password_Lists();
        }
        
        /**
         * Displays a documentation field for a settings field
         *
         * @param array $args settings field args
         */
        function callback_shortcode()
        {
            $shortcode_options = get_option( 'passster_shortcode' );
            
            if ( !empty($shortcode_options) ) {
                $shortcode = '[passster ';
                if ( is_array( $shortcode_options ) && array_key_exists( 'passster_shortcode_protection_type', $shortcode_options ) ) {
                    
                    if ( 'passwords' == $shortcode_options['passster_shortcode_protection_type'] ) {
                        $shortcode .= 'passwords="' . $shortcode_options['passster_shortcode_passwords'] . '"';
                    } elseif ( 'recaptcha' == $shortcode_options['passster_shortcode_protection_type'] ) {
                        $shortcode .= 'captcha="recaptcha"';
                    } elseif ( 'captcha' == $shortcode_options['passster_shortcode_protection_type'] ) {
                        $shortcode .= 'captcha="captcha"';
                    } elseif ( 'password' == $shortcode_options['passster_shortcode_protection_type'] ) {
                        $shortcode .= 'password="' . $shortcode_options['passster_shortcode_password'] . '"';
                    }
                
                }
                if ( isset( $shortcode_options['passster_shortcode_user_groups'] ) && !empty($shortcode_options['passster_shortcode_user_groups']) ) {
                    $shortcode .= ' role="' . $shortcode_options['passster_shortcode_user_groups'] . '"';
                }
                if ( isset( $shortcode_options['passster_shortcode_users'] ) && !empty($shortcode_options['passster_shortcode_users']) ) {
                    $shortcode .= ' user="' . $shortcode_options['passster_shortcode_users'] . '"';
                }
                
                if ( isset( $shortcode_options['passster_shortcode_select_password_list'] ) && !empty($shortcode_options['passster_shortcode_select_password_list']) ) {
                    var_dump( $shortcode_options['passster_shortcode_select_password_list'] );
                    $shortcode .= ' password_list="' . $shortcode_options['passster_shortcode_select_password_list'] . '"';
                }
                
                $shortcode .= ']Your content here[/passster]';
                $html = '<code class="shortcode-copy">' . $shortcode . '</code>';
                $html .= '<br><br><span class="copy" data-clipboard-target=".shortcode-copy">' . __( 'Copy Shortcode', 'content-protector' ) . '</button>';
                echo  $html ;
            }
        
        }
        
        /**
         * Displays a documentation field for a settings field
         *
         * @param array $args settings field args
         */
        function callback_shortlink()
        {
            $link_options = get_option( 'passster_link' );
            
            if ( !empty($link_options) ) {
                $shortlink = $link_options['passster_shorten_link'];
                $html = '<code class="link-copy">' . $shortlink . '</code>';
                $html .= '<span class="copy" data-clipboard-target=".link-copy">' . __( 'Copy Link', 'content-protector' ) . '</button>';
                echo  $html ;
            }
        
        }
        
        /**
         * Displays a text field for a settings field
         *
         * @param array $args settings field args
         */
        function callback_text( $args )
        {
            $value = esc_attr( $this->get_option(
                $args['id'],
                $args['section'],
                $args['std'],
                $args['placeholder']
            ) );
            $size = ( isset( $args['size'] ) && !is_null( $args['size'] ) ? $args['size'] : 'regular' );
            $type = ( isset( $args['type'] ) ? $args['type'] : 'text' );
            $html = sprintf(
                '<input type="%1$s" class="%2$s-text ' . $args['premium'] . '" id="%3$s[%4$s]" name="%3$s[%4$s]" value="%5$s"placeholder="%6$s"/>',
                $type,
                $size,
                $args['section'],
                $args['id'],
                $value,
                $args['placeholder']
            );
            $html .= $this->get_field_description( $args );
            echo  $html ;
        }
        
        /**
         * Displays a url field for a settings field
         *
         * @param array $args settings field args
         */
        function callback_url( $args )
        {
            $this->callback_text( $args );
        }
        
        /**
         * Displays a number field for a settings field
         *
         * @param array $args settings field args
         */
        function callback_number( $args )
        {
            $this->callback_text( $args );
        }
        
        /**
         * Displays a checkbox for a settings field
         *
         * @param array $args settings field args
         */
        function callback_checkbox( $args )
        {
            $value = esc_attr( $this->get_option( $args['id'], $args['section'], $args['std'] ) );
            $html = '<fieldset>';
            $html .= sprintf( '<label for="wposa-%1$s[%2$s]">', $args['section'], $args['id'] );
            $html .= sprintf( '<input type="hidden" name="%1$s[%2$s]" value="off" />', $args['section'], $args['id'] );
            $html .= sprintf(
                '<input type="checkbox" class="checkbox" id="wposa-%1$s[%2$s]" name="%1$s[%2$s]" value="on" %3$s />',
                $args['section'],
                $args['id'],
                checked( $value, 'on', false )
            );
            $html .= sprintf( '%1$s</label>', $args['desc'] );
            $html .= '</fieldset>';
            echo  $html ;
        }
        
        /**
         * Displays a multicheckbox a settings field
         *
         * @param array $args settings field args
         */
        function callback_multicheck( $args )
        {
            $value = $this->get_option( $args['id'], $args['section'], $args['std'] );
            $html = '<fieldset>';
            foreach ( $args['options'] as $key => $label ) {
                $checked = ( isset( $value[$key] ) ? $value[$key] : '0' );
                $html .= sprintf(
                    '<label for="wposa-%1$s[%2$s][%3$s]">',
                    $args['section'],
                    $args['id'],
                    $key
                );
                $html .= sprintf(
                    '<input type="checkbox" class="checkbox" id="wposa-%1$s[%2$s][%3$s]" name="%1$s[%2$s][%3$s]" value="%3$s" %4$s />',
                    $args['section'],
                    $args['id'],
                    $key,
                    checked( $checked, $key, false )
                );
                $html .= sprintf( '%1$s</label><br>', $label );
            }
            $html .= $this->get_field_description( $args );
            $html .= '</fieldset>';
            echo  $html ;
        }
        
        /**
         * Displays a multicheckbox a settings field
         *
         * @param array $args settings field args
         */
        function callback_radio( $args )
        {
            $value = $this->get_option( $args['id'], $args['section'], $args['std'] );
            $html = '<fieldset>';
            foreach ( $args['options'] as $key => $label ) {
                $html .= sprintf(
                    '<label for="wposa-%1$s[%2$s][%3$s]">',
                    $args['section'],
                    $args['id'],
                    $key
                );
                $html .= sprintf(
                    '<input type="radio" class="radio" id="wposa-%1$s[%2$s][%3$s]" name="%1$s[%2$s]" value="%3$s" %4$s />',
                    $args['section'],
                    $args['id'],
                    $key,
                    checked( $value, $key, false )
                );
                $html .= sprintf( '%1$s</label><br>', $label );
            }
            $html .= $this->get_field_description( $args );
            $html .= '</fieldset>';
            echo  $html ;
        }
        
        /**
         * Displays a selectbox for a settings field
         *
         * @param array $args settings field args
         */
        function callback_select( $args )
        {
            $value = esc_attr( $this->get_option( $args['id'], $args['section'], $args['std'] ) );
            $size = ( isset( $args['size'] ) && !is_null( $args['size'] ) ? $args['size'] : 'regular' );
            $html = sprintf(
                '<select class="%1$s" name="%2$s[%3$s]" id="%2$s[%3$s]">',
                $size,
                $args['section'],
                $args['id']
            );
            foreach ( $args['options'] as $key => $label ) {
                $html .= sprintf(
                    '<option value="%s"%s>%s</option>',
                    $key,
                    selected( $value, $key, false ),
                    $label
                );
            }
            $html .= sprintf( '</select>' );
            $html .= $this->get_field_description( $args );
            echo  $html ;
        }
        
        /**
         * Displays a textarea for a settings field
         *
         * @param array $args settings field args
         */
        function callback_textarea( $args )
        {
            $value = esc_textarea( $this->get_option( $args['id'], $args['section'], $args['std'] ) );
            $size = ( isset( $args['size'] ) && !is_null( $args['size'] ) ? $args['size'] : 'regular' );
            $html = sprintf(
                '<textarea rows="5" cols="55" class="%1$s-text" id="%2$s[%3$s]" name="%2$s[%3$s]">%4$s</textarea>',
                $size,
                $args['section'],
                $args['id'],
                $value
            );
            $html .= $this->get_field_description( $args );
            echo  $html ;
        }
        
        /**
         * Displays a textarea for a settings field
         *
         * @param array $args settings field args.
         *
         * @return string
         */
        function callback_html( $args )
        {
            echo  $this->get_field_description( $args ) ;
        }
        
        /**
         * Displays a rich text textarea for a settings field
         *
         * @param array $args settings field args.
         */
        function callback_wysiwyg( $args )
        {
            $value = $this->get_option( $args['id'], $args['section'], $args['std'] );
            $size = ( isset( $args['size'] ) && !is_null( $args['size'] ) ? $args['size'] : '500px' );
            echo  '<div style="max-width: ' . $size . ';">' ;
            $editor_settings = array(
                'teeny'         => true,
                'textarea_name' => $args['section'] . '[' . $args['id'] . ']',
                'textarea_rows' => 10,
            );
            if ( isset( $args['options'] ) && is_array( $args['options'] ) ) {
                $editor_settings = array_merge( $editor_settings, $args['options'] );
            }
            wp_editor( $value, $args['section'] . '-' . $args['id'], $editor_settings );
            echo  '</div>' ;
            echo  $this->get_field_description( $args ) ;
        }
        
        /**
         * Displays a toggle for a settings field
         *
         * @param array $args settings field args
         */
        function callback_toggle( $args )
        {
            $value = esc_attr( $this->get_option( $args['id'], $args['section'], $args['std'] ) );
            $html = '<fieldset>';
            $html .= sprintf( '<label class="switch" for="wposa-%1$s[%2$s]">', $args['section'], $args['id'] );
            $html .= sprintf( '<input type="hidden" name="%1$s[%2$s]" value="off" />', $args['section'], $args['id'] );
            $html .= sprintf(
                '<input type="checkbox" class="toggle-checkbox ' . $args['premium'] . '" id="wposa-%1$s[%2$s]" name="%1$s[%2$s]" value="on" %3$s />',
                $args['section'],
                $args['id'],
                checked( $value, 'on', false )
            );
            $html .= '<span class="slider round"></span>';
            $html .= '</label>';
            $html .= '</fieldset>';
            echo  $html ;
        }
        
        /**
         * Displays a file upload field for a settings field
         *
         * @param array $args settings field args.
         */
        function callback_file( $args )
        {
            $value = esc_attr( $this->get_option( $args['id'], $args['section'], $args['std'] ) );
            $size = ( isset( $args['size'] ) && !is_null( $args['size'] ) ? $args['size'] : 'regular' );
            $id = $args['section'] . '[' . $args['id'] . ']';
            $label = ( isset( $args['options']['button_label'] ) ? $args['options']['button_label'] : __( 'Choose File' ) );
            $html = sprintf(
                '<input type="text" class="%1$s-text wpsa-url" id="%2$s[%3$s]" name="%2$s[%3$s]" value="%4$s"/>',
                $size,
                $args['section'],
                $args['id'],
                $value
            );
            $html .= '<input type="button" class="button wpsa-browse" value="' . $label . '" />';
            $html .= $this->get_field_description( $args );
            echo  $html ;
        }
        
        /**
         * Displays an image upload field with a preview
         *
         * @param array $args settings field args.
         */
        function callback_image( $args )
        {
            $value = esc_attr( $this->get_option( $args['id'], $args['section'], $args['std'] ) );
            $size = ( isset( $args['size'] ) && !is_null( $args['size'] ) ? $args['size'] : 'regular' );
            $id = $args['section'] . '[' . $args['id'] . ']';
            $label = ( isset( $args['options']['button_label'] ) ? $args['options']['button_label'] : __( 'Choose Image' ) );
            $html = sprintf(
                '<input type="text" class="%1$s-text wpsa-url" id="%2$s[%3$s]" name="%2$s[%3$s]" value="%4$s"/>',
                $size,
                $args['section'],
                $args['id'],
                $value
            );
            $html .= '<input type="button" class="button wpsa-browse" value="' . $label . '" />';
            $html .= $this->get_field_description( $args );
            $html .= '<p class="wpsa-image-preview"><img src=""/></p>';
            echo  $html ;
        }
        
        /**
         * Displays a color picker field for a settings field
         *
         * @param array $args settings field args
         */
        function callback_color( $args )
        {
            $value = esc_attr( $this->get_option(
                $args['id'],
                $args['section'],
                $args['std'],
                $args['placeholder']
            ) );
            $size = ( isset( $args['size'] ) && !is_null( $args['size'] ) ? $args['size'] : 'regular' );
            $html = sprintf(
                '<input type="text" class="%1$s-text color-picker" id="%2$s[%3$s]" name="%2$s[%3$s]" value="%4$s" data-default-color="%5$s" placeholder="%6$s" />',
                $size,
                $args['section'],
                $args['id'],
                $value,
                $args['std'],
                $args['placeholder']
            );
            $html .= $this->get_field_description( $args );
            echo  $html ;
        }
        
        /**
         * Displays a separator field for a settings field
         *
         * @param array $args settings field args
         */
        function callback_separator( $args )
        {
            $type = ( isset( $args['type'] ) ? $args['type'] : 'separator' );
            $html = '';
            $html .= '<div class="wpsa-settings-separator"></div>';
            echo  $html ;
        }
        
        /**
         * Get the value of a settings field
         *
         * @param string $option settings field name.
         * @param string $section the section name this field belongs to.
         * @param string $default default text if it's not found.
         *
         * @return string
         */
        function get_option( $option, $section, $default = '' )
        {
            $options = get_option( $section );
            if ( isset( $options[$option] ) ) {
                return $options[$option];
            }
            return $default;
        }
        
        /**
         * Add submenu page to the Settings main menu.
         *
         * @param string $page_title
         * @param string $menu_title
         * @param string $capability
         * @param string $menu_slug
         * @param callable $function = ''
         *
         * @author Ahmad Awais
         * @since  [version]
         */
        public function admin_menu()
        {
            add_menu_page(
                __( 'Passster', 'content-protector' ),
                'Passster',
                'manage_options',
                'passster',
                array( $this, 'plugin_page' ),
                'dashicons-lock',
                85
            );
            add_submenu_page(
                'passster',
                __( 'Options', 'content-protector' ),
                __( 'Options', 'content-protector' ),
                'manage_options',
                'passster_settings',
                array( $this, 'plugin_page' )
            );
        }
        
        /**
         * Add admin page content.
         *
         * @return void
         */
        public function plugin_page()
        {
            ?>
			<div class="passster-admin-header">
				<div class="logo"><img src="<?php 
            echo  PASSSTER_URL . '/assets/admin/passster-logo.svg' ;
            ?>" /></div>
				<div class="info-links">
					<a href="https://patrickposner.dev/docs/passster" target="_blank">Dokumentation</a>
					<?php 
            ?>
						<a href="https://wordpress.org/plugins/content-protector/" target="_blank">Support</a>
					<?php 
            ?>
				</div>
			</div>
			<div class="wrap passster-admin">
				<?php 
            $this->show_navigation();
            ?>
				<?php 
            $this->show_forms();
            ?>
			</div>
			<?php 
        }
        
        /**
         * Show navigations as tab
         *
         * Shows all the settings section labels as tab
         */
        function show_navigation()
        {
            $html = '<h2 class="nav-tab-wrapper">';
            foreach ( $this->sections_array as $tab ) {
                $html .= sprintf( '<a href="#%1$s" class="nav-tab" id="%1$s-tab">%2$s</a>', $tab['id'], $tab['title'] );
            }
            $html .= '</h2>';
            echo  $html ;
        }
        
        /**
         * Show the section settings forms
         *
         * This function displays every sections in a different form
         */
        function show_forms()
        {
            ?>
            <div class="metabox-holder">
				<?php 
            foreach ( $this->sections_array as $form ) {
                ?>
                    <!-- style="display: none;" -->
                    <div id="<?php 
                echo  $form['id'] ;
                ?>" class="group">
                        <form method="post" action="options.php">
							<?php 
                do_action( 'wsa_form_top_' . $form['id'], $form );
                settings_fields( $form['id'] );
                do_settings_sections( $form['id'] );
                do_action( 'wsa_form_bottom_' . $form['id'], $form );
                ?>
                            <div style="padding-left: 10px">
								<?php 
                submit_button();
                ?>
                            </div>
                        </form>
                    </div>
				<?php 
            }
            ?>
            </div>
			<?php 
            $this->script();
        }
        
        /**
         * Tabbable JavaScript codes & Initiate Color Picker
         *
         * This code uses localstorage for displaying active tabs
         */
        function script()
        {
            ?>
            <script>
                jQuery(document).ready(function ($) {

                    //Initiate Color Picker.
                    $('.color-picker').iris();

                    // Switches option sections
                    $('.group').hide();
                    var activetab = '';
                    if ('undefined' != typeof localStorage) {
                        activetab = localStorage.getItem('activetab');
                    }
                    if ('' != activetab && $(activetab).length) {
                        $(activetab).fadeIn();
                    } else {
                        $('.group:first').fadeIn();
                    }
                    $('.group .collapsed').each(function () {
                        $(this)
                            .find('input:checked')
                            .parent()
                            .parent()
                            .parent()
                            .nextAll()
                            .each(function () {
                                if ($(this).hasClass('last')) {
                                    $(this).removeClass('hidden');
                                    return false;
                                }
                                $(this)
                                    .filter('.hidden')
                                    .removeClass('hidden');
                            });
                    });

                    if ('' != activetab && $(activetab + '-tab').length) {
                        $(activetab + '-tab').addClass('nav-tab-active');
                    } else {
                        $('.nav-tab-wrapper a:first').addClass('nav-tab-active');
                    }
                    $('.nav-tab-wrapper a').click(function (evt) {
                        $('.nav-tab-wrapper a').removeClass('nav-tab-active');
                        $(this)
                            .addClass('nav-tab-active')
                            .blur();
                        var clicked_group = $(this).attr('href');
                        if ('undefined' != typeof localStorage) {
                            localStorage.setItem('activetab', $(this).attr('href'));
                        }
                        $('.group').hide();
                        $(clicked_group).fadeIn();
                        evt.preventDefault();
                    });

                    $('.wpsa-browse').on('click', function (event) {
                        event.preventDefault();

                        var self = $(this);

                        // Create the media frame.
                        var file_frame = (wp.media.frames.file_frame = wp.media({
                            title: self.data('uploader_title'),
                            button: {
                                text: self.data('uploader_button_text')
                            },
                            multiple: false
                        }));

                        file_frame.on('select', function () {
                            attachment = file_frame
                                .state()
                                .get('selection')
                                .first()
                                .toJSON();

                            self
                                .prev('.wpsa-url')
                                .val(attachment.url)
                                .change();
                        });

                        // Finally, open the modal
                        file_frame.open();
                    });

                    $('input.wpsa-url')
                        .on('change keyup paste input', function () {
                            var self = $(this);
                            self
                                .next()
                                .parent()
                                .children('.wpsa-image-preview')
                                .children('img')
                                .attr('src', self.val());
                        })
                        .change();
                });

            </script>

            <style type="text/css">
                /** WordPress 3.8 Fix **/
                .form-table th {
                    padding: 20px 10px;
                }

                #wpbody-content .metabox-holder {
                    padding-top: 5px;
                }

                .wpsa-image-preview img {
                    height: auto;
                    max-width: 70px;
                }

                .wpsa-settings-separator {
                    background: #ccc;
                    border: 0;
                    color: #ccc;
                    height: 1px;
                    position: absolute;
                    left: 0;
                    width: 99%;
                }

                .group .form-table input.color-picker {
                    max-width: 100px;
                }
            </style>
			<?php 
        }
    
    }
    // WP_OSA ended.
}