<?php
/**-----------------------------------------------
*
* Rooty, 2018 <rooty@rooty.me>
*
*
* This software is protected by copyright, please
* read the file COPYRIGHT.
* This program is distributed in the hope that it
* will be useful, but without any warranty; without
* even the implied warranty of merchantability or
* fitness for a particular purpose. Please
* read the file LICENCE.
*
* Ce fichier contient la classe InstallDriver
* @copyright Copyright &copy; 2009-2018, Rooty
* @author Rooty <www.rooty.me|rooty@rooty.me>
* @since 2004/06/07
* @version 0.3 
* @link www.rooty.me
* @package object_coordination
* @subpackage InstallManager
*/
if ( !defined('SYSTEM_IN') )
{
	//die("Hacking attempt");
}

/**
* Classe InstallDriver
*
* Cette classe est la classe par défaut d'intallation && suppression de package
* elle peut être surchargée pour chaque installation
* @package object_coordination
* @subpackage InstallManager
*/
Class InstallDriver
{


/**
* @desc nom du package (=au nom du répertoire d'installation)
* @var entier
* @access private
*/
var $pkgName	    = "";
/**
* @desc emplacement du repertoire racine d'installation
* @var entier
* @access private
*/
var $rootDir	    = "";
/**
* @desc nom du fichier ini pour la copie de fichier
* @var entier
* @access private
*/
var $fileToCopy	    = "cp.ini";
/**
* @desc nom du fichier sql de d'installation
* @var entier
* @access private
*/
var $dbInstallFile  = "install";
/**
* @desc nom du fichier sql de désinstallation
* @var entier
* @access private
*/
var $dbUninstallFile= "uninstall";

	//
	// Constructeur
	//
// /**
// * Constructeur PHP4
// * @param chaine nom du package
// * @param chaine path de travail
// */
// 	function InstallDriver($pkgName, $rootDir=null){
// 		$this->__construct($pkgName, $rootDir);
// 	}

/**
* Constructeur PHP5
* @param chaine nom du package
* @param chaine path de travail
*/
	function __construct($pkgName, $rootDir=null){
		$this->pkgName=$pkgName;
		$this->rootDir=(!is_null($rootDir))?$rootDir:($GLOBALS["CONF_DATA_PATH"]."data/upload/install/".$pkgName);
	}

	//
	// Procédures d'installation
	//
/**
* avant installation, liste les pré-requis...
* @param chaine url form
* @return chaine code message
*/
	function __beforeInstall($url)
	{
		/* gestion du lib en fonction de la langue courante */
		$currentCode=$GLOBALS["SYSTEM_USER_SESSION"]->langue->getCode();
		$defaultCode=$GLOBALS["SYSTEM_DEFAULT_LANGUAGE_CODE"];
		/* fin récupèration des codes par defaut */
		
		mxPageTitle("beforeInstallTitlePage");
		
		$arrayCallCss = array();
		$arrayCallCss[] = "data/css/dataTables.bootstrap4/1.10.22/dataTables.bootstrap4.min.css";
		mxCallCss($arrayCallCss);
		
		$arrayCallJs = array();
		$arrayCallJs[] = "data/javascript/jquery.dataTables/1.10.22/jquery.dataTables.min.js";
		$arrayCallJs[] = "data/javascript/dataTables.bootstrap4/1.10.22/dataTables.bootstrap4.min.js";
		mxCallJs($arrayCallJs);
		
		$arrayRawJs[] = "\$(document).ready(function(){\$('#tabListScripts').dataTable({\"bPaginate\": true,\"bFilter\": false,\"bInfo\": true,\"sPaginationType\": \"full_numbers\",\"bAutoWidth\": false,\"bLengthChange\": false,\"aaSorting\": [[ 1, \"asc\" ]],\"iDisplayLength\": 10,\"oLanguage\": {\"sUrl\": \"data/message/".$currentCode."/datatables.txt\"}});});";
		$arrayRawJs[] = "function visible(element){if(document.getElementById){if(document.getElementById(element).style.display=='none'){document.getElementById(element).style.display='';}else{document.getElementById(element).style.display='none';}}else if(document.all){if(document.all[element].style.display=='none'){document.all[element].style.display='';}else{document.all[element].style.display='none';}}}";
		mxRawJs($arrayRawJs);
		
		includePackage ("backup.php");
		$backup		=new backup();
		$tabficini	=array();
		$tabficsource	=array();
		$nbToReplace	=0;
		
		withBlocPath("InstallManager", "beforeInstall");
		//Recupération des droit à passer aux fichiers
		
		//Notification de l'installeur par défaut
		$installeur=get_Class($this);
		if ($installeur=="installdriver")
		{
			$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("Installeur",getMessage ("InstalleurDefaut"));
		}
		else
		{
			$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("Installeur",getMessage("InstalleurSurchargé").$installeur);
		}
		
		$droit=$backup->checkConfigForPerms();

		// les droits ne sont pas suffisent compte ftp et php
		if (!$droit) {
		    return "";
		}

		$sourcepath=$GLOBALS["CONF_DATA_PATH"]."data/upload/install/package/".$this->pkgName."/";
		$checkBd=0;
		//Vérification de l'existence d'un fichier BD pour la base de données courante
		if (file_exists($sourcepath."install.".DATA_SOURCE_SQL_TYPE.".sql"))
		{
			$checkBd=1;
		}
		//Vérification de l'existence d'autre script de BD pour un autre type de BD
		else if ($tabficsource=$backup->getContentDir($sourcepath))
		{
			foreach($tabficsource as $key=>$val)
			{
				//Récupération du nom complet du fichier
				$posfic=strrpos($tabficsource[$key][0],"/")+1;
				$fic=substr($tabficsource[$key][0],$posfic);
				//Récupération de l'extension et le nom du fichier source pour vérifier l'existence d'une BD
				if (strlen($fic)>7)
				{
					$nom=substr($fic,0, strlen("install"));
					$type=substr($fic, (strlen($fic)-3));
					
					if ($nom=="install" && $type=="sql")
					{
						$checkBd=2;
					}
				}
			}
		}

		if ($checkBd==1)
		{
			//Affichage du fichier sql dans une div
			$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("BLOCBD.ficBD",$sourcepath."install.".DATA_SOURCE_SQL_TYPE.".sql");
			$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("BLOCBD.typeBD", DATA_SOURCE_SQL_TYPE);
			//Lecture du fichier et affichage du contenu
			$fichier=new File($sourcepath."install.".DATA_SOURCE_SQL_TYPE.".sql");
			$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("BLOCBD.scriptBD",str_replace("\n", "<br/>", $fichier->readAll()));
			$fichier->close();
		}else if($checkBd==2){
			// L'installation à besoin d'une BD... mais n'a pas le type courant -> erreur
			$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("NoDatabase", getMessage("WrongTypeBd"));
		}
		else if ($checkBd==0){
			$GLOBALS["SYSTEM_TEMPLATE"]->MxBloc("BLOCBD", "delete");
// 			$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("NoDatabase", getMessage("NoBd"));
		}

		$msg="";
		$ficError=false;
		//Test de l'existence du fichier ini contenant les fichiers a copier et recupération dans un tableau
		$iniPath=$GLOBALS["CONF_DATA_PATH"]."data/upload/install/package/".$this->pkgName."/".$this->fileToCopy;
		if (file_exists($iniPath))
		{
			//Parcours du fichier ini
			$tabficini=$backup->parcoursInitotab($iniPath, $sourcepath, $droit);
			if (count($tabficini)>0)
			{
				$tabRight=$backup->verifFilePermFromTab($tabficini, $droit);
				//Test des droits sur les fichiers
				foreach($tabficini as $key=>$val)
				{
					//On verifie l'existence du fichier
					if (($tabficini[$key][1] === True))
					{
						###########################################################
						### Affichage des fichiers utilisés			
						###########################################################
						//Affichage pour un fichier normal
						$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("BLOCFIC.ficSrc", $key);
						$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("BLOCFIC.ficDest", $tabficini[$key][0]);
						$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("BLOCFIC.versionSrc", $backup->getFileVersion($sourcepath.$key));
						$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("BLOCFIC.versionDest", $backup->getFileVersion($tabficini[$key][0]));
						
						//Affectation des droits et verifications des versions
						if ($backup->checkFileVersion($sourcepath.$key, $tabficini[$key][0]))
						{
							# Verification des droits de fichier ()droit destination
							if (isset($tabRight[$key]) && $tabRight[$key][1]===true)
							{
								$GLOBALS["SYSTEM_TEMPLATE"]->MxAttribut("BLOCFIC.class", "lnColor3");
							}else{
								
								$GLOBALS["SYSTEM_TEMPLATE"]->MxAttribut("BLOCFIC.class", "lnColor2");
								$msg=getMessage("NoRightForFile").$tabRight[$key][0];
								$ficError=true;
							}
							$nbToReplace++;
						}else{
							$GLOBALS["SYSTEM_TEMPLATE"]->MxAttribut("BLOCFIC.class", "lnColor1");
							//$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("BLOCFIC.status", "Version source trop ancienne.");
						}
					}else{
						$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("BLOCFIC.ficSrc", $key);
						$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("BLOCFIC.ficDest", $tabficini[$key][0]);
						$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("BLOCFIC.versionSrc", getMessage("NoFileFound"));
						$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("BLOCFIC.versionDest", $backup->getFileVersion($tabficini[$key][0]));
						$GLOBALS["SYSTEM_TEMPLATE"]->MxAttribut("BLOCFIC.class", "lnColor1");
						$msg=getMessage("FileSrcError");
						$ficError=true;
					}
					$GLOBALS["SYSTEM_TEMPLATE"]-> MxBloc("BLOCFIC", "loop");
				}
				if ($nbToReplace==0)
				{
					# la version est déjà installée...
					$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("status", getMessage("AlreadyInstalled"));
					$msg=getMessage("AlreadyInstalled");
				}
			}
		}
		else
		{
			//Le fichier.ini n'existe pas ou on a pas les droits nécessaire pour y acceder
			$msg=getMessage("PakcageNotValid");
		}
		if ( ($msg=="") && ($checkBd!=2) && ($ficError===false) )
		{
			$GLOBALS["SYSTEM_TEMPLATE"]->MxAttribut("HIDDEN.urlAction", $url);
			
		}else{
			$GLOBALS["SYSTEM_TEMPLATE"]->MxBloc("HIDDEN", "delete");
		}
		return $msg;
	}

/**
* fait l'installation, mise en place du package, copie des sources et backup des anciens fichiers.
* @return booleen
*/
	function __install($installName, $doBackup, $url)
	{
		/* gestion du lib en fonction de la langue courante */
		$currentCode=$GLOBALS["SYSTEM_USER_SESSION"]->langue->getCode();
		$defaultCode=$GLOBALS["SYSTEM_DEFAULT_LANGUAGE_CODE"];
		/* fin récupèration des codes par defaut */
		
		mxPageTitle("beforeInstallTitlePage");
		
		$arrayCallCss = array();
		$arrayCallCss[] = "data/css/dataTables.bootstrap4/1.10.22/dataTables.bootstrap4.min.css";
		mxCallCss($arrayCallCss);
		
		$arrayCallJs = array();
		$arrayCallJs[] = "data/javascript/jquery.dataTables/1.10.22/jquery.dataTables.min.js";
		$arrayCallJs[] = "data/javascript/dataTables.bootstrap4/1.10.22/dataTables.bootstrap4.min.js";
		mxCallJs($arrayCallJs);
		
		$arrayRawJs[] = "\$(document).ready(function(){\$('#tabListFiles').dataTable({\"bPaginate\": false,\"bFilter\": false,\"bInfo\": false,\"bAutoWidth\": false,\"bLengthChange\": false,\"aaSorting\": [[ 1, \"asc\" ]],\"oLanguage\": {\"sUrl\": \"data/message/".$currentCode."/datatables.txt\"}});});";
		$arrayRawJs[] = "\$(document).ready(function(){\$('#tabListBDScripts').dataTable({\"bPaginate\": false,\"bFilter\": false,\"bInfo\": false,\"bAutoWidth\": false,\"bLengthChange\": false,\"aaSorting\": [[ 1, \"asc\" ]],\"oLanguage\": {\"sUrl\": \"data/message/".$currentCode."/datatables.txt\"}});});";
		$arrayRawJs[] = "function visible(element){if(document.getElementById){if(document.getElementById(element).style.display=='none'){document.getElementById(element).style.display='';}else{document.getElementById(element).style.display='none';}}else if(document.all){if(document.all[element].style.display=='none'){document.all[element].style.display='';}else{document.all[element].style.display='none';}}}";
		mxRawJs($arrayRawJs);
	
		//Récupération du contenu du fichier ini.
		includePackage ("backup.php");
		$backup 	= new backup();
		$tabcopie	=array();
		$tabini		=array();
		$tabbkpfic	=array();

		withBlocPath("InstallManager", "install");

		$iniPath	=$GLOBALS["CONF_DATA_PATH"]."data/upload/install/package/".$this->pkgName."/".$this->fileToCopy;
		$sourcepath	=$GLOBALS["CONF_DATA_PATH"]."data/upload/install/package/".$this->pkgName."/";

		//Recupération des droit à passer aux fichiers
		$droit=$backup->checkConfigForPerms();

		// les droits ne sont pas suffisent compte ftp et php
		if (!$droit) 
		{
			addError(2, "InstallDriver", "__install", "Les droits système ne sont pas valides...");
			return "InvalidRight";
		}

		# Verification du tabini (droit source)
		$tabini=$backup->parcoursInitoTab($iniPath, $sourcepath, $droit);
		if ( ($tabini!==false) && (count($tabini)>0) ){
			foreach($tabini as $key=>$val){
				if($val[1]==false){
					addError(2, "InstallDriver", "__install", "Les droits système ne sont pas valides (source)...");
					return "InvalidPackage";
				}else if(!$backup->checkFileVersion($sourcepath.$key, $tabini[$key][0])){
					unset($tabini[$key]);
				}
			}
		}else if ($tabini===false){
			addError(2, "InstallDriver", "__install", "Le package n'est pas valide (fichier de copie non valide)");
			return "InvalidPackage";
		}

		# Verification des droits de fichier ()droit destination
		$tabRight=$backup->verifFilePermFromTab($tabini, $droit);
		if ( ($tabRight!==false) && (count($tabRight)>0) ){
			foreach($tabRight as $key=>$val){
				if($val[1]==false){
					addError(2, "InstallDriver", "__install", "Les droits système ne sont pas valides (destination)...");
					return "InvalidPackage";
				}
			}
		}else if ($tabRight===false){
			addError(2, "InstallDriver", "__install", "Les fichiers destinations ne sont pas valides");
			return "InvalidFileInstall";
		}

		$backupId=$backup->createBackup($installName);

		# Sauvegarde....
		if ($doBackup)
		{
			$tabBkpFile	=$backup->bkpFileFromTab($backupId, $tabini);
			$bkpBd		=$backup->bkpDbFromTab($backupId, $installName, $droit);
			
		}
		# Fin backup

		# Installation
		if ($tabcopie=$backup->copyFileFromTab($tabini, $installName, $droit))
		{
			foreach ($tabcopie as $key=>$val)
			{
				$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("BLOCFIC.ficSrc", $key);
				$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("BLOCFIC.ficDest", $tabcopie[$key][0]);

				//Affichage du statut de la copie
				if ($tabcopie[$key][1]===true)
				{
					# copie == ok
					$GLOBALS["SYSTEM_TEMPLATE"]-> MxAttribut("BLOCFIC.class", "lnColor3");
					$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("BLOCFIC.statutfic", getMessage("SuccessCopy"));
				}
				else
				{
					# copie == pb...
					$GLOBALS["SYSTEM_TEMPLATE"]-> MxAttribut("BLOCFIC.class", "lnColor1");
					$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("BLOCFIC.statutfic", getMessage("ErrorCopy"));
				}
				$GLOBALS["SYSTEM_TEMPLATE"]-> MxBloc("BLOCFIC", "loop");
			}
			$GLOBALS["SYSTEM_TEMPLATE"]->MxAttribut("HIDDEN.urlAction", $url);
		}
		else
		{
			return "ErrorCopy";
		}

		//Création BD
		if (file_exists($sourcepath.$this->dbInstallFile.".". DATA_SOURCE_SQL_TYPE .".sql"))
		{
			$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("TABLEBD.BLOCBD.nomficDB",$this->dbInstallFile.".". DATA_SOURCE_SQL_TYPE .".sql" );
			
			//Execution du script de création de la bd
			if ($backup->restorebackUpDB($sourcepath,$this->dbInstallFile.".". DATA_SOURCE_SQL_TYPE .".sql"))
			{
				$GLOBALS["SYSTEM_TEMPLATE"]-> MxAttribut("TABLEBD.BLOCBD.class", "lnColor3");
				$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("TABLEBD.BLOCBD.statutDB", getMessage("SuccessBD"));	
			}
			else
			{
				$GLOBALS["SYSTEM_TEMPLATE"]-> MxAttribut("TABLEBD.BLOCBD.class", "lnColor1");
				$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("TABLEBD.BLOCBD.statutDB", getMessage("ErrorBD"));
				return "ErrorCreateDB";
			}
		} else {
			$GLOBALS["SYSTEM_TEMPLATE"]->MxBloc("TABLEBD", "delete");
		}
		return "";
	}

/**
* récapitulatif de l'installation
* @return booleen
*/
	function __afterInstall()
	{
		withBlocPath("InstallManager", "afterinstall");
		
		//Récupération des backup créés.
		//$prefixe=(!defined("DATA_ACCES_TABLE_PREFIX"))?"": DATA_ACCES_TABLE_PREFIX ;
		
		$sql="SELECT * FROM ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."backup WHERE libelle='".$this->pkgName."'";
		$GLOBALS["SYSTEM_DATABASE_CONN"]->sql_query($sql);
		
		while ($tabresult=$GLOBALS["SYSTEM_DATABASE_CONN"]->sql_fetchrow())
		{
			if (count($tabresult)>0)
			{	
				$GLOBALS["SYSTEM_TEMPLATE"]-> MxAttribut("BLOCBackup.class", "lnColor3");
				$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("BLOCBackup.NomBackup",$tabresult["libelle"]);
				$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("BLOCBackup.DateBackup",date("H:i:s",$tabresult["bkpdate"]));
			}
			$GLOBALS["SYSTEM_TEMPLATE"]-> MxBloc("BLOCBackup", "loop");
		}
		return "";
	}

	//
	// Procédures de désinstallation
	//
/**
* avant installation, liste les pré-requis...
* @return booleen
*/
	function __beforeUninstall($url)
	{
		$backup=new backup();
		$tabcp= array();
		$msg="";
		//$prefixe=(!defined("DATA_ACCES_TABLE_PREFIX"))?"": DATA_ACCES_TABLE_PREFIX ;
		
		withBlocPath("InstallManager", "beforeuninstall");
		
		//Récupération des droits
		$droit=$backup->checkConfigForPerms();

		// les droits ne sont pas suffisent compte apache et php
		if (!$droit) {
		    return "";
		}

		//Notification du desinstalleur par défaut
		$uninstalleur=get_Class($this);
		if ($uninstalleur=="installdriver")
		{
			$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("Uninstalleur",getMessage ("InstalleurDefaut"));
		}
		else
		{
			$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("Uninstalleur",getMessage("InstalleurSurchargé").$uninstalleur);
		}
		
		$sourcepath=$GLOBALS["CONF_DATA_PATH"]."data/upload/install/package/".$this->pkgName."/";
		$checkBd=0;
		//Vérification de l'existence d'un fichier BD pour la base de données courante
		if (file_exists($sourcepath."uninstall.".DATA_SOURCE_SQL_TYPE.".sql"))
		{
			$checkBd=1;
		}
		//Vérification de l'existence d'autre script de BD pour un autre type de BD
		else if ($tabficsource=$backup->getContentDir($sourcepath))
		{
			foreach($tabficsource as $key=>$val)
			{
				//Récupération du nom complet du fichier
				$posfic=strrpos($tabficsource[$key][0],"/")+1;
				$fic=substr($tabficsource[$key][0],$posfic);
				//Récupération de l'extension et le nom du fichier source pour vérifier l'existence d'une BD
				if (strlen($fic)>7)
				{
					$nom=substr($fic,0, strlen("uninstall"));
					$type=substr($fic, (strlen($fic)-3));
					
					if ($nom=="uninstall" && $type=="sql")
					{
						$checkBd=2;
					}
				}
			}
		}

		if ($checkBd==1)
		{
			//Affichage du fichier sql dans une div
			$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("ficBD",$sourcepath."uninstall.".DATA_SOURCE_SQL_TYPE.".sql");
			$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("typeBD", DATA_SOURCE_SQL_TYPE);
			//Lecture du fichier et affichage du contenu
			$fichier=new File($sourcepath."uninstall.".DATA_SOURCE_SQL_TYPE.".sql");
			$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("scriptBD",str_replace("\n", "<br/>", $fichier->readAll()));
			$fichier->close();
		}else if($checkBd==2){
			// L'installation à besoin d'une BD... mais n'a pas le type courant -> erreur
			$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("NoDatabase", getMessage("WrongTypeBd"));
		}
		else if ($checkBd==0){
			$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("NoDatabase", getMessage("NoBd"));
		}
		
		//Récupration du fichier .ini contenant les paths vers les fichiers à supprimer
		$iniPath=$GLOBALS["CONF_DATA_PATH"]."data/upload/install/package/".$this->pkgName."/".$this->fileToCopy;
		if (file_exists($iniPath))
		{
			$tabcp=$backup->parcoursInitoTab($iniPath, $sourcepath, $droit);
				
			if (count($tabcp)>0)
			{	
				//Parcours du fichier .ini et verification des droits de supression
				foreach($tabcp as $key=>$val)
				{
					//Test sur le type d'objet a supprimer
					if (strpos($tabcp[$key][0],"data/message/fr/object.ini")!==False){
						$GLOBALS["SYSTEM_TEMPLATE"]-> MxAttribut("BLOCFIC.class", "lnColor1");
						$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("BLOCFIC.ficSrc",$key);
						$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("BLOCFIC.versionSrc", $backup->getFileVersion($sourcepath.$key));
						$GLOBALS["SYSTEM_TEMPLATE"]-> MxBloc("BLOCFIC", "loop");
					}
					elseif ((strpos($tabcp[$key][0],"lib/package/")===False) && (strpos($tabcp[$key][0],"lib/system/")===False) && (strpos($tabcp[$key][0],"lib/object_business/")===False))
					{
						//Affichage des scripts relatif a l'objet selectionné
						//+ vérification qu'il existe un backup ou pas
						if ($tabperm=$backup->verifFilePermFromTab($tabcp,"rw"))
						{
							if ($tabcp[$key][1]=="File")
							{
								if($tabperm[$key][1]===True)
								{
									//Permission == ok
									$GLOBALS["SYSTEM_TEMPLATE"]-> MxAttribut("BLOCFIC.class", "lnColor3");
								}
								else
								{
									//permission == Not ok
									$GLOBALS["SYSTEM_TEMPLATE"]-> MxAttribut("BLOCFIC.class", "lnColor1");
								}
								
								$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("BLOCFIC.ficSrc",$key);
								$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("BLOCFIC.versionSrc", $backup->getFileVersion($sourcepath.$key));
								$sql="SELECT * FROM ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."backup WHERE backup_libelle='".$this->pkgName."'";
								$GLOBALS["SYSTEM_DATABASE_CONN"]->sql_query($sql);
								if ($GLOBALS["SYSTEM_DATABASE_CONN"]->sql_numrows()>0)
								{
									$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("BLOCFIC.backup", getMessage("ExistBackup"));
								}
								else
								{
									$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("BLOCFIC.backup", getMessage("NotExistBackup"));
								}
							}
						}
						$GLOBALS["SYSTEM_TEMPLATE"]-> MxBloc("BLOCFIC", "loop");			
					}
					
				}	
				if ( ($msg=="") && ($checkBd!=2))
				{
					$GLOBALS["SYSTEM_TEMPLATE"]->MxAttribut("HIDDEN.urlAction", $url);
					
				}else{
					$GLOBALS["SYSTEM_TEMPLATE"]->MxBloc("HIDDEN", "delete");
				}
			
				//Affichage de la liste des backups relatif a l'objet en cours de desinstallation
				$sql="SELECT id_backup FROM ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."backup WHERE backup_libelle='".$this->pkgName."'";
				$GLOBALS["SYSTEM_DATABASE_CONN"]->sql_query($sql);
				$tabresult=$GLOBALS["SYSTEM_DATABASE_CONN"]->sql_fetchrow();				
				if (count($tabresult)>0)
				{
					//Affichage backup de fichier
					$sql_file="SELECT * FROM ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."backupfile WHERE id_backup=".$tabresult["id_backup"]."";
					$GLOBALS["SYSTEM_DATABASE_CONN"]->sql_query($sql_file);
					while ($tabresultFILE=$GLOBALS["SYSTEM_DATABASE_CONN"]->sql_fetchrow())
					{
						if (count($tabresultFILE)>0)
						{	
							$GLOBALS["SYSTEM_TEMPLATE"]-> MxAttribut("BLOCFICBKP.class", "lnColor3");
							$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("BLOCFICBKP.fic",$tabresult["new_name"]);
						}
						$GLOBALS["SYSTEM_TEMPLATE"]-> MxBloc("BLOCFICBKP", "loop");
					}
					
					//Affichage backup de BD
					$sql_bd="SELECT * FROM ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."backupbd WHERE id_backup=".$tabresult["id_backup"]."";
					$GLOBALS["SYSTEM_DATABASE_CONN"]->sql_query($sql_bd);
					while ($tabresultBD=$GLOBALS["SYSTEM_DATABASE_CONN"]->sql_fetchrow())
					{
						if (count($tabresultBD)>0)
						{	
							$GLOBALS["SYSTEM_TEMPLATE"]-> MxAttribut("BLOCBDBKP.class", "lnColor3");
							$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("BLOCBDBKP.nombd",$tabresultBD["nom_bd"]);
						}
						$GLOBALS["SYSTEM_TEMPLATE"]-> MxBloc("BLOCBDBKP", "loop");
					}
				}
				
			}
		}
		else
		{
			//Le fichier.ini n'existe pas ou on a pas les droits nécessaire pour y acceder
			$msg=getMessage("PakcageNotValid");
		}
		return $msg;
	}

/**
* fait l'installation
* @return booleen
*/
	function __Uninstall($url)
	{
		//Récupération du contenu du fichier ini.
		includePackage ("backup.php");
		$backup 	= new backup();
		$tabsup		=array();
		$tabbkpfic	=array();

		withBlocPath("InstallManager", "uninstall");

		//$prefixe=(!defined("DATA_ACCES_TABLE_PREFIX"))?"": DATA_ACCES_TABLE_PREFIX ;
		$iniPath	=$GLOBALS["CONF_DATA_PATH"]."data/upload/install/package/".$this->pkgName."/".$this->fileToCopy;
		$sourcepath	=$GLOBALS["CONF_DATA_PATH"]."data/upload/install/package/".$this->pkgName."/";

		//Recupération des droit à passer aux fichiers
		$droit=$backup->checkConfigForPerms();

		// les droits ne sont pas suffisent compte apache et php
		if (!$droit) 
		{
			addError(2, "InstallDriver", "__uninstall", "Les droits système ne sont pas valides...");
			return "InvalidRight";
		}

		# Verification du tabini (droit source)
		$tabini=$backup->parcoursInitotab($iniPath, $sourcepath, $droit);

		# Verification des droits de fichier ()droit destination
		$tabRight=$backup->verifFilePermFromTab($tabini, $droit);
		if ( ($tabRight!==false) && (count($tabRight)>0) ){
			foreach($tabRight as $key=>$val){
				if($val[1]==false){
					addError(2, "InstallDriver", "__install", "Les droits système ne sont pas valides (destination)...");
					return "InvalidPackage";
				}
			}
		}else if ($tabRight===false){
			addError(2, "InstallDriver", "__install", "Les fichiers destinations ne sont pas valides");
			return "InvalidFileInstall";
		}

		# Suppression
		if (count($tabini)>0)
		{
			foreach ($tabini as $key=>$val)
			{
				//Affichage des fichiers
				$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("BLOCFIC.ficSrc", $key);
				$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("BLOCFIC.ficPath", $tabini[$key][0]);
			
				if ((strpos($tabini[$key][0],"lib/package/")===False) && (strpos($tabini[$key][0],"lib/system/")===False) && (strpos($tabini[$key][0],"lib/object_business/")===False) && (strpos($tabini[$key][0],"object.ini")===False))
				{
					if ($tabini[$key][1]===true)
					{
						//Récupération de tout les paths vers le rep de l'objet à désinstaller
						$pos=strrpos($tabini[$key][0],"/");
						$dir[$key]=substr($tabini[$key][0],0,$pos)."/";
						
						# suppression == ok
						if (file_exists($tabini[$key][0]))
						{
							if (unlink($tabini[$key][0]))
							{
								$GLOBALS["SYSTEM_TEMPLATE"]-> MxAttribut("BLOCFIC.class", "lnColor3");
								$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("BLOCFIC.statutfic", getMessage("SuccessDel"));
							}
							else
							{
								//Erreur lors de la suppression du fichier
								$GLOBALS["SYSTEM_TEMPLATE"]-> MxAttribut("BLOCFIC.class", "lnColor1");
								$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("BLOCFIC.statutfic", getMessage("ErrorDel"));
							}
						}
					}
					else
					{
						# suppression == pb...
						$GLOBALS["SYSTEM_TEMPLATE"]-> MxAttribut("BLOCFIC.class", "lnColor1");
						$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("BLOCFIC.statutfic", getMessage("ErrorDel"));
					}
					$GLOBALS["SYSTEM_TEMPLATE"]-> MxBloc("BLOCFIC", "loop");
				}
			}
		}
		$GLOBALS["SYSTEM_TEMPLATE"]->MxAttribut("HIDDEN.urlAction", $url);

		//Suppression du fichier de backup sql ainsi que l'entrée correspondante dans la base de données
		$sql="SELECT id_backup FROM ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."backup WHERE backup_libelle='".$this->pkgName."'";
		$GLOBALS["SYSTEM_DATABASE_CONN"]->sql_query($sql);
		$tabresult=$GLOBALS["SYSTEM_DATABASE_CONN"]->sql_fetchrow();

		if (count($tabresult)>0)
		{
			//Récupération des noms des différents fichiers backupsBD correspondant a l'objet en cours de désinstallation
			$sql_bkpbd="SELECT * FROM ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."backupbd WHERE id_backup=".$tabresult["id_backup"]."";
			$GLOBALS["SYSTEM_DATABASE_CONN"]->sql_query($sql_bkpbd);
			while ($tabresultbkpBD=$GLOBALS["SYSTEM_DATABASE_CONN"]->sql_fetchrow())
			{
				$pathbkpBD=$GLOBALS["CONF_DATA_PATH"]."data/backup/";
				if (file_exists($pathbkpBD.$tabresultbkpBD["nom_bd"]))
				{
					if (!unlink($pathbkpBD.$tabresultbkpBD["nom_bd"]))
					{
						return "ErrorDel";
					}
				}
			}
			
			//Récupération des noms des différents fichiers backups correspondant a l'objet en cours de désinstallation
			$sql_bkpfile="SELECT * FROM ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_PACKAGE_PREFIX."backupfile WHERE id_backup=".$tabresult["id_backup"]."";
			$GLOBALS["SYSTEM_DATABASE_CONN"]->sql_query($sql_bkpfile);
			while ($tabresultbkpFILE=$GLOBALS["SYSTEM_DATABASE_CONN"]->sql_fetchrow())
			{
				if (file_exists($tabresultbkpFILE["new_name"]))
				{
					if (!unlink($tabresultbkpFILE["new_name"]))
					{
						return "ErrorDel";
					}
				}
			}
			
			//Mise a jours des bases de données
			$sql_bkpBD="DELETE FROM ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_OBJECT_PREFIX."backupbd WHERE id_backup=".$tabresult["id_backup"]."";
			$sql_bkpfile="DELETE FROM ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_OBJECT_PREFIX."backupfile WHERE id_backup=".$tabresult["id_backup"]."";
			$sql_backup="DELETE FROM ".DATA_ACCES_TABLE_PREFIX.DATA_ACCES_OBJECT_PREFIX."backup WHERE backup_libelle='".$this->pkgName."'";
			$GLOBALS["SYSTEM_DATABASE_CONN"]->sql_query($sql_bkpBD);
			$GLOBALS["SYSTEM_DATABASE_CONN"]->sql_query($sql_bkpfile);
			$GLOBALS["SYSTEM_DATABASE_CONN"]->sql_query($sql_backup);
		}
		
		//Suppression du répertoire de l'objet si ce dernier est vide
		foreach ($dir as $key=>$val)
		{
			if (!strstr($val,"lib/package/") || !strstr($val,"lib/system/") || !strstr($val,"lib/object_business/"))
			{
				if (is_dir($val))
				{
					if (!$backup->EraseDir($val))
					{
						$msg="NotEmptyDir";
					}
				}
				clearstatcache();
			}
		}
		
		//Suppression de la base de données BD
		if (file_exists($sourcepath.$this->dbUninstallFile.".". DATA_SOURCE_SQL_TYPE .".sql"))
		{
			$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("BLOCBD.nomficDB",$this->dbUninstallFile.".". DATA_SOURCE_SQL_TYPE .".sql" );
			//Execution du script de création de la bd
			if ($backup->restorebackUpDB($sourcepath,$this->dbUninstallFile.".". DATA_SOURCE_SQL_TYPE .".sql"))
			{
				$GLOBALS["SYSTEM_TEMPLATE"]-> MxAttribut("BLOCBD.class", "lnColor3");
				$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("BLOCBD.statutDB", getMessage("SuccessEraseBD"));	
			}
			else
			{
				$GLOBALS["SYSTEM_TEMPLATE"]-> MxAttribut("BLOCBD.class", "lnColor1");
				$GLOBALS["SYSTEM_TEMPLATE"]-> MxText("BLOCBD.statutDB", getMessage("ErrorEraseBD"));
				return "ErrorCreateDB";
			}
		}
		deleteAllSystemCache();
		return "";
	}

/**
* récapitulatif de l'installation
* @return booleen
*/
	function __afterUninstall()
	{
		withBlocPath("InstallManager", "afteruninstall");
		return "";
	}

}
?>
