<?php
/*
Plugin Name: Atelier-111 - Dashboard
Plugin URI: http://www.atelier-111.fr

Description: Plugin permettant la création de page d'administration dans le backoffice avec ajout/édition de metaboxes supportant le drag & drop 
Version: 1.7.9
Author: PONCET Romain
Author URI: http://www.atelier-111.fr
License: GPL2
*/


/* SOURCES UTILES :
*
* - https://code.tutsplus.com/articles/integrating-with-wordpress-ui-meta-boxes-on-custom-pages--wp-26843
* - https://wordpress.stackexchange.com/questions/109112/how-does-wordpress-remember-metabox-positions
* - https://scottdeluzio.com/force-dashboard-widget-positions/
* - https://codex.wordpress.org/WordPress.org_API
*/
if(!defined('tableNameTimeline')) {
	global $wpdb;
	define('tableNameTimeline', "{$wpdb->prefix}a111_timeline");
}

if(!class_exists('dashboard')) {
	class dashboard
	{
		// ID de l'écran sur la page d'administration du dashboard
		const TOP_SCREEN_ID = 'toplevel_page_a111-dashboard-admin';
		// ID de l'écran sur la page du dashboard
		const SUB_SCREEN_ID = 'dashboard_page_a111-dashboard';
		// Nom du dossier du plugin
		const pluginFolder = '/dashboard/';
		// Url permettant de connaitre la dernière version de WP disponible
		const lastestWpVersionUrl = 'https://api.wordpress.org/core/version-check/1.7/';
		// Url permettant de connaitre la dernière version disponible d'un plugin en rajoutant son slug après l'url
		const lastestPluginsVersionUrl = 'https://api.wordpress.org/plugins/info/1.0/';

		// Nom du plugin pour différencier les plugins de l'Atelier des autres
		const needlePlugin = 'Atelier111';

		const mtbxPosition = array('accueil' => 'normal',
									'activite-de-votre-site' => 'column1',
									'contenus-en-attente-de-publication' => 'column2',
									'statistiques-de-votre-site' => 'column3',
									'informations' => 'column4',
		 							'votre-compte-communet' => 'side',
		  );

		const nbDayBeforeDeleteEntry = 180;

		const tableName = 'a111_metaboxes';

		const moduleName = 'dashboard';

		public function __construct(  )
		{

			register_activation_hook(__FILE__, array($this, 'install'));
			register_deactivation_hook(__FILE__, array($this, 'uninstall'));


			add_action('admin_menu', array($this, 'create_menu_page'));

			add_action('load-' . self::TOP_SCREEN_ID, array('DashboardAtelier111', 'add_screen_meta_boxes'));
			add_action('admin_footer-' . self::TOP_SCREEN_ID, array('DashboardAtelier111', 'print_script_in_footer'));
			add_action('add_meta_boxes_' . self::TOP_SCREEN_ID, array('DashboardAtelier111', 'add_meta_boxes'));

			add_action('load-' . self::SUB_SCREEN_ID, array('DashboardAtelier111', 'add_screen_meta_boxes'));
			add_action('load-index.php', array($this, 'redirect_dashboard'));
			add_action('load-index.php', array($this, 'init'));
			add_action('admin_footer-' . self::SUB_SCREEN_ID, array('DashboardAtelier111', 'print_script_in_footer'));
			add_action('add_meta_boxes_' . self::SUB_SCREEN_ID, array('DashboardAtelier111', 'add_meta_boxes'));
			add_action('add_meta_boxes_' . self::SUB_SCREEN_ID, array('DashboardAtelier111', 'init'));

			add_action('wp_loaded', array($this, 'saveMailInfo'));
			//add_action('wp_loaded', array($this, 'cronOldEntry'));

			add_action('wp_ajax_checkSite', array($this, 'checkSite'));

			// Action déclenchée par AJAX
			add_action('wp_ajax_cronSite', array($this, 'cronSite'));

			// CRON Site
			// CRON Site - Vérification du coeur et des plugins
			add_action('actionCronSite', array($this,'cronSite'));
			// CRON Site - Suppression entrées dépassées
			add_action('actionCronOldEntry', array($this,'cronOldEntry'));

		}

		/**
		 * Installation du plugin
		 */

		public static function install()
		{
			global $wpdb;
			$charset_collate = $wpdb->get_charset_collate();
			$table_name = $wpdb->prefix . 'a111_metaboxes';

			$sql = "CREATE TABLE $table_name (
	id mediumint(9) NOT NULL AUTO_INCREMENT,
	mtbx_time datetime NOT NULL,
	mtbx_slug varchar(200) NOT NULL,
	mtbx_title varchar(200) NOT NULL,
	mtbx_content text NOT NULL,
	mtbx_content_isPHP boolean NOT NULL,
	mtbx_position varchar(10) NOT NULL,
	UNIQUE KEY id (id)
	) $charset_collate;";

			require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
			dbDelta($sql);

			$sql = "CREATE TABLE " . tableNameTimeline . " (id INT(2) NOT NULL AUTO_INCREMENT PRIMARY KEY,
                      type VARCHAR(32),
                      titre VARCHAR (48),
                      contenu TEXT,
                      icons VARCHAR(32),
                      status VARCHAR(16),
                      date INT(32),
                      version VARCHAR (16),
                      date_edited VARCHAR(32),
                      slug VARCHAR(64));";

            dbDelta($sql);

			/*if (!$wpdb->query($sql)) {
				var_dump($sql);
				die();
			} else {
*/
                // Vérification que la table n'est vide
                $query = "SELECT * FROM " . tableNameTimeline;
                $result = $wpdb->get_results( $query, OBJECT );

                if(is_array($result) && count($result) == 0) {

                    // Insertion des évènements des plugins
                    $listPlugins = get_plugins();
                    foreach ($listPlugins as $index => $pluginInstalled) {
                        $params = array();
                        $params['type'] = 'plugins';
                        $params['titre'] = 'Initialisation de checkup';
                        $params['contenu'] = 'Verification de la version du plugin ' . $pluginInstalled['Name'];
                        $params['icons'] = 'dashicons-admin-plugins';
                        $params['status'] = 'success';
                        $params['date'] = strtotime(date('Y-m-d'));
                        $params['version'] = $pluginInstalled['Version'];
                        $tabindex = explode('/', $index);
                        $params['slug'] = $tabindex[0];

                        $result = dashboard::insertEventPlugin($params);
                        if (!$result) {

                            var_dump($result->last_query);
                            var_dump($result->last_result);
                            var_dump($result->last_error);

                            die('Erreur d\'insertion d\'évènement plugin dans la timeline');
                        }
                    }

                    // Insertion de l'évènement de la version de wordpress
                    global $wp_version;
                    $params = array();
                    $params['type'] = 'core';
                    $params['titre'] = 'Initialisation du checkup';
                    $params['contenu'] = 'Verification de la version du coeur wordpress';
                    $params['icons'] = 'dashicons-wordpress';
                    $params['status'] = 'success';
                    $params['date'] = strtotime(date('Y-m-d'));
                    $params['version'] = $wp_version;

                    $result = dashboard::insertEventPlugin($params);
                    if (!$result) {
                        die('Erreur d\'insertion d\'évènement version wordpress dans la timeline');
                    }

                    $params = array();
                    $params['type'] = 'theme';
                    $params['titre'] = 'Initialisation du checkup';
                    $params['contenu'] = 'Verification de la version du theme courant';
                    $params['icons'] = 'dashicons-admin-appearance';
                    $params['status'] = 'success';
                    $params['date'] = strtotime(date('Y-m-d'));
                    $params['version'] = wp_get_theme()->Version;

                    $result = dashboard::insertEventPlugin($params);
                    if (!$result) {
                        die('Erreur d\'insertion d\'évènement version wordpress dans la timeline');
                    }
                }

				self::register_metaboxes();

				if (!wp_next_scheduled('actionCronSite')) {
					wp_schedule_event(time(), 'daily', 'actionCronSite');
				}

				if (!wp_next_scheduled('actionCronOldEntry')) {
					wp_schedule_event(time(), 'every_week', 'actionCronOldEntry');
				}
//			}

		}

		/**
		 * Désinstallation du plugin
		 */
		public function uninstall()
		{
			/*global $wpdb;
			$sql = "DELETE FROM " . tableNameTimeline . ";";

			if (!$wpdb->query($sql)) {
				var_dump($sql);
				die();
			} else {
				wp_clear_scheduled_hook('actionCronSite');
			}*/
		}

		/**
		 * Création des menus
		 */

		public function create_menu_page()
		{

			/*add_menu_page(
				'Gestion Dashboard', // titre de la page
				'Gestion Dashboard', // nom dans le menu
				'administrator', //role necessaire pour accès
				'a111-dashboard-admin', //slug de la page
				array('DashboardAtelier111', 'init_custom_mtbx_page'), //fonction de peuplement
				'dashicons-schedule', //icon
				90 //position
			);
			add_submenu_page('a111-dashboard-admin',
							'Rappel de connexion',
							'Rappel de connexion',
							'administrator',
							'a111-dashboard-rappel',
							array('DashboardAtelier111', 'gestion_rappel'));
*/
			add_dashboard_page(
				'Tableau de bord', // titre de la page
				'Tableau de bord', // nom dans le menu
				'edit_posts', //role necessaire pour accès
				'a111-dashboard', //slug de la page
				array('dashboard', 'init_custom_mtbx_dashboard_page') //fonction de peuplement
			);
		}

		/**
		 * Initialisation des fichiers du plugin
		 */

		public static function load_ressources()
		{

//			wp_enqueue_script('jquery');

//			wp_register_style('bootstrapMinCss', plugins_url() . self::pluginFolder . 'assets/css/bootstrap.min.css');
//			wp_enqueue_style('bootstrapMinCss');

			wp_register_style('cssDashboardAtelier111', WEBCO_URL. 'modules/' . self::moduleName . '/assets/css/styles.css');
			wp_enqueue_style('cssDashboardAtelier111');


			wp_register_script('scriptDashboardAtelier111Js', WEBCO_URL. 'modules/' . self::moduleName . '/assets/js/script.js');
			wp_enqueue_script('scriptDashboardAtelier111Js');

		}

		public static function displayModule()
		{
			self::load_ressources();
			self::createMetaBox();
			self::deleteMetaBox();
			//self::register_metaboxes();

			global $wpdb;
			$table_name = $wpdb->prefix . 'a111_metaboxes';

			$query = "SELECT * FROM $table_name;";
			$result = $wpdb->get_results( $query, OBJECT );

			$positions = array('column1','column2','column3','column4','normal','side');

			echo self::render('listMetaboxContent', array('result' => $result, 'positions' => $positions));
			echo self::render('createMetaboxContent');
			echo self::render('gestionRappel');
		}

		/**
		 * @param $view
		 * @param array $args
		 * @return string
		 */
		public static function render($view, $args = array())
		{
			foreach ($args as $k => $v) {
				$$k = $v;
			}


			$file = WEBCO_PATH . 'modules/' . self::moduleName . '/views/' . $view . '.php';

			ob_start();

			include($file);

			$content = ob_get_clean();

			return $content;
		}

		/**
		 * Inclusion du fichier des metabox de la page
		 */

		public static function init_custom_mtbx_page()
		{
			require_once('custom_mtbx_page_content.php');
		}

		/**
		 * Inclusion du fichier de contenu des metabox du dashboard
		 */

		public static function init_custom_mtbx_dashboard_page()
		{
            Webcollectivites::load_admin_ressources();
		    require_once(WEBCO_PATH.'modules/'.self::moduleName.'/views/custom_mtbx_dashboard_page_content.php');
		}

		/**
		 * Ajout de la metabox
		 */

		public static function add_meta_boxes()
		{
			$screen = get_current_screen();

			if ($screen->id == self::TOP_SCREEN_ID) {
				add_meta_box(
					'create_mtbx', // id de la metabox
					'Créer une Metabox', // titre de la metabox
					array('dashboard', 'fill_admin_new_metabox'), //fonction de peuplement
					self::TOP_SCREEN_ID, //id du screen auquel l'ajouter
					'create-mtbx' // context : target dans le HTML

				);
				add_meta_box(
					'list_mtbx', // id de la metabox
					'Metaboxes Existantes', // titre de la metabox
					array('dashboard', 'fill_admin_list_metabox'), //fonction de peuplement
					self::TOP_SCREEN_ID, //id du screen auquel l'ajouter
					'list-mtbx' // context : target dans le HTML

				);
			} else {
				//sql query
				global $wpdb;
				$table_name = $wpdb->prefix . 'a111_metaboxes';

				$query = "SELECT * FROM $table_name;";
				$result = $wpdb->get_results($query, OBJECT);

				$events = dashboard::getEventsTimeline();
				$arrEvent = array();
				// Organisation des évènements par date puis par type
				foreach($events as $event){
					$dateEvent = date('Ymd', $event['date']);
					$arrEvent[$dateEvent][$event['type']][] = $event;
				}

				foreach ($result as $row) {
					add_meta_box(
						$row->mtbx_slug, // id de la metabox
						$row->mtbx_title, // titre de la metabox
//						$row->mtbx_title, // titre de la metabox
						array('dashboard', 'fill_metabox'), //fonction de peuplement
						self::SUB_SCREEN_ID, //id du screen auquel l'ajouter
						$row->mtbx_position, // context : target dans le HTML
						'low', //priorité
						array(
							'content' => stripslashes($row->mtbx_content),
							'isPHP' => $row->mtbx_content_isPHP)
					); //args de la fonction de peuplement
				}
			}
		}

		/**
		 * Inclusion du formulaire de création de metabox
		 */

		public static function fill_admin_new_metabox()
		{
			require_once('create_mtbx_content.php');
		}

		/**
		 * Inclusion du fichier liste des metabox
		 */

		public static function fill_admin_list_metabox()
		{
			require_once('list_mtbx_content.php');
		}

		/** Remplissage de la metabox
		 * @param $array : tableau d'argument de la metabox (correspond à la ligne d'information dans la base)
		 */

		public static function fill_metabox($void, $array)
		{
			$args = $array['args'];
			if ($args['isPHP']) {
				$dir = plugin_dir_path(__FILE__) . 'mtbx_php_content';
				require_once($dir . '/' . $args['content']);
			} else {
				echo html_entity_decode($args['content'], ENT_QUOTES);
			}
		}

		/**
		 * Ajout des metas box sur l'écran concerné
		 */

		public static function add_screen_meta_boxes()
		{
			/* Trigger the add_meta_boxes hooks to allow meta boxes to be added */
			do_action('add_meta_boxes_' . self::TOP_SCREEN_ID, null);
			do_action('add_meta_boxes', self::TOP_SCREEN_ID, null);


			/* Trigger the admin_add_meta_boxes hooks to allow meta boxes to be added */
			do_action('add_meta_boxes_' . self::SUB_SCREEN_ID, null);
			do_action('add_meta_boxes', self::SUB_SCREEN_ID, null);

			/* Enqueue WordPress' script for handling the meta boxes */
			wp_enqueue_script('postbox');

			/* Add screen option: user can choose between 1 or 2 columns (default 2) */
			add_screen_option('layout_columns', array('max' => 2, 'default' => 2));
		}

		/**
		 * Affichage des scripts dans le footer. Cela 'initialise' les meta boxes
		 */
		public static function print_script_in_footer()
		{
			?>
			<script>jQuery(document).ready(function () {
					postboxes.add_postbox_toggles(pagenow);
				});</script>
			<?php
		}

		public static function init(){
			self::load_ressources();
		}

		/**
		 * Fonction qui redirige vers le dashboard Atelier-111
		 */
		function redirect_dashboard()
		{
			$screen = get_current_screen();
			if ($screen->base == 'dashboard') {
				wp_redirect(admin_url('index.php?page=a111-dashboard'));
			}
		}

		/**
		 * Fonction qui retourne tous les évènements pour la timeline
		 * @param $limit integer : le nombre d'évènements
		 * @return array : les évènements
		 */
		public static function getEventsTimeline($limit = 500)
		{
			global $wpdb;
			$results = $wpdb->get_results("SELECT * FROM " . tableNameTimeline . " ORDER BY date DESC LIMIT $limit", ARRAY_A);
			//$results = $wpdb->get_results("SELECT * FROM " . tableNameTimeline . " ORDER BY id ASC LIMIT $limit", ARRAY_A);
			return $results;
		}

		/**
		 * Fonction qui retourne tous les évènements en fonction de la colonne
		 * @param $slug string : le slug du plugin
		 * @param $limit integer : le nombre d'évènements
		 * @return array : les évènements du plugin
		 */
		private function getEventsByColumn($column, $value, $limit = 20)
		{
			global $wpdb;
			$results = $wpdb->get_results("SELECT * FROM " . tableNameTimeline . " WHERE $column ='$value' ORDER BY id DESC LIMIT $limit", ARRAY_A);
			return $results;
		}

		/**
		 * Fonction qui enregistre un évènement spécifique
		 * @param $param array : les champs de la table en index et la donnée à insérer en valeur
		 * @return bool
		 */
		public static function insertEventPlugin($param)
		{
			global $wpdb;
			$results = $wpdb->insert(tableNameTimeline, $param);
			return $results;
		}

		/**
		 * Fonction qui retourne les dernières versions enregistrées comme évènement des plugins installés
		 * @return array : les plugins et leur version
		 */
		public function getVersionActivePlugins()
		{
			global $wpdb;
			$results = $wpdb->get_results("SELECT DISTINCT(slug), version FROM " . tableNameTimeline . " WHERE type='plugins'", ARRAY_A);
			return $results;
		}

		/**
		 * Fonction qui vérifie si le site est à jour (Version WP et Version plugins)
		 *
		 * @return bool
		 */
		public function checkSite()
		{
			//header('Content-type: application/json');
			$modules = webcollectivites::check_db_modules();
            $isAdmin = false;

            foreach($modules as $module) {
                if ($module['module_nom'] == 'parametres') {
                    $admins = parametres::getParametreDouble('ADMIN', 'NETTOYAGE');
                    if (!is_null($admins)) {

                        $user = wp_get_current_user();

                        $listeAdmins = explode(';', $admins);
                        if (in_array($user->user_login, $listeAdmins)) {
                            $isAdmin = true;
                        }
                    } else {
                        $isAdmin = false;
                    }
                } else {
                    $isAdmin = false;
                }
            }
			$returnCheckVersion = $this->checkVersion($isAdmin);

			$returnCheckPluginsVersion = $this->checkPluginsVersion($isAdmin);

			if ($returnCheckVersion['wordpress']['response'] && $returnCheckPluginsVersion['plugins']['response']) {
				if($isAdmin){
					$response = array_merge($returnCheckPluginsVersion, $returnCheckVersion);
					$response['admin'] = true;
					echo json_encode($response);
				}else{
					echo json_encode(array('wordpress' => array('response' => true),
						'plugins' => array('response' => true),
						'admin' => false));
				}

			} else {
				if($isAdmin){
					$response = array_merge($returnCheckPluginsVersion, $returnCheckVersion);
					$response['admin'] = true;
					echo json_encode($response);
				}else{
					echo json_encode(array('wordpress' => array('response' => false),
						'plugins' => array('response' => false),
						'admin' => false));
				}
			}
			exit();
		}

		/**
		 * Fonction qui verifie la version WP du site avec la dernière version WP disponible
		 * @return bool
		 */
		public static function checkVersion($isAdmin = false)
		{

			global $wp_version;
			$responseWp = array();
			$response = wp_remote_get(self::lastestWpVersionUrl);
			$json = $response['body'];
			$obj = json_decode($json);
			if($isAdmin) {
				$responseWp['wordpress']['latest'] = $obj->offers[0]->version;
				$responseWp['wordpress']['website'] = $wp_version;
			}
			if ($obj->offers[0]->version == $wp_version) {
				$responseWp['wordpress']['response'] = true;
				return $responseWp;
			} else {
				$responseWp['wordpress']['response'] = false;
				return $responseWp;
			}

		}

		/**
		 * Fonction qui verifie la version de chaque plugin installé avec la version disponible
		 * @return bool
		 * @todo : Faire en sorte qu'il soit possible d'interroger le site principal (maintenance webco) ou les repos Github pour connaître la version des plugins A111
		 */
		public function checkPluginsVersion($isAdmin = false)
		{
			$responsePlugins = array();
			// Récupération des plugins actifs
			$tabActivePlugins = get_option('active_plugins');

			foreach ($tabActivePlugins as $activePlugin) {
				// Si il s'agit d'un plugin Atelier-111
				if (strstr($activePlugin, self::needlePlugin)) {

				} else {
					// Récupération des inforamtions disponible sur l'API wordpress.org du plugin courant
					$tabActivePlugin = explode('/', $activePlugin);
					$slugPlugin = $tabActivePlugin[0];
					$response = wp_remote_get(self::lastestPluginsVersionUrl . $slugPlugin);
					$json = $response['body'];
					$obj = unserialize($json);
					// Verification que l'objet ne soit pas null ou que la propriété erreur n'est pas présente.
					//Si l'object est nul c'est qu'il s'agit d'un plugin payant donc non questionnable sur l'API de Wordpress
					if($obj != NULL && !property_exists($obj, 'error')) {
						$eventInstallPlugin = $this->getEventsByColumn('slug', $slugPlugin, 1);
						if (is_array($eventInstallPlugin)) {
							$eventInstallPlugin = current($eventInstallPlugin);
							// Vérification si la version disponible en ligne est la même que la version enregistrée en évènement
							if ($obj->version != $eventInstallPlugin['version']) {
								$responsePlugins['plugins']['response'] = false;
								if($isAdmin) {
									$responsePlugins['plugins'][$slugPlugin]['latest'] = $obj->version;
									$responsePlugins['plugins'][$slugPlugin]['website'] = $eventInstallPlugin['version'];
								}
								//  return false;
							}
							// Dans le cas où le plugin n'est pas trouvé dans la liste des évènements
						} else {
							$responsePlugins['plugins']['response'] = false;
							if($isAdmin) {
								$responsePlugins['plugins'][$slugPlugin]['latest'] = $obj->version;
								$responsePlugins['plugins'][$slugPlugin]['website'] = 'NON INSTALLE';
							}
							//  return false;
						}
					}
				}
			}
			if(!array_key_exists('response', $responsePlugins['plugins'])){
				$responsePlugins['plugins']['response'] = true;
			}

			return $responsePlugins;
		}

		/**
		 * Fonction qui compare la version des plugins installés et la dernière version dispo avec le dernier évènement du plugin.
		 * Si la version est différente alors un nouvel évènement est ajouté
		 * @return array : tableau contenant le statut du site. Si il est totalement à jour ainsi qu'une entrée par plugins avec sa version.
		 */
		public function cronSite()
		{
			// Récupération des plugins actifs
			$tabActivePlugins = get_option('active_plugins');
			// Récupération de tous les plugins (et de leurs informations)
			$tabAllPlugins = get_plugins();
			foreach ($tabActivePlugins as $activePlugin) {
				// Si il s'agit d'un plugin Atelier-111
				if (strstr($activePlugin, self::needlePlugin)) {

				} else {
					// Récupération des inforamtions disponible sur l'API wordpress.org du plugin courant
					$tabActivePlugin = explode('/', $activePlugin);
					$slugPlugin = $tabActivePlugin[0];


					$response = wp_remote_get(self::lastestPluginsVersionUrl . $slugPlugin);
					$json = $response['body'];
					$obj = unserialize($json);

                    if(!property_exists($obj, 'error')) {
                        $eventInstallPlugin = $this->getEventsByColumn('slug', $slugPlugin, 1);
                        if (is_array($eventInstallPlugin)) {

                            $eventInstallPlugin = current($eventInstallPlugin);
                            // Vérification que la version en ligne n'est pas la même que la version enregistrée en évènement ET si la version installée est la même que la version en ligne
                            if ($obj->version != $eventInstallPlugin['version'] && $tabAllPlugins[$activePlugin]['Version'] == $obj->version) {

                                // Insertion de l'évènement de la nouvelle version du plugin
                                $params = array();
                                $params['type'] = 'plugins';
                                $params['titre'] = 'Mise à jour';
                                $params['contenu'] = 'Mise à jour d\'un plugin';
                                $params['icons'] = 'dashicons-admin-plugins';
                                $params['status'] = 'success';
                                $params['date'] = strtotime(date('Y-m-d'));
                                $params['version'] = $obj->version;
                                $params['slug'] = $tabActivePlugin[0];
                                $result = dashboard::insertEventPlugin($params);
                                if (!$result) {

                                    var_dump($result->last_query());
                                    var_dump($result->show_errors());

                                    die('Erreur d\'insertion d\'évènement plugin dans la timeline');
                                }
                            }
                        }
                    }
				}
			}

			// Insertion de l'évènement mise à jour de la version de wordpress
			global $wp_version;
			$response = wp_remote_get(self::lastestWpVersionUrl);
			$json = $response['body'];
			$obj = json_decode($json);
			$eventCore = $this->getEventsByColumn('type','core', 1);
			$eventCore = current($eventCore);
			// Vérification que la version en ligne n'est pas la même que la version enregistrée en évènement ET si la version installée est la même que la version en ligne
			if ($obj->offers[0]->version == $wp_version && $wp_version != $eventCore['version']) {
				$params = array();
				$params['type'] = 'core';
				$params['titre'] = 'Mise à jour';
				$params['contenu'] = 'Mise à jour du coeur wordpress';
				$params['icons'] = 'dashicons-wordpress';
				$params['status'] = 'success';
				$params['date'] = strtotime(date('Y-m-d'));
				$params['version'] = $wp_version;

				$result = dashboard::insertEventPlugin($params);
				if (!$result) {
					die('Erreur d\'insertion d\'évènement version wordpress dans la timeline');
				}
			}

            // Insertion de l'évènement mise à jour de la version de du thème courant
            $version =  wp_get_theme()->Version;
            $eventCore = $this->getEventsByColumn('type','theme', 1);
            $eventCore = current($eventCore);

            // Vérification que la version en ligne n'est pas la même que la version enregistrée en évènement ET si la version installée est la même que la version en ligne
            if (($eventCore['version'] < $version && $version != $eventCore['version']) || !isset($eventCore['version'])) {
                $params = array();
                $params['type'] = 'theme';
                $params['titre'] = 'Mise à jour';
                $params['contenu'] = 'Mise à jour du thème';
                $params['icons'] = 'dashicons-admin-appearance';
                $params['status'] = 'success';
                $params['date'] = strtotime(date('Y-m-d'));
                $params['version'] = $version;

                $result = dashboard::insertEventPlugin($params);
                if (!$result) {
                    die('Erreur d\'insertion d\'évènement version du thème dans la timeline');
                }
            }

		}

		/**
		 * Suppression des ancienne entrées dans le formulaires graivity forms.
		 */
		public function cronOldEntry() {

			if(is_plugin_active('gravityforms/gravityforms.php')){

				$headers = array();
				$headers[] = 'Content-Type: text/html; charset=UTF-8';
				$headers[] = "From: Webcollectivités <".get_bloginfo('admin_email').">";

				global $wpdb;
				// Récupération et stockage des entrées où se trouvent des adresses email
				$results = $wpdb->get_results("SELECT * FROM ".$wpdb->prefix."gf_entry_meta");
				$arrayIdEntry = array();
				$arrayMail = array();
				if(!empty($results)){
					foreach($results as $result){
						if(filter_var($result->meta_value, FILTER_VALIDATE_EMAIL)){
							$arrayMail[] = $result->meta_value;
							if(!in_array($result->entry_id, $arrayIdEntry)){
								$arrayIdEntry[] = $result->entry_id;
							}
						}
					}
				}
				if(!empty($arrayIdEntry)) {
					$entryResult = $wpdb->get_results("SELECT * FROM " . $wpdb->prefix . "gf_entry WHERE id IN (".implode(',', $arrayIdEntry).")");
					if (!empty($entryResult)) {
						foreach ($entryResult as $entry) {
							$tabCreationDate = explode(' ', $entry->date_created);
							$dateTimeCreation = new DateTime($tabCreationDate[0]);
							$dateTimeComparaison = new DateTime(date('Y-m-d'));
							$interval = $dateTimeCreation->diff($dateTimeComparaison);
							$days = $interval->format('%a');
							if (dashboard::nbDayBeforeDeleteEntry <= $days) {
								$wpdb->delete($wpdb->prefix . "gf_entry", array("id" => $entry->id));
								$wpdb->delete($wpdb->prefix . "gf_entry_meta", array("entry_id" => $entry->id));
							}
						}
					}
				}


				// Vérification sur les anciennes tables
				if($wpdb->get_results("SHOW TABLES LIKE '". $wpdb->prefix. "rg_lead_detail'")){
					$results = $wpdb->get_results("SELECT * FROM ".$wpdb->prefix."rg_lead_detail");
					$arrayIdEntry = array();
					$arrayMail = array();
					if(!empty($results)){
						foreach($results as $result){
							if(filter_var($result->value, FILTER_VALIDATE_EMAIL)) {
								$arrayMail[] = $result->value;
								if (!in_array($result->lead_id, $arrayIdEntry)) {
									$arrayIdEntry[] = $result->lead_id;
								}
							}
						}
					}

					if(!empty($arrayIdEntry)) {
						$entryResult = $wpdb->get_results("SELECT * FROM " . $wpdb->prefix . "rg_lead WHERE id IN (".implode(',', $arrayIdEntry).")");
						if (!empty($entryResult)) {
							foreach ($entryResult as $entry) {
								$tabCreationDate = explode(' ', $entry->date_created);
								$dateTimeCreation = new DateTime($tabCreationDate[0]);
								$dateTimeComparaison = new DateTime(date('Y-m-d'));
								$interval = $dateTimeCreation->diff($dateTimeComparaison);
								$days = $interval->format('%a');
								if (dashboard::nbDayBeforeDeleteEntry <= $days) {
									$wpdb->delete($wpdb->prefix . "rg_lead", array("id" => $entry->id));
									$wpdb->delete($wpdb->prefix . "rg_lead_detail", array("lead_id" => $entry->id));
								}
							}
						}
					}

				}

			}
		}

		/**
		 * Fonction qui enregistre les informations du mail de rappel de connexion
		 *
		 */
		public function saveMailInfo()
		{
			global $msg;

			if(isset($_POST['saveMail']) && !empty($_POST['saveMail'])){
				try {
					if (!empty($_POST['subjectMail']) && !empty($_POST['contentMail'])) {
						if($_POST['nbJour'] > 0) {
							if(update_option('rappel_nbJour', $_POST['nbJour'])){
								if(update_option('rappel_journalier', $_POST['rappelJournalier'])){
									if(update_option('rappel_subjectMail', $_POST['subjectMail'])){
										if(update_option('rappel_contentMail', $_POST['contentMail'])){
											throw new Exception ('Mise à jour effectué');
										}else{
											throw new Exception ('Erreur lors du changement du contenu');
										}
									}else{
										throw new Exception ('Erreur lors du changement du sujet');
									}
								}else{
									throw new Exception ('Erreur lors du changement du rappel journalier');
								}
							}else {
								throw new Exception ('Erreur lors du changement du nombre de jour');
							}
						}else{
							throw new Exception ('Le nombre de jour doit être un entier');
						}
					} else {
						throw new Exception ('Le sujet et/ou le message ne peut pas être vide');
					}
				} catch( Exception $e) {
					$msg = $e->getMessage();
				}
			}
		}

		/**
		 * Fonction envoyant un mail de rappel de connexion
		 *
		 */

		public static function checkRappel()
		{
			$nbJour = get_option('rappel_nbJour');
			if($nbJour > 0){
				global $post;
				$args = array('post_type' => 'any',
							'posts_per_page' => 1,
				'post_status' => 'publish',
							'orderby' => 'modified',
							'order' => 'DESC');

				$query = new WP_Query($args);

				if($query->have_posts()){
					while($query->have_posts()){
						$query->the_post();
						$date1 = new DateTime($post->post_modified);
						$date2 = new DateTime(date('Y-m-d', time()));
						$interval = $date1->diff($date2);
						$user = wp_get_current_user();
						var_dump($user->user_email);
						if($interval->format('%a') >= $nbJour && get_option('rappel_sentMail') != true){
							$headers = array();
							$headers[] = 'Content-Type: text/html; charset=UTF-8';
							$headers[] = "From: Webcollectivités <".get_bloginfo('admin_email').">";

							if(wp_mail($user->user_email, get_option('rappel_subjectMail'), stripslashes(get_option('rappel_contentMail')), $headers)){
								update_option('rappel_sentMail', true);
							}
						}
					}
				}
			}
		}

		/**
		 * Register in database files already present in metaboxes folder
		 */
		public static function register_metaboxes() {

			$dir = plugin_dir_path( __FILE__ ).'mtbx_php_content'; //-> ' .../custom-metabox-page/mtbx_php_content '

			// No folder
			if (!file_exists($dir)) {
				return;
			}

			global $wpdb;

			$table_name = $wpdb->prefix . 'a111_metaboxes';

			// Get all files stored in DB
			$results = $wpdb->get_results("SELECT * FROM $table_name WHERE mtbx_content_isPHP = 1", ARRAY_A);
			$filesList = array();
			if(!empty($results)){
				foreach($results as $row){
					$filesList[] = $row['mtbx_content'];
				}
			}

			$files = scandir($dir);

			foreach($files as $file){
				// Don't insert file twice
				if(!in_array($file, $filesList)) {
					$tabFile = explode('.', $file);

					if($tabFile[0] != '') {
                        $position = self::mtbxPosition[$tabFile[0]];

                        if (is_null($position)) {
                            $position = "column1";
                        }

                        $wpdb->insert(
                            $table_name,
                            array(
                                'mtbx_time' => date('Y-m-d H:i:s'),
                                'mtbx_slug' => $tabFile[0],
                                'mtbx_title' => ucfirst(str_replace('-', ' ', $tabFile[0])),
                                'mtbx_content' => $file,
                                'mtbx_content_isPHP' => TRUE,
                                'mtbx_position' => $position
                            )
                        );
                    }
				}

			}

		}

		/**
		 * Crée une metabox si le formulaire a été posté
		 */
		private static function createMetaBox() {

			if(isset($_POST) && !empty($_POST['saveMetaBox'])) {

				$mtbx_title = (isset($_POST['mtbx_title'])) ? $_POST['mtbx_title'] : 'ERROR: no title recieved ';
				$mtbx_content = (isset($_POST['mtbx_content'])) ? $_POST['mtbx_content'] : 'ERROR: no content recieved ';
				$mtbx_position = (isset($_POST['mtbx_position'])) ? $_POST['mtbx_position'] : 'ERROR: no position recieved ';

				$mtbx_content_isPHP = (isset($_POST['mtbx_isPHP'])) ? $_POST['mtbx_isPHP'] : 'ERROR: no bool isPHP recieved ';
				//echo "------------  isPHP  : ". $mtbx_content_isPHP .'    ------------------------';
				$mtbx_slug = sanitize_title($mtbx_title);
				$mtbx_time = current_time('mysql');

				global $wpdb;
				$table_name = $wpdb->prefix . self::tableName;

				if ($mtbx_content_isPHP === 'true') {

					$dir = plugin_dir_path(__FILE__) . 'mtbx_php_content'; //-> ' .../custom-metabox-page/mtbx_php_content '
					$filename = $mtbx_slug . '.php';

					if (!file_exists($dir)) {
						mkdir($dir, 0777, true);
					}

					$f = fopen($dir . '/' . $filename, 'w');
					fwrite($f, html_entity_decode($mtbx_content, ENT_QUOTES));
					fclose($f);


					$wpdb->insert(
						$table_name,
						array(
							'mtbx_time' => $mtbx_time,
							'mtbx_slug' => $mtbx_slug,
							'mtbx_title' => $mtbx_title,
							'mtbx_content' => $filename,
							'mtbx_content_isPHP' => TRUE,
							'mtbx_position' => $mtbx_position
						)
					);
				} else {

					$wpdb->insert(
						$table_name,
						array(
							'mtbx_time' => $mtbx_time,
							'mtbx_slug' => $mtbx_slug,
							'mtbx_title' => $mtbx_title,
							'mtbx_content' => $mtbx_content,
							'mtbx_content_isPHP' => FALSE,
							'mtbx_position' => $mtbx_position
						)
					);

				}
			}
		}


		/**
		 * Suppression de la metabox
		 */
		private static function deleteMetabox() {
			if (isset($_GET['action']) && $_GET['action'] == 'delete') {
				global $wpdb;
				$slug = $_GET['slug'];
				$arrayWhere = array('mtbx_slug' => $slug);

				global $msg;

				$wpdb->delete($wpdb->prefix.self::tableName, $arrayWhere);

			}
		}
	}

}

//new DashboardAtelier111();

if(!class_exists('DashboardAtelier111')){
    class DashboardAtelier111 extends dashboard {

    }
}