File "class-wpvivid-snapshot.php"

Full Path: /home/mahaadedsdfdfhfg/public_html/wp-content/plugins/wpvivid-backuprestore/includes/snapshot/class-wpvivid-snapshot.php
File size: 70.92 KB
MIME-type: text/x-php
Charset: utf-8

<?php

if (!defined('WPVIVID_PLUGIN_DIR'))
{
    die;
}

class WPvivid_Snapshot_Ex
{
    public $options;
    public $main_tab;

    public function __construct()
    {
        include_once WPVIVID_PLUGIN_DIR . '/includes/snapshot/class-wpvivid-snapshot-function.php';
        include_once WPVIVID_PLUGIN_DIR . '/includes/snapshot/class-wpvivid-snapshot-options.php';
        if(is_admin())
        {
            include_once WPVIVID_PLUGIN_DIR . '/includes/snapshot/class-wpvivid-snapshots-list.php';

            add_filter('wpvivid_get_dashboard_menu', array($this, 'get_dashboard_menu'), 20, 2);
            add_filter('wpvivid_get_dashboard_screens', array($this, 'get_dashboard_screens'), 20);

            add_filter('wpvivid_snapshot_get_main_admin_menus',array($this,'get_main_admin_menus'),9999);

            $this->options=new WPvivid_Snapshot_Option_Ex();

            /*
            if (is_multisite())
            {
                add_action('network_admin_menu',array( $this,'add_admin_menu'));
            }
            else
            {
                add_action('admin_menu',array( $this,'add_admin_menu'));
            }
            add_filter('wpvivid_snapshot_get_screen_ids', array($this,'get_screen_ids'), 9999);
            */

            add_filter('wpvivid_get_admin_menus',array($this,'get_admin_menus'),22);
            add_filter('wpvivid_get_screen_ids',array($this,'get_screen_ids'),12);

            add_action('admin_enqueue_scripts', array($this, 'enqueue_styles'), 11);
            add_action('admin_enqueue_scripts', array($this, 'enqueue_scripts'), 11);


            add_action('wp_ajax_wpvivid_create_snapshot',array( $this,'create_snapshot'));
            add_action('wp_ajax_wpvivid_get_snapshot_progress',array( $this,'get_snapshot_progress'));
            //
            add_action('wp_ajax_wpvivid_resume_create_snapshot',array( $this,'resume_create_snapshot'));
            add_action('wp_ajax_wpvivid_restore_snapshot',array( $this,'restore_snapshot'));
            add_action('wp_ajax_wpvivid_get_restore_snapshot_status',array( $this,'get_restore_snapshot_status'));
            add_action('wp_ajax_wpvivid_delete_snapshot',array( $this,'delete_snapshot'));

            add_filter('wpvivid_check_create_snapshot',array($this,'check_create_snapshot'));
            add_action('wpvivid_create_snapshot',array($this,'create_snapshot_ex'),10,1);

            add_action('wp_ajax_wpvivid_set_snapshot_setting',array( $this,'set_setting'));
            //
            add_action('wpvivid_snapshot_add_sidebar',array( $this,'add_sidebar'));
            add_action('wpvivid_snapshot_add_sidebar_free', array( $this, 'add_sidebar_free' ));

            $snapshot_setting=$this->options->get_option('wpvivid_snapshot_setting');

            $quick_snapshot=isset($snapshot_setting['quick_snapshot'])?$snapshot_setting['quick_snapshot']:false;

            if($quick_snapshot)
            {
                add_action('admin_bar_menu',array( $this,'add_toolbar_items'),100);
                add_action('admin_footer',array( $this,'quick_snapshot'));
            }
        }

    }

    public function get_admin_menus($submenus)
    {
        $submenu['parent_slug']=apply_filters('wpvivid_white_label_slug', WPVIVID_PLUGIN_SLUG);
        $submenu['page_title']= apply_filters('wpvivid_white_label_display', 'WPvivid Backup');
        $submenu['menu_title']=__('Database Snapshots', 'wpvivid-backuprestore');
        $submenu['capability']='administrator';
        $submenu['menu_slug']=strtolower(sprintf('%s-snapshot-ex', apply_filters('wpvivid_white_label_slug', 'wpvivid')));
        $submenu['index']=2;
        $submenu['function']=array($this, 'init_page');
        $submenus[$submenu['menu_slug']]=$submenu;
        return $submenus;
    }

    public function get_screen_ids($screen_ids)
    {
        $screen_ids[]=apply_filters('wpvivid_white_label_screen_id', 'wpvivid-backup_page_wpvivid-snapshot-ex');
        return $screen_ids;
    }

    public function add_toolbar_items($wp_admin_bar)
    {
        $wp_admin_bar->add_menu(array(
            'id' => 'wpvivid_snapshot_admin_menu',
            'title' => '<span class="dashicons-camera-alt ab-icon"></span>'.'Quick Snapshot',
            'meta' =>array(
                'class' => 'wpvivid-quick-create-snapshot',
            )
        ));
    }

    public function add_admin_menu()
    {
        $page_title=apply_filters('wpvivid_white_label_display', 'WPvivid Snapshot');
        $menu_title=apply_filters('wpvivid_white_label_display', 'WPvivid Snapshot');

        $capability = 'administrator';

        $menu_slug ='wpvivid-snapshot';

        $function=array($this, 'init_page');
        $icon_url='dashicons-camera-alt';
        $position=100;

        $menu['page_title']= $page_title;
        $menu['menu_title']= $menu_title;
        $menu['capability']='administrator';
        $menu['menu_slug']=$menu_slug;
        $menu['function']=array($this, 'init_page');
        $menu['icon_url']=$icon_url;
        $menu['position']=100;

        $menu=apply_filters('wpvivid_snapshot_get_main_admin_menus', $menu);

        if($menu!=false)
            add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $position);
    }

    public function get_dashboard_menu($submenus,$parent_slug)
    {
        $display = apply_filters('wpvivid_get_menu_capability_addon', 'menu_database_snapshot');
        if($display)
        {
            $submenu['menu_slug'] = strtolower(sprintf('%s-snapshot', apply_filters('wpvivid_white_label_slug', 'wpvivid')));
            if(isset($submenus[$submenu['menu_slug']]))
            {
                unset($submenus[$submenu['menu_slug']]);
            }
            $submenu['parent_slug'] = $parent_slug;
            $submenu['page_title'] = apply_filters('wpvivid_white_label_display', 'Database Snapshots');
            $submenu['menu_title'] = 'Database Snapshots';
            $submenu['capability'] = 'administrator';
            $submenu['index'] = 11;//10;
            $submenu['function'] = array($this, 'init_page_pro');
            $submenus[$submenu['menu_slug']] = $submenu;
        }

        return $submenus;
    }

    public function get_dashboard_screens($screens)
    {
        $screen['menu_slug']='wpvivid-snapshot';
        $screen['screen_id']='wpvivid-plugin_page_wpvivid-snapshot';
        $screen['is_top']=false;
        $screens[]=$screen;
        return $screens;
    }

    public function get_main_admin_menus($menu)
    {
        if(class_exists('WPvivid_backup_pro'))
            return false;
        else
            return $menu;
    }

    /*
    public function get_screen_ids($screen_ids)
    {
        $screen_ids=array();
        $screen['menu_slug']='wpvivid-snapshot';
        $screen['screen_id']='toplevel_page_wpvivid-snapshot';
        $screen['is_top']=true;
        $screens[]=$screen;

        foreach ($screens as $screen)
        {
            $screen_ids[]=$screen['screen_id'];
            if(is_multisite())
            {
                if(substr($screen['screen_id'],-8)=='-network')
                    continue;
                $screen_ids[]=$screen['screen_id'].'-network';
            }
            else
            {
                $screen_ids[]=$screen['screen_id'];
            }
        }
        return $screen_ids;
    }
    */

    public function enqueue_styles()
    {
        $screen_ids=array();
        $screen_ids=apply_filters('wpvivid_get_screen_ids',$screen_ids);
        if(in_array(get_current_screen()->id,$screen_ids))
        {
            wp_enqueue_style('wpvivid_snapshot_ex', WPVIVID_PLUGIN_DIR_URL . 'css/wpvivid-snapshot-style.css', array(), WPVIVID_PLUGIN_VERSION, 'all');
        }
    }

    public function enqueue_scripts()
    {

        $snapshot_setting=$this->options->get_option('wpvivid_snapshot_setting');

        $quick_snapshot=isset($snapshot_setting['quick_snapshot'])?$snapshot_setting['quick_snapshot']:false;

        if($quick_snapshot)
        {
            wp_enqueue_style('wpvivid_quick_snapshot_ex', WPVIVID_PLUGIN_DIR_URL . 'css/wpvivid-quick-snapshot-style.css', array(), WPVIVID_PLUGIN_VERSION, 'all');
            wp_enqueue_style (  'wp-jquery-ui-dialog');
            wp_enqueue_script( 'jquery-ui-dialog' );
            wp_enqueue_script (  'wpvivid_qucick_snapshot_ex_js' ,       // handle
                WPVIVID_PLUGIN_DIR_URL . 'js/wpvivid-quick-snapshot.js'  ,       // source
                array('jquery-ui-dialog'),
                WPVIVID_PLUGIN_VERSION, false
            );
            wp_localize_script('wpvivid_qucick_snapshot_ex_js', 'wpvivid_quick_snapshot_ajax_object', array('ajax_url' => admin_url('admin-ajax.php'),'ajax_nonce'=>wp_create_nonce('wpvivid_ajax')));
        }
    }

    public function added_quick_snapshot($added)
    {
        return true;
    }

    public function quick_snapshot()
    {
        if(apply_filters('wpvivid_added_quick_snapshot',false))
        {
            return;
        }
        add_filter('wpvivid_added_quick_snapshot',array( $this,'added_quick_snapshot'));
        ?>
        <div id="wpvivid_quick_snapshot_dialog">
            <span id="wpvivid_quick_snapshot_close" class="dashicons dashicons-no" style="float:right;cursor: pointer"></span>
            <div id="wpvivid_quick_snapshot_message_box" style="padding:20px 0;">
                <p style="text-align:center;font-size:24px;">
                    <span id="wpvivid_quick_snapshot_message">Are you sure you want to create a snapshot now?</span>
                    <span id="wpvivid_quick_snapshot_loading"><img src="<?php echo esc_url(admin_url()).'/images/loading.gif'; ?>"></span>
                </p>
                <p style="text-align:center;" id="wpvivid_quick_create_snapshot_comment_box">
                    <span class="dashicons dashicons-welcome-write-blog wpvivid-dashicons-green" style="margin-top:0.2em;"></span>
                    <span><strong>Comment the snapshot</strong>(optional): </span>
                    <input  id="wpvivid_quick_create_snapshot_comment" type="text" placeholder="e.g. mysnapshot">
                </p>
            </div>
            <div id="wpvivid_quick_snapshot_progress" style="display: none">
                <p>
                    <span class="wpvivid-span-progress">
                        <span class="wpvivid-span-processed-progress">0% completed</span>
                    </span>
                </p>
                <p><span>Action: </span><span></span><span></span></p>
            </div>
            <div style="padding:0 0 10px 0">
                <p style="text-align:center;">
                    <input class="button-primary"  style="width: 150px; height: 40px; font-size: 16px; margin-bottom: 10px; pointer-events: auto; opacity: 1;" id="wpvivid_quick_create_snapshot" type="submit" value="Create Now">
                </p>
            </div>
        </div>
        <script>
            var b_quick_end_create_progress=false;
            var b_quick_need_update=false;
            jQuery('.wpvivid-quick-create-snapshot').click(function()
            {
                jQuery("#wpvivid_quick_snapshot_message_box").show();
                //
                jQuery("#wpvivid_quick_snapshot_loading").hide();
                jQuery("#wpvivid_quick_create_snapshot_comment_box").show();
                jQuery("#wpvivid_quick_snapshot_progress").hide();
                //
                jQuery("#wpvivid_quick_snapshot_message").html("Are you sure you want to create a snapshot now?");
                jQuery("#wpvivid_quick_snapshot_dialog").dialog("widget").find(".ui-dialog-titlebar").hide();
                jQuery("#wpvivid_quick_snapshot_dialog").dialog("open");

                return false;
            });

            //wpvivid_quick_snapshot_close
            jQuery('#wpvivid_quick_snapshot_close').click(function()
            {
                jQuery("#wpvivid_quick_snapshot_dialog").dialog('close');
            });

            jQuery('#wpvivid_quick_create_snapshot').click(function()
            {
                wpvivid_quick_create_snapshot();
            });

            function wpvivid_quick_simulate_create_progress()
            {
                var MaxProgess = 30,
                    currentProgess = 0,
                    steps = 1,
                    time_steps=1000;

                var timer = setInterval(function ()
                {
                    if(currentProgess>100)
                    {
                        currentProgess=100;
                    }
                    else
                    {
                        currentProgess += steps;
                    }

                    if(b_quick_end_create_progress)
                    {
                        clearInterval(timer);
                        return;
                    }
                    var progress_html='<p><span class="wpvivid-span-progress">' +
                        '<span class="wpvivid-span-processed-progress wpvivid-span-processed-percent-progress" style="width: '+currentProgess+'%">' +
                        currentProgess+'% completed</span></span></p><p>' +
                        '<span class="dashicons dashicons-welcome-write-blog wpvivid-dashicons-grey"></span><span>Action:</span>' +
                        '<span>Creating the snapshot.</span></p>';

                    jQuery("#wpvivid_quick_snapshot_progress").html(progress_html);
                    if (currentProgess >= MaxProgess)
                    {
                        clearInterval(timer);
                    }
                }, time_steps);
            }

            function wpvivid_quick_create_snapshot()
            {
                var comment=jQuery('#wpvivid_quick_create_snapshot_comment').val();
                var ajax_data= {
                    'action': 'wpvivid_create_snapshot',
                    'comment':comment,
                };
                var default_progress='<p><span class="wpvivid-span-progress"><span class="wpvivid-span-processed-progress wpvivid-span-processed-percent-progress" style="width: 0%">0% completed</span></span></p><p><span class="dashicons dashicons-welcome-write-blog wpvivid-dashicons-grey"></span><span>Action:</span><span>Creating a snapshot.</span></p>';
                jQuery('#wpvivid_quick_snapshot_progress').show();
                jQuery('#wpvivid_quick_snapshot_progress').html(default_progress);
                jQuery("#wpvivid_quick_snapshot_loading").show();
                jQuery("#wpvivid_quick_create_snapshot_comment_box").hide();
                jQuery("#wpvivid_quick_snapshot_message").html("Creating the snapshot...");
                b_quick_need_update=true;
                b_quick_end_create_progress=false;
                wpvivid_quick_simulate_create_progress();

                setTimeout(function(){
                    wpvivid_quick_get_snapshot_progress();
                }, 3000);

                jQuery('#wpvivid_quick_create_snapshot').css({'pointer-events': 'none', 'opacity': '0.4'});
                wpvivid_post_request_quick(ajax_data, function(data)
                {
                    b_quick_end_create_progress=true;
                    var jsonarray = jQuery.parseJSON(data);
                    if (jsonarray.result === 'success')
                    {
                        jQuery('#wpvivid_quick_snapshot_progress').html(jsonarray.progress);
                        if(jsonarray.finished==1)
                        {
                            jQuery("#wpvivid_quick_snapshot_dialog").dialog('close');
                            b_quick_need_update=false;
                            jQuery('#wpvivid_quick_snapshot_progress').hide();
                            jQuery('#wpvivid_quick_create_snapshot').css({'pointer-events': 'auto', 'opacity': '1'});

                            jQuery("#wpvivid_quick_snapshot_loading").hide();
                            jQuery("#wpvivid_quick_create_snapshot_comment_box").show();
                            jQuery("#wpvivid_quick_snapshot_message").html("Are you sure you want to create a snapshot now?");

                            alert("Creating a snapshot completed successfully.");
                        }
                        else
                        {
                            wpvivid_quick_resume_create_snapshot();
                        }
                    }
                    else
                    {
                        alert(jsonarray.error);
                        b_quick_need_update=false;
                        jQuery('#wpvivid_quick_snapshot_progress').hide();
                        jQuery('#wpvivid_quick_create_snapshot').css({'pointer-events': 'auto', 'opacity': '1'});

                        jQuery("#wpvivid_quick_snapshot_loading").hide();
                        jQuery("#wpvivid_quick_create_snapshot_comment_box").show();
                        jQuery("#wpvivid_quick_snapshot_message").html("Are you sure you want to create a snapshot now?");
                    }
                }, function(XMLHttpRequest, textStatus, errorThrown)
                {
                    setTimeout(function(){
                        wpvivid_quick_resume_create_snapshot(0);
                    }, 15000);
                });
            }

            function wpvivid_quick_get_snapshot_progress()
            {
                var ajax_data= {
                    'action': 'wpvivid_get_snapshot_progress',
                };

                wpvivid_post_request_quick(ajax_data, function(data)
                {
                    var jsonarray = jQuery.parseJSON(data);
                    b_quick_end_create_progress=true;
                    jQuery('#wpvivid_quick_snapshot_progress').html(jsonarray.progress);

                    if(b_quick_need_update)
                    {
                        setTimeout(function(){
                            wpvivid_quick_get_snapshot_progress();
                        }, 1000);
                    }
                }, function(XMLHttpRequest, textStatus, errorThrown)
                {
                    if(b_quick_need_update)
                    {
                        setTimeout(function(){
                            wpvivid_quick_get_snapshot_progress();
                        }, 1000);
                    }
                });
            }

            function wpvivid_quick_resume_create_snapshot(resume)
            {
                if(resume>6)
                {
                    alert('Creating the snapshot timed out.');
                    b_quick_need_update=false;
                    jQuery("#wpvivid_quick_snapshot_message_box").show();
                    jQuery('#wpvivid_quick_snapshot_progress').hide();
                    jQuery('#wpvivid_quick_create_snapshot').css({'pointer-events': 'auto', 'opacity': '1'});

                    jQuery("#wpvivid_quick_snapshot_loading").hide();
                    jQuery("#wpvivid_quick_create_snapshot_comment_box").show();
                    jQuery("#wpvivid_quick_snapshot_message").html("Are you sure you want to create a snapshot now?");
                    return;
                }
                var ajax_data= {
                    'action': 'wpvivid_resume_create_snapshot'
                };

                wpvivid_post_request_quick(ajax_data, function(data)
                {
                    try {
                        var jsonarray = jQuery.parseJSON(data);
                        if (jsonarray.result === 'success')
                        {
                            jQuery('#wpvivid_quick_snapshot_progress').html(jsonarray.progress);

                            if(jsonarray.finished==1)
                            {
                                b_quick_need_update=false;
                                jQuery("#wpvivid_quick_snapshot_dialog").dialog('close');

                                jQuery("#wpvivid_quick_snapshot_message_box").show();
                                jQuery('#wpvivid_quick_snapshot_progress').hide();
                                jQuery('#wpvivid_quick_create_snapshot').css({'pointer-events': 'auto', 'opacity': '1'});

                                jQuery("#wpvivid_quick_snapshot_loading").hide();
                                jQuery("#wpvivid_quick_create_snapshot_comment_box").show();
                                jQuery("#wpvivid_quick_snapshot_message").html("Are you sure you want to create a snapshot now?");
                                alert("Creating a snapshot completed successfully.");
                            }
                            else
                            {
                                wpvivid_quick_resume_create_snapshot();
                            }
                        }
                        else
                        {
                            b_quick_need_update=false;
                            jQuery("#wpvivid_quick_snapshot_message_box").show();
                            alert(jsonarray.error);
                            jQuery('#wpvivid_quick_snapshot_progress').hide();
                            jQuery('#wpvivid_quick_create_snapshot').css({'pointer-events': 'auto', 'opacity': '1'});

                            jQuery("#wpvivid_quick_snapshot_loading").hide();
                            jQuery("#wpvivid_quick_create_snapshot_comment_box").show();
                            jQuery("#wpvivid_quick_snapshot_message").html("Are you sure you want to create a snapshot now?");
                        }
                    }
                    catch (e)
                    {
                        resume+=1;
                        setTimeout(function(){
                            wpvivid_quick_resume_create_snapshot(resume);
                        }, 15000);
                    }

                }, function(XMLHttpRequest, textStatus, errorThrown)
                {
                    resume+=1;
                    setTimeout(function(){
                        wpvivid_quick_resume_create_snapshot(resume);
                    }, 15000);
                });
            }

            jQuery(document).ready(function ()
            {
                jQuery(function($)
                {
                    jQuery("#wpvivid_quick_snapshot_dialog").dialog({
                        'dialogClass'   : 'noTitleStuff',
                        'modal'         : true,
                        'autoOpen'      : false,
                        'closeOnEscape' : true,
                        'width': '600px',
                        'minWidth' : "260px"
                    });
                });
            });
        </script>
        <?php
    }

    public function init_page()
    {
        $this->options->check_tables();
        ?>
        <div class="wrap" style="max-width:1720px;">
            <h1><?php echo esc_html( apply_filters('wpvivid_white_label_display', 'WPvivid').' Plugins - Snapshots'); ?></h1>

            <?php
            if(!class_exists('WPvivid_Tab_Page_Container'))
                include_once WPVIVID_PLUGIN_DIR . '/includes/class-wpvivid-tab-page-container.php';

            $args['is_parent_tab']=1;
            $this->main_tab=new WPvivid_Tab_Page_Container();
            $this->main_tab->add_tab('Snapshots','snapshots',array($this, 'output_snapshots'), $args);
            $this->main_tab->add_tab('Setting','snapshots_setting',array($this, 'output_snapshots_setting'), $args);
            $this->main_tab->display();
            ?>

        </div>
        <?php
    }

    public function init_page_pro()
    {
        $this->options->check_tables();
        ?>
        <div class="wrap wpvivid-canvas">
            <div class="icon32"></div>
            <h1><?php echo esc_html( apply_filters('wpvivid_white_label_display', 'WPvivid').' Plugins - Snapshots' ); ?></h1>
            <div id="wpvivid_backup_notice"></div>
            <div id="poststuff">
                <div id="post-body" class="metabox-holder columns-2">
                    <div id="post-body-content">
                        <div class="meta-box-sortables ui-sortable">
                            <div class="wpvivid-backup">
                                <?php $this->welcome_bar();?>
                                <div class="wpvivid-canvas wpvivid-clear-float">
                                    <!---  backup progress --->
                                    <?php

                                    if(!class_exists('WPvivid_Tab_Page_Container_Ex'))
                                        include_once WPVIVID_PLUGIN_DIR . '/includes/snapshot/class-wpvivid-tab-page-container-ex.php';
                                    $this->main_tab=new WPvivid_Tab_Page_Container_Ex();

                                    $args['is_parent_tab']=0;
                                    $args['div_style']='padding-top:0;display:block;';
                                    $args['span_class']='dashicons dashicons-camera';
                                    $args['span_style']='color:#007cba; padding-right:0.5em;margin-top:0.2em;';
                                    //
                                    $tabs['merge']['title']='Snapshots';
                                    $tabs['merge']['slug']='snapshots';
                                    $tabs['merge']['callback']=array($this, 'output_snapshots');
                                    $tabs['merge']['args']=$args;

                                    $args['div_style']='padding-top:0;';
                                    $args['span_class']='dashicons  dashicons-admin-generic';
                                    $args['span_style']='color:grey;padding-right:0.5em;margin-top:0.1em;';
                                    $tabs['snapshot']['title']='Setting';
                                    $tabs['snapshot']['slug']='snapshots_setting';
                                    $tabs['snapshot']['callback']=array($this, 'output_snapshots_setting');
                                    $tabs['snapshot']['args']=$args;

                                    foreach ($tabs as $key=>$tab)
                                    {
                                        $this->main_tab->add_tab($tab['title'],$tab['slug'],$tab['callback'], $tab['args']);
                                    }

                                    $this->main_tab->display();
                                    ?>
                                </div>
                            </div>
                        </div>
                    </div>
                    <?php
                    do_action( 'wpvivid_snapshot_add_sidebar');
                    ?>
                </div>
            </div>
        </div>
        <?php
    }

    public function welcome_bar()
    {
        ?>
        <div class="wpvivid-welcome-bar wpvivid-clear-float">
            <div class="wpvivid-welcome-bar-left">
                <p><span class="dashicons dashicons-camera-alt wpvivid-dashicons-large wpvivid-dashicons-green"></span><span class="wpvivid-page-title">Database Snapshots</span></p>
                <p><span class="about-description">Create snapshots of the website database and restore the database from a snapshot.</span></p>
            </div>
            <div class="wpvivid-welcome-bar-right">
                <p></p>
                <div style="float:right;">
                    <span>Local Time:</span>
                    <span>
                        <a href="<?php echo esc_attr(apply_filters('wpvivid_get_admin_url', '').'options-general.php'); ?>">
                            <?php
                            $offset=get_option('gmt_offset');
                            echo esc_html(gmdate("l, F-d-Y H:i",time()+$offset*60*60));
                            ?>
                        </a>
                    </span>
                    <span class="dashicons dashicons-editor-help wpvivid-dashicons-editor-help wpvivid-tooltip">
                        <div class="wpvivid-left">
                            <p>Clicking the date and time will redirect you to the WordPress General Settings page where you can change your timezone settings.</p>
                            <i></i> <!-- do not delete this line -->
                        </div>
                    </span>
                </div>
            </div>
        </div>
        <?php
    }

    public function output_snapshots()
    {
        $snapshot=new WPvivid_Snapshot_Function_Ex();
        $snapshot_data=$snapshot->get_snapshots();

        ?>
        <div class="postbox quicksnapshot">
            <div id="wpvivid_snapshot_progress" style="display: none">
                <p>
                    <span class="wpvivid-span-progress">
                        <span class="wpvivid-span-processed-progress wpvivid-span-processed-percent-progress">0% completed</span>
                    </span>
                </p>
                <p><span>Action: </span><span></span><span class="wpvivid-animate-flicker"></span></p>
            </div>
            <div>
                <input class="button-primary" style="width: 200px; height: 50px; font-size: 20px; margin-bottom: 10px; pointer-events: auto; opacity: 1;" id="wpvivid_create_snapshot" type="submit" value="Create a snapshot">
            </div>
            <div>
                <p>
                    <span class="dashicons dashicons-welcome-write-blog wpvivid-dashicons-green" style="margin-top:0.2em;"></span>
                    <span><strong>Comment the snapshot</strong>(optional): </span>
                    <input id="wpvivid_create_snapshot_comment" type="text" placeholder="e.g. mysnapshot">
                </p>
            </div>

            <div id="wpvivid_snapshots_list">
                <?php
                $Snapshots_list = new WPvivid_Snapshots_List_Ex();
                $Snapshots_list->set_list($snapshot_data);
                $Snapshots_list->prepare_items();
                $Snapshots_list->display();
                ?>
            </div>
        </div>
        <script>
            var b_need_update=false;
            var b_restore_finished=false;
            var b_end_create_progress=false;
            jQuery('#wpvivid_create_snapshot').click(function()
            {
                wpvivid_create_snapshot();
            });

            function wpvivid_simulate_restore_progress()
            {
                var MaxProgess = 95,
                    currentProgess = 0,
                    steps = 1,
                    time_steps=1000;

                var timer = setInterval(function ()
                {
                    if(b_restore_finished)
                    {
                        currentProgess=100;
                    }
                    else
                    {
                        currentProgess += steps;
                    }


                    var progress_html='<p><span class="wpvivid-span-progress">' +
                        '<span class="wpvivid-span-processed-progress wpvivid-span-processed-percent-progress" style="width: '+currentProgess+'%">' +
                        currentProgess+'% completed</span></span></p><p>' +
                        '<span class="dashicons dashicons-welcome-write-blog wpvivid-dashicons-grey"></span><span>Action:</span>' +
                        '<span>Restoring the snapshot.</span></p>';

                    jQuery("#wpvivid_snapshot_progress").html(progress_html);
                    if (currentProgess >= MaxProgess)
                    {
                        clearInterval(timer);
                    }
                }, time_steps);
            }

            function wpvivid_simulate_create_progress()
            {
                var MaxProgess = 30,
                    currentProgess = 0,
                    steps = 1,
                    time_steps=1000;

                var timer = setInterval(function ()
                {
                    if(currentProgess>100)
                    {
                        currentProgess=100;
                    }
                    else
                    {
                        currentProgess += steps;
                    }

                    if(b_end_create_progress)
                    {
                        clearInterval(timer);
                        return;
                    }
                    var progress_html='<p><span class="wpvivid-span-progress">' +
                        '<span class="wpvivid-span-processed-progress wpvivid-span-processed-percent-progress" style="width: '+currentProgess+'%">' +
                        currentProgess+'% completed</span></span></p><p>' +
                        '<span class="dashicons dashicons-welcome-write-blog wpvivid-dashicons-grey"></span><span>Action:</span>' +
                        '<span>Creating the snapshot.</span></p>';

                    jQuery("#wpvivid_snapshot_progress").html(progress_html);
                    if (currentProgess >= MaxProgess)
                    {
                        clearInterval(timer);
                    }
                }, time_steps);
            }

            function wpvivid_create_snapshot()
            {
                var comment=jQuery('#wpvivid_create_snapshot_comment').val();
                var ajax_data= {
                    'action': 'wpvivid_create_snapshot',
                    'comment':comment,
                };
                var default_progress='<p><span class="wpvivid-span-progress"><span class="wpvivid-span-processed-progress wpvivid-span-processed-percent-progress" style="width: 0%">0% completed</span></span></p><p><span class="dashicons dashicons-welcome-write-blog wpvivid-dashicons-grey"></span><span>Action:</span><span>Creating a snapshot.</span></p>';
                jQuery('#wpvivid_snapshot_progress').show();
                jQuery('#wpvivid_snapshot_progress').html(default_progress);

                b_need_update=true;
                b_end_create_progress=false;
                wpvivid_simulate_create_progress();

                setTimeout(function(){
                    wpvivid_get_snapshot_progress();
                }, 3000);

                jQuery('#wpvivid_create_snapshot').css({'pointer-events': 'none', 'opacity': '0.4'});
                wpvivid_post_request(ajax_data, function(data)
                {
                    b_end_create_progress=true;
                    var jsonarray = jQuery.parseJSON(data);
                    if (jsonarray.result === 'success')
                    {
                        jQuery('#wpvivid_snapshot_progress').html(jsonarray.progress);
                        if(jsonarray.finished==1)
                        {
                            b_need_update=false;
                            alert('Creating a snapshot completed successfully.');
                            location.reload();
                        }
                        else
                        {
                            wpvivid_resume_create_snapshot();
                        }
                    }
                    else
                    {
                        b_need_update=false;
                        alert(jsonarray.error);
                        jQuery('#wpvivid_snapshot_progress').hide();
                        jQuery('#wpvivid_create_snapshot').css({'pointer-events': 'auto', 'opacity': '1'});
                    }
                }, function(XMLHttpRequest, textStatus, errorThrown)
                {
                    setTimeout(function(){
                        wpvivid_resume_create_snapshot(0);
                    }, 15000);
                });
            }

            function wpvivid_get_snapshot_progress()
            {
                var ajax_data= {
                    'action': 'wpvivid_get_snapshot_progress',
                };

                wpvivid_post_request(ajax_data, function(data)
                {
                    var jsonarray = jQuery.parseJSON(data);
                    b_end_create_progress=true;
                    jQuery('#wpvivid_snapshot_progress').html(jsonarray.progress);

                    if(b_need_update)
                    {
                        setTimeout(function(){
                            wpvivid_get_snapshot_progress();
                        }, 1000);
                    }
                }, function(XMLHttpRequest, textStatus, errorThrown)
                {
                    if(b_need_update)
                    {
                        setTimeout(function(){
                            wpvivid_get_snapshot_progress();
                        }, 1000);
                    }
                });
            }

            function wpvivid_resume_create_snapshot(resume)
            {
                if(resume>6)
                {
                    b_need_update=false;
                    alert('Creating the snapshot timed out.');
                    jQuery('#wpvivid_snapshot_progress').hide();
                    jQuery('#wpvivid_create_snapshot').css({'pointer-events': 'auto', 'opacity': '1'});
                    return;
                }
                var ajax_data= {
                    'action': 'wpvivid_resume_create_snapshot'
                };

                wpvivid_post_request(ajax_data, function(data)
                {
                    try {
                        var jsonarray = jQuery.parseJSON(data);
                        if (jsonarray.result === 'success')
                        {
                            jQuery('#wpvivid_snapshot_progress').html(jsonarray.progress);

                            if(jsonarray.finished==1)
                            {
                                b_need_update=false;

                                alert('Creating a snapshot completed successfully.');
                                location.reload();
                            }
                            else
                            {
                                wpvivid_resume_create_snapshot();
                            }
                        }
                        else
                        {
                            b_need_update=false;
                            alert(jsonarray.error);
                            jQuery('#wpvivid_snapshot_progress').hide();
                            jQuery('#wpvivid_create_snapshot').css({'pointer-events': 'auto', 'opacity': '1'});
                        }
                    }
                    catch (e)
                    {
                        resume+=1;
                        setTimeout(function(){
                            wpvivid_resume_create_snapshot(resume);
                        }, 15000);
                    }

                }, function(XMLHttpRequest, textStatus, errorThrown)
                {
                    resume+=1;
                    setTimeout(function(){
                        wpvivid_resume_create_snapshot(resume);
                    }, 15000);
                });
            }

            jQuery('#wpvivid_snapshots_list').on("click",'.wpvivid-snapshot-restore',function()
            {
                var Obj=jQuery(this);
                var snapshot_id=Obj.closest('tr').attr('slug');

                var descript = '<?php esc_html_e('Are you sure you want to restore this snapshot?', 'wpvivid'); ?>';
                var ret = confirm(descript);
                if (ret === true)
                {
                    var ajax_data= {
                        'action': 'wpvivid_restore_snapshot',
                        'id':snapshot_id
                    };
                    jQuery('#wpvivid_create_snapshot').css({'pointer-events': 'none', 'opacity': '0.4'});
                    var default_progress='<p><span class="wpvivid-span-progress"><span class="wpvivid-span-processed-progress wpvivid-span-processed-percent-progress" style="width: 0%">0% completed</span></span></p><p><span class="dashicons dashicons-welcome-write-blog wpvivid-dashicons-grey"></span><span>Action:</span><span>Restoring the snapshot.</span></p>';
                    jQuery('#wpvivid_snapshot_progress').show();
                    jQuery('#wpvivid_snapshot_progress').html(default_progress);
                    b_restore_finished=false;
                    wpvivid_simulate_restore_progress();

                    wpvivid_post_request(ajax_data, function(data)
                    {
                        var jsonarray = jQuery.parseJSON(data);
                        if (jsonarray.result === 'success')
                        {
                            b_restore_finished=true;
                            jQuery('#wpvivid_snapshot_progress').html(jsonarray.progress);
                            alert('Restoring the snapshot completed successfully.');
                            location.reload();                        }
                        else
                        {
                            b_restore_finished=true;
                            jQuery('#wpvivid_snapshot_progress').hide();
                            alert(jsonarray.error);
                            jQuery('#wpvivid_create_snapshot').css({'pointer-events': 'auto', 'opacity': '1'});
                        }
                    }, function(XMLHttpRequest, textStatus, errorThrown)
                    {
                        setTimeout(function(){
                            wpvivid_get_restore_snapshot_status();
                        }, 1000);
                    });
                }
            });

            function wpvivid_get_restore_snapshot_status()
            {
                var ajax_data= {
                    'action': 'wpvivid_get_restore_snapshot_status',
                };

                wpvivid_post_request(ajax_data, function(data)
                {
                    try
                    {
                        var jsonarray = jQuery.parseJSON(data);
                        if (jsonarray.result === 'success')
                        {
                            if(jsonarray.finished==1)
                            {
                                jQuery('#wpvivid_snapshot_progress').html(jsonarray.progress);
                                b_restore_finished=true;
                                alert('Restoring the snapshot completed successfully.');
                                location.reload();
                            }
                            else
                            {
                                setTimeout(function(){
                                    wpvivid_get_restore_snapshot_status();
                                }, 1000);
                            }
                        }
                        else
                        {
                            b_restore_finished=true;
                            jQuery('#wpvivid_snapshot_progress').hide();
                            alert(jsonarray.error);
                            jQuery('#wpvivid_create_snapshot').css({'pointer-events': 'auto', 'opacity': '1'});
                        }
                    }
                    catch (err)
                    {
                        setTimeout(function(){
                            wpvivid_get_restore_snapshot_status();
                        }, 1000);
                    }

                }, function(XMLHttpRequest, textStatus, errorThrown)
                {
                    setTimeout(function(){
                        wpvivid_get_restore_snapshot_status();
                    }, 1000);
                });
            }

            jQuery('#wpvivid_snapshots_list').on("click",'.wpvivid-snapshot-delete',function()
            {
                var Obj=jQuery(this);
                var snapshot_id=Obj.closest('tr').attr('slug');

                var descript = '<?php esc_html_e('Are you sure you want to delete this snapshot?', 'wpvivid'); ?>';
                var ret = confirm(descript);
                if (ret === true)
                {
                    var ajax_data= {
                        'action': 'wpvivid_delete_snapshot',
                        'id':snapshot_id
                    };
                    jQuery('#wpvivid_create_snapshot').css({'pointer-events': 'none', 'opacity': '0.4'});
                    wpvivid_post_request(ajax_data, function(data)
                    {
                        var jsonarray = jQuery.parseJSON(data);
                        if (jsonarray.result === 'success')
                        {
                            alert('The snapshot has been deleted successfully.');
                            jQuery('#wpvivid_snapshots_list').html(jsonarray.html);
                            jQuery('#wpvivid_create_snapshot').css({'pointer-events': 'auto', 'opacity': '1'});
                        }
                        else
                        {
                            alert(jsonarray.error);
                            jQuery('#wpvivid_create_snapshot').css({'pointer-events': 'auto', 'opacity': '1'});
                        }
                    }, function(XMLHttpRequest, textStatus, errorThrown)
                    {
                        jQuery('#wpvivid_create_snapshot').css({'pointer-events': 'auto', 'opacity': '1'});
                        alert("Deleting the snapshot(s) failed.");
                    });
                }
            });

            jQuery('#wpvivid_snapshots_list').on("click",'#wpvivid_delete_snapshots_action',function()
            {
                var delete_snapshots_array = new Array();
                var count = 0;

                jQuery('#wpvivid_snapshots_list .wpvivid-snapshot-row input').each(function (i)
                {
                    if(jQuery(this).prop('checked'))
                    {
                        delete_snapshots_array[count] =jQuery(this).closest('tr').attr('slug');
                        count++;
                    }
                });
                if( count === 0 )
                {
                    alert('<?php esc_html_e('Please select at least one item.','wpvivid'); ?>');
                }
                else
                {
                    var descript = '<?php esc_html_e('Are you sure to delete the selected snapshots? These snapshots will be deleted permanently.', 'wpvivid'); ?>';

                    var ret = confirm(descript);
                    if (ret === true)
                    {
                        jQuery('#wpvivid_delete_snapshots_action').css({'pointer-events': 'none', 'opacity': '0.4'});
                        wpvivid_delete_snapshot_array(delete_snapshots_array,0);
                    }
                }
            });

            function wpvivid_delete_snapshot_array(delete_snapshots_array,index)
            {
                if(index >= delete_snapshots_array.length)
                {
                    alert('The snapshot has been deleted successfully.');
                    jQuery('#wpvivid_delete_snapshots_action').css({'pointer-events': 'auto', 'opacity': '1'});
                    return;
                }
                const snapshot_id = delete_snapshots_array[index];
                var ajax_data= {
                    'action': 'wpvivid_delete_snapshot',
                    'id':snapshot_id
                };
                wpvivid_post_request(ajax_data, function(data)
                {
                    var jsonarray = jQuery.parseJSON(data);
                    if (jsonarray.result === 'success')
                    {
                        jQuery('#wpvivid_snapshots_list').html(jsonarray.html);
                        index++;
                        wpvivid_delete_snapshot_array(delete_snapshots_array,index);
                    }
                    else
                    {
                        alert(jsonarray.error);
                        jQuery('#wpvivid_delete_snapshots_action').css({'pointer-events': 'auto', 'opacity': '1'});
                    }
                }, function(XMLHttpRequest, textStatus, errorThrown)
                {
                    alert('Deleting the snapshot(s) failed.');
                    jQuery('#wpvivid_delete_snapshots_action').css({'pointer-events': 'auto', 'opacity': '1'});
                });
            }
        </script>
        <?php
    }

    public function output_snapshots_setting()
    {

        $setting=$this->options->get_option('wpvivid_snapshot_setting');
        if(empty($setting))
        {
            $setting=array();
        }

        $snapshot_retention=isset($setting['snapshot_retention'])?$setting['snapshot_retention']:6;
        $quick_snapshot=isset($setting['quick_snapshot'])?$setting['quick_snapshot']:false;
        if($quick_snapshot)
        {
            $quick_snapshot='checked';
        }
        else
        {
            $quick_snapshot='';
        }
        ?>
        <div class="postbox quicksnapshot">
            <table class="widefat" style="border-left:none;border-top:none;border-right:none;">
                <tr>
                    <td class="row-title" style="min-width:200px;">
                        <label for="tablecell">Snapshot Retention</label>
                    </td>
                    <td>
                        <p>
                            <span>Up to </span>
                            <span>
                                <select id="wpvivid_snapshot_retention" option="setting" name="snapshot_retention">
                                    <option value="3">3</option>
                                    <option value="4">4</option>
                                    <option value="5">5</option>
                                    <option value="6" selected>6</option>
                                    <option value="7">7</option>
                                    <option value="8">8</option>
                                    <option value="9">9</option>
                                    <option value="10">10</option>
                                    <option value="11">11</option>
                                    <option value="12">12</option>
                                </select>
                            </span>
                            <span>snapshots retained</span></p>
                        <p>It is not recommended to create too many snapshots.</p>
                    </td>
                </tr>
                <tr>
                    <td class="row-title" style="min-width:200px;">
                        <label for="tablecell">Quick Snapshot</label>
                    </td>
                    <td>
                        <p>
                            <label class="wpvivid-checkbox">
                                <span>Enable Quick Snapshot</span>
                                <input type="checkbox" option="setting" name="quick_snapshot" <?php echo esc_attr($quick_snapshot); ?> />
                                <span class="wpvivid-checkbox-checkmark"></span>
                            </label>
                        </p>
                        <p><code>Show a menu in top admin bar for quickly creating a snapshot.</code></p>
                    </td>
                </tr>
            </table>
            <div style="padding:1em 1em 0 0;"><input class="button-primary wpvivid-snapshot-setting-save" type="submit" value="Save Changes"></div>
        </div>
        <script>
            jQuery('.wpvivid-snapshot-setting-save').click(function()
            {
                wpvivid_snapshot_setting_save();
            });

            function wpvivid_ajax_snapshot_data_transfer(data_type){
                var json = {};
                jQuery('input:checkbox[option='+data_type+']').each(function() {
                    var value = '0';
                    var key = jQuery(this).prop('name');
                    if(jQuery(this).prop('checked')) {
                        value = '1';
                    }
                    else {
                        value = '0';
                    }
                    json[key]=value;
                });
                jQuery('input:radio[option='+data_type+']').each(function() {
                    if(jQuery(this).prop('checked'))
                    {
                        var key = jQuery(this).prop('name');
                        var value = jQuery(this).prop('value');
                        json[key]=value;
                    }
                });
                jQuery('input:text[option='+data_type+']').each(function(){
                    var obj = {};
                    var key = jQuery(this).prop('name');
                    var value = jQuery(this).val();
                    json[key]=value;
                });
                jQuery('input:password[option='+data_type+']').each(function(){
                    var obj = {};
                    var key = jQuery(this).prop('name');
                    var value = jQuery(this).val();
                    json[key]=value;
                });
                jQuery('select[option='+data_type+']').each(function(){
                    var obj = {};
                    var key = jQuery(this).prop('name');
                    var value = jQuery(this).val();
                    json[key]=value;
                });
                return JSON.stringify(json);
            }

            function wpvivid_snapshot_setting_save()
            {
                var setting_data = wpvivid_ajax_snapshot_data_transfer('setting');
                var json = JSON.parse(setting_data);
                setting_data=JSON.stringify(json);

                var ajax_data = {
                    'action': 'wpvivid_set_snapshot_setting',
                    'setting': setting_data,
                };
                jQuery('.wpvivid-snapshot-setting-save').css({'pointer-events': 'none', 'opacity': '0.4'});
                wpvivid_post_request(ajax_data, function (data)
                {
                    try
                    {
                        var jsonarray = jQuery.parseJSON(data);

                        jQuery('.wpvivid-snapshot-setting-save').css({'pointer-events': 'auto', 'opacity': '1'});
                        if (jsonarray.result === 'success')
                        {
                            location.reload();
                        }
                        else
                        {
                            alert(jsonarray.error);
                        }
                    }
                    catch (err)
                    {
                        alert(err);
                        jQuery('.wpvivid-snapshot-setting-save').css({'pointer-events': 'auto', 'opacity': '1'});
                    }
                },function (XMLHttpRequest, textStatus, errorThrown)
                {
                    var error_msg = "request: "+ textStatus + "(" + errorThrown + "): an error occurred when changing snapshot settings. " +
                        "This error may be request not reaching or server not responding. Please try again later.";
                    alert(error_msg);
                });
            }

            jQuery(document).ready(function ()
            {
                jQuery('#wpvivid_snapshot_retention').val("<?php echo esc_attr($snapshot_retention)?>").change();
            });
        </script>
        <?php
    }

    public function create_snapshot()
    {
        check_ajax_referer( 'wpvivid_ajax', 'nonce' );
        $check=current_user_can('manage_options');
        $check=apply_filters('wpvivid_ajax_check_security',$check);
        if(!$check)
        {
            die();
        }

        if(isset($_POST['comment'])&&!empty($_POST['comment']))
        {
            $comment=sanitize_text_field($_POST['comment']);
        }
        else
        {
            $comment='';
        }

        set_time_limit(300);
        $snapshot=new WPvivid_Snapshot_Function_Ex();
        $snapshot->check_manual_snapshot();
        $ret=$snapshot->create_snapshot('manual',$comment);
        if($ret['result']=='success')
        {
            if($ret['finished']==1)
            {
                $ret['progress'] = '<p><span class="wpvivid-span-progress"><span class="wpvivid-span-processed-progress wpvivid-span-processed-percent-progress" style="width:100%">100% completed</span></span></p>         
                                     <p><span class="dashicons dashicons-welcome-write-blog wpvivid-dashicons-grey"></span><span>Action:</span><span>Create snapshot completed.</span></p>';
            }
            else
            {
                $progress=$snapshot->get_progress();
                $ret['progress'] = '<p><span class="wpvivid-span-progress"><span class="wpvivid-span-processed-progress wpvivid-span-processed-percent-progress" style="width:'.$progress['main_percent'].'">'.$progress['main_percent'].' completed</span></span></p>         
                                     <p><span class="dashicons dashicons-welcome-write-blog wpvivid-dashicons-grey"></span><span>Action:</span><span>'.$progress['doing'].'</span></p>';
            }
        }

        echo wp_json_encode($ret);
        die();
    }

    public function get_snapshot_progress()
    {
        check_ajax_referer( 'wpvivid_ajax', 'nonce' );
        $check=current_user_can('manage_options');
        $check=apply_filters('wpvivid_ajax_check_security',$check);
        if(!$check)
        {
            die();
        }

        set_time_limit(300);
        $snapshot=new WPvivid_Snapshot_Function_Ex();

        $progress=$snapshot->get_progress();
        $ret['progress'] = '<p><span class="wpvivid-span-progress"><span class="wpvivid-span-processed-progress wpvivid-span-processed-percent-progress" style="width:'.$progress['main_percent'].'">'.$progress['main_percent'].' completed</span></span></p>         
                                     <p><span class="dashicons dashicons-welcome-write-blog wpvivid-dashicons-grey"></span><span>Action:</span><span>'.$progress['doing'].'</span></p>';

        echo wp_json_encode($ret);
        die();
    }

    public function resume_create_snapshot()
    {
        check_ajax_referer( 'wpvivid_ajax', 'nonce' );
        $check=current_user_can('manage_options');
        $check=apply_filters('wpvivid_ajax_check_security',$check);
        if(!$check)
        {
            die();
        }

        set_time_limit(300);
        $snapshot=new WPvivid_Snapshot_Function_Ex();
        $ret=$snapshot->resume_create_snapshot();

        if($ret['result']=='success')
        {
            if($ret['finished']==1)
            {
                $ret['progress'] = '<p><span class="wpvivid-span-progress"><span class="wpvivid-span-processed-progress wpvivid-span-processed-percent-progress" style="width:100%">100% completed</span></span></p>         
                                     <p><span class="dashicons dashicons-welcome-write-blog wpvivid-dashicons-grey"></span><span>Action:</span><span>Create snapshot completed.</span></p>';
            }
            else
            {
                $progress=$snapshot->get_progress();
                $ret['progress'] = '<p><span class="wpvivid-span-progress"><span class="wpvivid-span-processed-progress wpvivid-span-processed-percent-progress" style="width:'.$progress['main_percent'].'">'.$progress['main_percent'].' completed</span></span></p>         
                                     <p><span class="dashicons dashicons-welcome-write-blog wpvivid-dashicons-grey"></span><span>Action:</span><span>'.$progress['doing'].'</span></p>';
            }
        }

        echo wp_json_encode($ret);
        die();
    }

    public function restore_snapshot()
    {
        check_ajax_referer( 'wpvivid_ajax', 'nonce' );
        $check=current_user_can('manage_options');
        $check=apply_filters('wpvivid_ajax_check_security',$check);
        if(!$check)
        {
            die();
        }

        if(isset($_POST['id']))
        {
            $snapshot_id=sanitize_text_field($_POST['id']);

            set_time_limit(300);
            $snapshot=new WPvivid_Snapshot_Function_Ex();
            $ret=$snapshot->restore_snapshot($snapshot_id);
            if($ret['result']=='success')
            {
                $ret['progress'] = '<p><span class="wpvivid-span-progress"><span class="wpvivid-span-processed-progress wpvivid-span-processed-percent-progress" style="width:100%">100% completed</span></span></p>         
                                     <p><span class="dashicons dashicons-welcome-write-blog wpvivid-dashicons-grey"></span><span>Action:</span><span>Restoring the snapshot completed.</span></p>';
            }
            echo wp_json_encode($ret);
        }

        die();
    }

    public function get_restore_snapshot_status()
    {
        check_ajax_referer( 'wpvivid_ajax', 'nonce' );
        $check=current_user_can('manage_options');
        $check=apply_filters('wpvivid_ajax_check_security',$check);
        if(!$check)
        {
            die();
        }

        set_time_limit(300);
        $snapshot=new WPvivid_Snapshot_Function_Ex();
        $ret=$snapshot->get_restore_task_data();

        if($ret['result']!='failed')
        {
            $finished=true;
            $i_sum=count($ret['snapshot_tables']);
            $i_finished=0;
            foreach ($ret['snapshot_tables'] as $table)
            {
                if($table['finished']==0)
                {
                    $finished=false;
                }
                else
                {
                    $i_finished++;
                }
            }

            $i_progress=intval(($i_finished/$i_sum)*100);
            $progress['main_percent']=$i_progress.'%';
            $progress['doing']="Restoring the snapshot.";
            $ret['progress'] = '<p><span class="wpvivid-span-progress"><span class="wpvivid-span-processed-progress wpvivid-span-processed-percent-progress" style="width:'.$progress['main_percent'].'">'.$progress['main_percent'].' completed</span></span></p>         
                                     <p><span class="dashicons dashicons-welcome-write-blog wpvivid-dashicons-grey"></span><span>Action:</span><span>'.$progress['doing'].'</span></p>';

            $ret['finished']=$finished;
        }

        echo wp_json_encode($ret);
        die();
    }

    public function delete_snapshot()
    {
        check_ajax_referer( 'wpvivid_ajax', 'nonce' );
        $check=current_user_can('manage_options');
        $check=apply_filters('wpvivid_ajax_check_security',$check);
        if(!$check)
        {
            die();
        }

        if(isset($_POST['id']))
        {
            $snapshot_id=sanitize_text_field($_POST['id']);

            set_time_limit(300);
            $snapshot=new WPvivid_Snapshot_Function_Ex();
            $ret=$snapshot->remove_snapshot($snapshot_id);
            if($ret['result']=='success')
            {
                $snapshot_data=$snapshot->get_snapshots();
                $Snapshots_list = new WPvivid_Snapshots_List_Ex();
                $Snapshots_list->set_list($snapshot_data);
                $Snapshots_list->prepare_items();
                ob_start();
                $Snapshots_list->display();
                $html = ob_get_clean();
                $ret['html']=$html;
            }

            echo wp_json_encode($ret);
        }
        die();
    }

    public function check_create_snapshot($check)
    {
        return true;
    }

    public function create_snapshot_ex($comment)
    {
        set_time_limit(300);
        $snapshot=new WPvivid_Snapshot_Function_Ex();
        $snapshot->create_snapshot('manual',$comment);
    }

    public function set_setting()
    {
        check_ajax_referer( 'wpvivid_ajax', 'nonce' );
        $check=current_user_can('manage_options');
        $check=apply_filters('wpvivid_ajax_check_security',$check);
        if(!$check)
        {
            die();
        }

        if(isset($_POST['setting'])&&!empty($_POST['setting']))
        {
            $json_setting = sanitize_text_field($_POST['setting']);
            $json_setting = stripslashes($json_setting);
            $setting = json_decode($json_setting, true);
            if (is_null($setting))
            {
                $ret['result']='failed';
                $ret['error']='json decode failed';
                echo wp_json_encode($ret);
                die();
            }

            $old_setting=$this->options->get_option('wpvivid_snapshot_setting');
            if(empty($setting))
            {
                $setting=array();
            }

            if(isset($setting['snapshot_retention']))
            {
                $old_setting['snapshot_retention']=intval($setting['snapshot_retention']);
            }

            if(isset($setting['quick_snapshot']))
            {
                $old_setting['quick_snapshot']=intval($setting['quick_snapshot']);
            }

            $this->options->update_option('wpvivid_snapshot_setting',$old_setting);
        }
        $ret['result']='success';
        echo wp_json_encode($ret);
        die();
    }

    public function add_sidebar_free()
    {
        if(defined('WPVIVID_SNAPSHOT_VERSION'))
        {
            $wpvivid_snapshot_version = WPVIVID_SNAPSHOT_VERSION;
        }
        else
        {
            $wpvivid_snapshot_version = WPVIVID_PLUGIN_VERSION;
        }

        ?>
        <div class="postbox">
            <h2>
                <div style="float: left; margin-right: 5px;"><span style="margin: 0; padding: 0"><?php esc_html_e('Current Version: ', 'wpvivid-backuprestore'); ?><?php echo esc_html($wpvivid_snapshot_version); ?></span></div>
                <div style="float: left; margin-right: 5px;"><span style="margin: 0; padding: 0">|</span></div>
                <div style="float: left; margin-left: 0;">
                    <span style="margin: 0; padding: 0"><a href="https://wordpress.org/plugins/wpvivid-snapshot-database/#developers" target="_blank" style="text-decoration: none;"><?php esc_html_e('ChangeLog', 'wpvivid-backuprestore'); ?></a></span>
                </div>
                <div style="clear: both;"></div>
            </h2>
        </div>
        <div id="wpvivid_backup_schedule_part"></div>
        <div class="postbox">
            <h2><span><?php esc_html_e('Troubleshooting', 'wpvivid-backuprestore'); ?></span></h2>
            <div class="inside">
                <table class="widefat" cellpadding="0">
                    <tbody>
                    <tr class="alternate">
                        <td class="row-title"><a href="https://docs.wpvivid.com/wpvivid-database-snapshots-create-database-snapshots-wordpress.html" target="_blank"><?php esc_html_e('Create Database Snapshots', 'wpvivid-backuprestore'); ?></a></td>
                    </tr>
                    <tr>
                        <td class="row-title"><a href="https://docs.wpvivid.com/wpvivid-database-snapshots-restore-database-snapshots-wordpress.html" target="_blank"><?php esc_html_e('Restore Database Snapshots', 'wpvivid-backuprestore'); ?></a></td>
                    </tr>
                    </tbody>
                </table>
            </div>
        </div>
        <div class="postbox">
            <h2><span><?php esc_html_e('Support', 'wpvivid-backuprestore'); ?></span></h2>
            <div class="inside">
                <table class="widefat" cellpadding="0">
                    <tbody>
                    <tr class="alternate"><td class="row-title"><a href="https://wordpress.org/support/plugin/wpvivid-snapshot-database" target="_blank"><?php esc_html_e('Get Support on Forum', 'wpvivid-backuprestore'); ?></a></td></tr>
                    </tbody>
                </table>
            </div>
        </div>
        <?php
    }

    public function add_sidebar()
    {
        if(apply_filters('wpvivid_show_sidebar',true))
        {
            ?>
            <div id="postbox-container-1" class="postbox-container">
                <div class="meta-box-sortables ui-sortable">
                    <div class="postbox  wpvivid-sidebar">
                        <h2 style="margin-top:0.5em;">
                            <span class="dashicons dashicons-book-alt wpvivid-dashicons-orange" ></span>
                            <span><?php esc_attr_e(
                                    'Documentation', 'WpAdminStyle'
                                ); ?></span></h2>
                        <div class="inside" style="padding-top:0;">
                            <ul class="" >
                                <li>
                                    <span class="dashicons dashicons-camera-alt wpvivid-dashicons-grey"></span>
                                    <a href="https://docs.wpvivid.com/wpvivid-database-snapshots-create-database-snapshots-wordpress.html"><b><?php esc_html_e('Create Database Snapshots', 'wpvivid'); ?></b></a>
                                    <small><span style="float: right;"><a href="#" style="text-decoration: none;"><span class="dashicons dashicons-migrate wpvivid-dashicons-grey"></span></a></span></small><br>
                                </li>
                                <li>
                                    <span class="dashicons dashicons-camera-alt wpvivid-dashicons-grey"></span>
                                    <a href="https://docs.wpvivid.com/wpvivid-database-snapshots-restore-database-snapshots-wordpress.html"><b><?php esc_html_e('Restore Database Snapshots', 'wpvivid'); ?></b></a>
                                    <small><span style="float: right;"><a href="#" style="text-decoration: none;"><span class="dashicons dashicons-migrate wpvivid-dashicons-grey"></span></a></span></small><br>
                                </li>
                            </ul>
                        </div>
                        <h2><span class="dashicons dashicons-businesswoman wpvivid-dashicons-green"></span>
                            <span><?php esc_attr_e(
                                    'Support', 'WpAdminStyle'
                                ); ?></span></h2>
                        <div class="inside">
                            <ul class="">
                                <li><span class="dashicons dashicons-admin-comments wpvivid-dashicons-green"></span>
                                    <a href="https://wordpress.org/support/plugin/snapshot-database/"><b><?php esc_html_e('Get Support on Forum', 'wpvivid'); ?></b></a>
                                    <br>
                                    <?php esc_html_e('If you need any help with our plugin, start a thread on the plugin support forum and we will respond shortly.', 'wpvivid'); ?>
                                </li>
                            </ul>

                        </div>
                    </div>
                </div>
            </div>
            <?php
        }
    }
}