<?php
/*vim: set expandtab tabstop=4 shiftwidth=4: */
// +------------------------------------------------------------------------------------------------------+
// | PHP version 4.1                                                                                      |
// +------------------------------------------------------------------------------------------------------+
// | Copyright (C) 2004 Tela Botanica (accueil@tela-botanica.org)                                         |
// +------------------------------------------------------------------------------------------------------+
// | This library is free software; you can redistribute it and/or                                        |
// | modify it under the terms of the GNU General Public                                                  |
// | License as published by the Free Software Foundation; either                                         |
// | version 2.1 of the License, or (at your option) any later version.                                   |
// |                                                                                                      |
// | This library 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.  See the GNU                                    |
// | General Public License for more details.                                                             |
// |                                                                                                      |
// | You should have received a copy of the GNU General Public                                            |
// | License along with this library; if not, write to the Free Software                                  |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                            |
// +------------------------------------------------------------------------------------------------------+
// CVS : $Id: projet.class.php,v 1.12 2008-05-21 14:35:26 alexandre_tb Exp $
/**
* Application projet
*
* La classe projet
*
*@package projet
//Auteur original :
*@author        Alexandre Granier <alexandre@tela-botanica.org>
//Autres auteurs :
*@author        Aucun
*@copyright     Tela-Botanica 2000-2004
*@version       $Revision: 1.12 $
// +------------------------------------------------------------------------------------------------------+
*/


// +------------------------------------------------------------------------------------------------------+
// |                                            ENTETE du PROGRAMME                                       |
// +------------------------------------------------------------------------------------------------------+

include_once PROJET_CHEMIN_CLASSES.'document.class.php' ;
include_once PROJET_CHEMIN_CLASSES.'liste_discussion.class.php' ;
/* Permet la r�cup�ration d'un nouvel identifiant d'une table.*/
require_once PROJET_CHEMIN_BIBLIOTHEQUE_API.'sql/SQL_manipulation.fonct.php';
include_once 'Mail.php' ;

// +------------------------------------------------------------------------------------------------------+
// |                                            ENTETE du PROGRAMME                                       |
// +------------------------------------------------------------------------------------------------------+




/**
 * class projet
 *
 */
class projet
{

    /** Aggregations: */

    /**
     * Le tableau d'objet document associ�s au projet
     *
     */
    var $_documents_associes = array();

    var $_listes_associes = array();

    /** Compositions: */

    /*** Attributes: ***/

    /**
     * L'identifiant du projet.
     * @access private
     */
    var $_id_projet;

    /**
     * Le titre du projet, tel que dans la base de donn�e.
     * @access private
     */
    var $_titre;
    /**
     * La description du projet, tel que dans la base.
     * @access private
     */
    var $_description;
    /**
     * L'URL d'un site sur le projet. Facultatif.
     * @access private
     */
    var $_espace_internet;
    /**
     * Le nom du wikini associ� au projet, avec la syntaxe wikini. Vide par d�faut.
     * @access private
     */
    var $_nom_wikini;
    /**
     * Date de cr�ation du projet. A priori ne varie pas dans le temps.
     * @access private
     */
    var $_date_creation;
    /**
     * Le chemin relatif vers le r�pertoire contenant les wikinis.
     * @access private
     */
    var $_chemin_wikini;
    /**
     * Une connexion vers la base de donn�e.
     * @access private
     */
    var $_db;

    /**
     * Contient le nom du r�pertoire du projet tel que sur le disque.
     * @access private
     */
    var $_nom_repertoire;

    /**
     * Le chemin jusqu'au r�pertoire o� seront stock�s les fichiers.
     * @access private
     */
    var $_chemin_repertoire;

    /**
     * Vaut vrai si le projet est un projet racine et s'il est le seul.
     * @access private
     */
    var $_est_racine;
    /**
     * Le r�sum� du projet
     * @access private
     */
    var $_resume;
    /**
     * Contient le num�ro du type du projet
     * @access private
     */
    var $_type;

	/**
     * Indique si l'inscription au projet est moderes
     * @access private
     */
    var $_isModere;

	/**
     * Indique si le projet a des documents
     * @access private
     */
    var $_avoirDocument;
    
    /**
     * tableau contenant les themes associes au projet
     */
    var $_themes = array();
    /**
     *
     * PHP5
     * @return projet
     * @access public
     */
    function __construct( &$dbObject,  $id_projet = "")
    {
      $this->projet($dbObject,  $id_projet);

    } // end of member function __construct

    /**
     *
     *
     * @param DB dbObject Un objet PEAR:DB
     * @param int id_projet On passe un identifiant de projet au constructeur. Cela lui permet de faire une
     * premiere requete pour les infos de bases comme le titre, le description etc.
     * @return projet
     * @access public
     */
    function projet( &$dbObject,  $id_projet = "")
    {
        $this->_db = $dbObject ;
        if ($id_projet != "") {
            $requete = "select * from projet where p_id=".$this->_db->escapeSimple($id_projet)." " ;
            $resultat = $this->_db->query ($requete) ;
            if (DB::isError($resultat)) {
                die ("Echec de la requete<br />".$resultat->getMessage()."<br />".$resultat->getDebugInfo()) ;
            }
            $ligne = $resultat->fetchRow (DB_FETCHMODE_OBJECT) ;

            // Affectations dans les proprietes
            $this->_id_projet = $ligne->p_id ;
            $this->_titre = $ligne->p_titre ;
            $this->_description = $ligne->p_description ;
            $this->_espace_internet = $ligne->p_espace_internet ;
            $this->_date_creation = $ligne->p_date_creation ;
            $this->_nom_wikini = $ligne->p_wikini ;
            $this->_resume = $ligne->p_resume;
            $this->_type = $ligne->p_type ;
            // On recupere le nom du repertoire
            $this->_nom_repertoire = $ligne->p_nom_repertoire ;
            $this->_isModere = $ligne->p_modere;
			$this->_avoirDocument = $ligne->p_avoir_document;
            // on regarde si on a a faire au projet racine
            if (PROJET_UTILISE_HIERARCHIE) {
	            $requete = 'select  ph_id_projet_pere, ph_id_projet_fils from projet_hierarchie where ph_id_projet_fils='.$this->_db->escapeSimple($this->_id_projet) ;
	            $resultat = $this->_db->query ($requete) ;
	            if (DB::isError ($resultat)) {
	                return ("Echec de la requete : $requete<br />".$resultat->getMessage()) ;
	            }
	            if (!$resultat->numRows()) {
	                $this->_est_racine = true ;
	            } else {
	                $this->_est_racine = false ;
	            }
            }
            
            /** Recuperation des themes */
            $requete_theme = 'select pat_id_theme, pt_label_theme from projet_avoir_theme, projet_theme'.
            			 ' where pat_id_projet='.$this->_db->escapeSimple($this->_id_projet).' and pat_id_theme=pt_id_theme';
            $resultat_theme = $GLOBALS['projet_db']->query ($requete_theme);
            if (DB::isError($resultat_theme)) {
            	return ("Echec de la requete : $requete_theme<br />".$resultat_theme->getMessage()) ;
            }
            if ($resultat_theme->numRows() != 0) {
            	
            	while ($ligne_theme = $resultat_theme->fetchRow(DB_FETCHMODE_OBJECT)) {
            		$this->_themes[$ligne_theme->pat_id_theme] = $ligne_theme->pt_label_theme;	
            	}
            	
            }
        }
    } // end of member function projet

    /**
     *
     *
     * @param DB dbObject Un objet PEAR:DB
     * @param int id_projet On passe un identifiant de projet au constructeur.
     * @return bool
     * @access public
     */
    function projetExiste( &$dbObject,  $id_projet)
    {
        if ($id_projet != "") {
            $requete = "select * from projet where p_id=".$dbObject->escapeSimple($id_projet)." " ;
            $resultat = $dbObject->query ($requete) ;
            if (DB::isError($resultat)) {
                die ("Echec de la requete<br />".$resultat->getMessage()."<br />".$resultat->getDebugInfo()) ;
            }
            if ($resultat->numRows() != 0) {
                return true ;
            }
        }
    } // end of member function projet

    /**
     *
     *
     * @param int id_projet
     * @return string
     * @access public
     */
    function getTitre( $id_projet = "" )
    {
        return $this->_titre ;
    } // end of member function getTitre

    /**
     *
     *
     * @return string
     * @access public
     */
    function getResume( )
    {
        return $this->_resume ;
    } // end of member function getResume

    /**
     * Renvoie l'identifiant du projet courant.
     *
     * @return int
     * @access public
     */
    function getId( )
    {
        return $this->_id_projet ;
    } // end of member function getId

    /**
     *
     *
     * @return string
     * @access public
     */
    function getDescription( )
    {
        return $this->_description;
    } // end of member function getDescription

    /**
     *
     *
     * @return string
     * @access public
     */
    function getEspaceInternet( )
    {
        return $this->_espace_internet;
    } // end of member function getEspaceInternet

    /**
     * Charge dans l'objet projet, les listes de discussion
     * ['nom_liste']
     * ['domaine']
     * ['adresse']
     *
     * @return boolean  true en cas de succ�s
     * @access public
     */
    function getListesAssociees( )
    {
        // On rajoute un test pour eviter l'appel SQL si il a deja ete fait une fois
        if (count($this->_listes_associes) > 0) return ;
        $requete = "select pl_id_liste from projet_lien_liste where pl_id_projet=".$this->_db->escapeSimple($this->_id_projet) ;
        $resultat = $this->_db->query ($requete) ;
        if (DB::isError ($resultat)) {
            return ("Echec de la requete : $requete<br />".$resultat->getMessage()) ;
        }
        $retour = array() ;
        if ($resultat->numRows()) {
            $ligne = $resultat->fetchRow (DB_FETCHMODE_OBJECT) ;
            $this->_listes_associes[] = new liste_discussion($ligne->pl_id_liste, $this->_db) ;

        }
    } // end of member function getListesAssociees

    /**
     * Renvoie vrai si le projet a au moins une liste
     *
     * @return bool
     * @access public
     */
    function avoirListe( )
    {
        $this->getListesAssociees() ;
        if (count($this->_listes_associes)) {
            return true ;
        }
        return false ;
    }

    /**
     * Renvoie vrai si le projet a au moins un document, fichier ou repertoire
     *
     * Mis en place pour des raisons de performances avant la methode getListesDocuments etait utilisee
     * 
     * @return bool
     * @access public
     */
    function avoirDocument( )
    {
        return $this->_avoirDocument;
    }

    /**
     * Permet de fixer la colonne p_avoir_document a 1 
     *
     * Mis en place pour des raisons de performances avant la methode getListesDocuments etait utilisee
     * 
     * @param bool 
     * @return mixed true si la requete fonctionne
     * @access public
     */
    function setAvoirDocument($bool)
    {
        $val = 0 ;
        if ($bool) $val = 1;
        $requete = 'update projet set p_avoir_document='.$this->_db->escapeSimple($val).' where p_id='.$this->_db->escapeSimple($this->_id_projet);
        $resultat = $this->_db->query ($requete) ;
        if (DB::isError($resultat)) {
            echo ("Echec de la requete<br />".$resultat->getMessage()."<br />".$resultat->getDebugInfo()) ;
        }
        return true;
    }

    /**
     * Renvoie la liste des documents associes sous forme d'un tableau, avec les
     * informations afferentes. 0 => "nom (cliquable)"
     "Taille"
     "Date
     * de creation"          "Prorietaire"          "Visibilite"          "Action
     * (cliquable)"
     *
     * @param visibilite visibilite Si visibilite est prive, tous les fichiers sont renvoyes ainsi qu'une entree
     * pour indiquer la visibilite du document.
     * @return Array
     * @access public
     */
    function getListesDocuments( $chemin, $chemin_icones = "icones/", $id_repertoire = '', $date = '' )
    {
        // On realise une requete sur projet_documents avec une jointure sur l'annuaire
        // et sur gen_type_de_fichier pour envoyer un resultat complet.
        // On exclue les fichiers racines cad pd_pere is null
        $requete = "select pd_id from projet_documents where pd_ce_projet=".$this->_db->escapeSimple($this->_id_projet) ;
        if ($id_repertoire != '') $requete .= ' and pd_pere='.$this->_db->escapeSimple($id_repertoire);
        if ($id_repertoire != '' && $id_repertoire == 0) $requete .= ' and pd_pere=0';
        if ($date != '') $requete .= ' and pd_date_de_mise_a_jour > date_sub (NOW(), interval 1 week)';
        $requete .= ' order by pd_nom' ;
        $resultat = $this->_db->query ($requete) ;
        if (DB::isError($resultat)) {
            return ("Echec de la requete<br />".$resultat->getMessage()."<br />".$resultat->getDebugInfo()) ;
        }
        $tableau_document = array() ;
        // Un compteur
        $i = 0 ;
        while ($ligne = $resultat->fetchRow (DB_FETCHMODE_OBJECT)) {
            array_push ($tableau_document, new document ($ligne->pd_id, $i, $chemin, $chemin_icones)) ;
        }
        return $tableau_document ;
    }


    /**
     * Renvoie un tableau avec tous les repertoires d'un projet, imbrique. ['rep1'],
     * ['rep2'] => array (['rep21'], 	['rep22']), etc .
     *
     * @return Array
     * @access public
     */
    function getListeRepertoireHierarchisee( )
    {
        // On ne prend que les repertoires
        $requete = "select pd_id, pd_pere, pd_nom from projet_documents where pd_ce_projet=".$this->_db->escapeSimple($this->_id_projet).' and pd_ce_type=0 order by pd_nom' ;
        $resultat = $this->_db->query ($requete) ;
        if (DB::isError($resultat)) {
            return ("Echec de la requete<br />".$resultat->getMessage()."<br />".$resultat->getDebugInfo()) ;
        }
        $tableau_document = array() ;
		/*
        while ($ligne = $resultat->fetchRow (DB_FETCHMODE_OBJECT)) {
            array_push ($tableau_document, new document ($ligne->pd_id, $this->_db));
        }
        */
        $tableau = array();
        $tab = array();

        
        while ($ligne = $resultat->fetchRow (DB_FETCHMODE_OBJECT)) {
            array_push ($tableau, array ('id' => $ligne->pd_id, 
										'id_pere' => $ligne->pd_pere, 
										'fils' => array(),
										'label' => $ligne->pd_nom));

        }
        
        // la $tableau reste un tableau de valeur a plat
        
        
		$i = 0;
        foreach ($tableau as $noeud) {
        	// On teste si le noeud est racine si oui on l ajoute a l arbre sinon on ne l ajoute pas
        	if ($noeud['id_pere'] == 0) {
        		$tab[$i] = $noeud;
        		$this->construireArbre($tab[$i], $tableau) ;
        	}
        	$i++;
        }
        return $tab;
    } // end of member function getListeRepertoireHierarchisee

	function construireArbre(&$noeud, $tableau) {
    	$j = 0;
    	foreach ($tableau as $element) {
        	// pour chaque element on teste 
        	if ($element['id_pere'] == $noeud['id']) {
        		$noeud['fils'][$j]= $element ;	        		
        		$this->construireArbre($noeud['fils'][$j],$tableau);
        	}
        	$j++; 
        }	
    }

    /**
     * Renvoie un tableau comprenant tous les objets projet de la base.
     *
     * @return Array
     * @static
     * @access public
     */
    function getTousLesProjets(&$objetDB, $exclu = '')
    {
    	$sql = '';
        if (is_object($this) && isset ($this->_projet_exclu) && count($this->_projet_exclu)) {
        	$sql = 'where p_id not in (';
            foreach ($this->_projet_exclu as $valeur) {
            	$sql .= $objetDB->escapeSimple($valeur).',' ;
            }
            $sql[count($sql)-1] = ')';
        }
        $requete = 'select p_id from projet '.$sql.' order by p_titre' ;
        $resultat = $objetDB->query ($requete) ;
        if (DB::isError($resultat)) {
            echo ("Echec de la requete<br />".$resultat->getMessage()."<br />".$resultat->getDebugInfo()) ;
        }
        $tableau_resultat = array() ;
        while ($ligne = $resultat->fetchRow (DB_FETCHMODE_OBJECT)) {
            array_push ($tableau_resultat, new projet ($objetDB, $ligne->p_id)) ;
        }
        return $tableau_resultat ;
    } // end of member function getTousLesProjets

    /**
     * Renvoie un tableau comprenant les objets projet de la base du type $type.
     *
     * @return Array
     * @static
     * @access public
     */
    function getProjetDuType($type, &$objetDB)
    {
        $requete = "select p_id from projet where p_type= ".$objetDB->escapeSimple($type)." order by p_titre" ;
        $resultat = $objetDB->query ($requete) ;
        if (DB::isError($resultat)) {
            die ("Echec de la requete<br />".$resultat->getMessage()."<br />".$resultat->getDebugInfo()) ;
        }
        $tableau_resultat = array() ;
        while ($ligne = $resultat->fetchRow (DB_FETCHMODE_OBJECT)) {
            array_push ($tableau_resultat, new projet ($objetDB, $ligne->p_id)) ;
        }
        return $tableau_resultat ;
    } // end of member function getTousLesProjets

    /**
     * Renvoie un le projet racine.
     *
     * @return projet
     * @static
     * @access public
     */
    function getProjetRacine(&$objetDB)
    {
        $requete = "select p_id from projet where p_id not in (select ph_id_projet_fils from projet_hierarchie)" ;
        $resultat = $objetDB->query ($requete) ;
        if (DB::isError($resultat)) {
            die ("Echec de la requete<br />".$resultat->getMessage()."<br />".$resultat->getDebugInfo()) ;
        }
        if ($resultat->numRows() == 1) {
            $ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT) ;
            return new projet($objetDB, $ligne->p_id) ;
        }
        $tableau_resultat = array() ;
        while ($ligne = $resultat->fetchRow (DB_FETCHMODE_OBJECT)) {
            array_push ($tableau_resultat, new projet ($objetDB, $ligne->p_id)) ;
        }
        return $tableau_resultat ;
    } // end of member function getTousLesProjets

    /**
     * Desctructeur de la classe. Libere la memoire, ferme les connexions et fichiers.
     *
     * @return void
     * @access public
     */
    function __destruct( )
    {

    } // end of member function __destruct

    /**
     * Supprime le projet courrant. Il s'ensuit une suppression en cascade de tous les
     * elements lies.
     *
     * @return void
     * @access public
     */
    function supprimer( )
    {

    } // end of member function supprimer

    /**
     * Permet d'enregistrer une ligne dans la table concernee.
     *
     * @param Array tableau_de_valeur Le tableau de valeur a inserer dans la base avec pour cle les noms des elements
     * du formulaire.
     * @return int
     * @access public
     */
    function enregistrerSQL( $tableau_de_valeur )
    {
        $nom_repertoire = projet::genereNomRepertoire($tableau_de_valeur['projet_titre'], $this->_db) ;
        if (!$this->_creationRepertoire ($nom_repertoire)) {
            echo 'Impossible de cr&eacute;e un r&eacute;pertoire'.$nom_repertoire ;
            return false ;
        }
        // Traitement du type
        if (!PROJET_UTILISE_TYPE) {
            $tableau_de_valeur['projet_type'] = 0 ;
        }
        $id = SQL_obtenirNouveauId($this->_db, 'projet', 'p_id') ;
        $requete = 'insert into projet set p_id='.$this->_db->escapeSimple($id) ;
        if (!isset($tableau_de_valeur['projet_wikini'])) {
        	$tableau_de_valeur['projet_wikini']='';
        }
        $requete .= ', p_titre="'.$tableau_de_valeur['projet_titre'].'", p_description="'.$tableau_de_valeur['projet_description'].'"'.
                    ', p_espace_internet="'.$tableau_de_valeur['projet_espace_internet'].'", p_date_creation=NOW()'.
                    ', p_wikini="'.$tableau_de_valeur['projet_wikini'].'", p_nom_repertoire="'.$nom_repertoire.'", p_resume="'.$tableau_de_valeur['projet_resume'].
                    '", p_type="'.$tableau_de_valeur['projet_type'].'", p_modere="'.$tableau_de_valeur['projet_moderation'].'"' ;
        $resultat = $this->_db->query ($requete) ;

        if (DB::isError($resultat)) {
            return ("Echec de la requete<br />".$resultat->getMessage()."<br />".$resultat->getDebugInfo()) ;
        }

        // On affecte a l'objet projet son identifiant
        $this->_id_projet = $id ;

        //insertion dans projet_herarchie
		if (PROJET_UTILISE_HIERARCHIE) {
	        $requete = 'insert into projet_hierarchie set ph_id_projet_pere='.$this->_db->escapeSimple($tableau_de_valeur['projet_asso']).
	                    ', ph_id_projet_fils='.$id ;
	        $resultat = $this->_db->query ($requete) ;
		}
		
		/** enregistrement dans projet_avoir_theme */
		$requete_theme = '';
		foreach ($tableau_de_valeur['projet_theme'] as $cle => $valeur) {
			$requete_theme = 'insert into projet_avoir_theme set pat_id_projet='.$this->_db->escapeSimple($id).', pat_id_theme='.$this->_db->escapeSimple($cle);
			$resultat_theme = $GLOBALS['projet_db']->query($requete_theme);
			if (DB::isError($resultat_theme)) {
				return $resultat_theme->getMessage();
			}
		}
        return true ;
    }

    /**
     * Permet de mettre a jour une ligne dans la table concernee.
     *
     * @param Array tableau_de_valeur Le tableau de valeur a inserer dans la base avec pour cle les noms des elements
     * du formulaire.
     * @return int
     * @access public
     */
    function majSQL( $tableau_de_valeur )
    {
        // Traitement du type
        if (!PROJET_UTILISE_TYPE) {
            $tableau_de_valeur['projet_type'] = 0 ;
        }
        $requete = 'update projet set ';
        $requete .= 'p_titre="'.$tableau_de_valeur['projet_titre'].'", p_description="'.$tableau_de_valeur['projet_description'].'"'.
                    ', p_espace_internet="'.$tableau_de_valeur['projet_espace_internet'].'"'.
                    ', p_resume="'.$tableau_de_valeur['projet_resume'].'", p_type="'.$tableau_de_valeur['projet_type'].'"'.
                    ', p_modere='.$tableau_de_valeur['projet_moderation'].
                    ' where p_id="'.$this->_id_projet.'"' ;
        $resultat = $this->_db->query ($requete) ;
        if (DB::isError($resultat)) {
            return ("Echec de la requete<br />".$resultat->getMessage()."<br />".$resultat->getDebugInfo()) ;
        }

        if (PROJET_UTILISE_HIERARCHIE) {
	        // suppression dans projet_hierarchie

	        $requete = 'delete from projet_hierarchie where ph_id_projet_fils='.$this->_db->escapeSimple($this->_id_projet) ;
	        $resultat = $this->_db->query ($requete) ;

	        //insertion dans projet_hierarchie

	        $requete = 'insert into projet_hierarchie set ph_id_projet_pere='.$this->_db->escapeSimple($tableau_de_valeur['projet_asso']).
	                    ', ph_id_projet_fils='.$this->_id_projet ;
	        $resultat = $this->_db->query ($requete) ;
        }
        
        /** enregistrement dans projet_avoir_theme */
        
        $requete_suppression_theme = 'delete from projet_avoir_theme where pat_id_projet='.$this->_db->escapeSimple($this->_id_projet);
        $resultat_suppression_theme  = $GLOBALS['projet_db']->query($requete_suppression_theme);
        
		$requete_theme = '';
		foreach ($tableau_de_valeur['projet_theme'] as $cle => $valeur) {
			$requete_theme = 'insert into projet_avoir_theme set pat_id_projet='.$this->_db->escapeSimple($this->_id_projet).', pat_id_theme='.$this->_db->escapeSimple($cle);
			$resultat_theme = $GLOBALS['projet_db']->query($requete_theme);
			if (DB::isError($resultat_theme)) {
				return $resultat_theme->getMessage();
			}
		}
        return true ;
    } // end of member function enregistrerSQL

    /**
     * Met a jour dans la base de donnee le champs p_nom_wikini
     *
     * @param int nom_wikini Le nouveau nom wikini
     * @return bool
     * @access public
     */
    function majNomWikini( $nom_wikini )
    {
        $requete = 'update projet set p_wikini="'.$nom_wikini.'" where p_id="'.$this->_id_projet.'"' ;
        $resultat = $this->_db->query ($requete) ;
        if (DB::isError ($resultat)) {
            return ('Echec de la requete : '.$requete.'<br />'.$resultat->getMessage()) ;
        }
        return true ;
    } // end of member function majNomWikini


    /**
     *
     *
     * @param string code_sql
     * @return bool
     * @access public
     */
    function suppressionSQL()
    {
        $msg = '' ;
        // Supression du repertoire du projet
        if (!$this->_suppression_repertoire()) {
            $msg = 'La suppression du repertoire n\'a pas fonctionne' ;
        }
        // A ajouter la suppression des documents associes

        // La suppression des evenements associ�s

        // Le projet lui-meme
        $requete = "delete from projet where p_id=".$this->_db->escapeSimple($this->_id_projet) ;
        $resultat = $this->_db->query ($requete) ;

        if (PROJET_UTILISE_HIERARCHIE) {
	        $requete = "delete from projet_hierarchie where ph_id_projet_fils=".$this->_db->escapeSimple($this->_id_projet) ;
	        $resultat = $this->_db->query ($requete) ;
        }
        $requete = "delete from projet_statut_utilisateurs where psu_id_projet=".$this->_db->escapeSimple($this->_id_projet) ;
        $resultat = $this->_db->query ($requete) ;
        return $msg ;
    } // end of member function suppressionSQL

    /**
     * Supprime le repertoire associe au projet (le repertoire doit etre vide).
     *
     * @return void
     * @access private
     */
    function _suppression_repertoire( )
    {
        return rmdir ($this->_chemin_repertoire.$this->_nom_repertoire) ;
    } // end of member function _suppression_repertoire

    /**
     * Permet de creer le repertoire associe au projet.
     *
     * @param string nom_repertoire Le nom du r�pertoire � cr�er.
     * @return boolean
     * @access private
     */
    function _creationRepertoire( $nom_repertoire )
    {
        return mkdir ($this->_chemin_repertoire.$nom_repertoire) ;
    } // end of member function _creationRepertoire

    /**
     * Permet d'indiquer ou seront stockes les fichiers.
     *
     * @param string cheminRepertoire Le chemin jusqu'au repertoire ou seront stockes les fichiers.
     * @return void
     * @access public
     */
    function setCheminRepertoire( $cheminRepertoire )
    {
        $this->_chemin_repertoire = $cheminRepertoire ;
    } // end of member function setCheminRepertoire

    /**
     * Genere un nom de repertoire a partir de la premiere lettre de la chaine passe en
     * parametre et de l'identifiant du dernier projet.
     *
     * @param string chaine Une chaine a partir de laquelle sera generer le nom du repertoire.
     * @param DB objetDB un objet PEAR::DB
     * @return string
     * @static
     * @access public
     */
    function genereNomRepertoire( $chaine, &$objetDB )
    {
        $requete = "select p_id from projet order by p_id desc limit 0,1" ;
        $resultat = $objetDB->query ($requete) ;
        if (DB::isError ($resultat)) {
            return ("Echec de la requete : $requete<br />".$resultat->getMessage()) ;
        }
        if ($resultat->numRows() > 0) {
	        $ligne = $resultat->fetchRow (DB_FETCHMODE_OBJECT) ;
	        $nom = strtoupper(substr($chaine, 0, 1)) ;
	        $nom .= $ligne->p_id + 1 ;
        }
	    else {
	    	$nom = strtoupper(substr($chaine, 0, 1)) ;
	        $nom .=  1 ;
	    }
        return $nom ;

    } // end of member function genereNomRepertoire

    /**
     * Permet de recuperer le nom du repertoire d'un projet.
     *
     * @return string
     * @access public
     */
    function getNomRepertoire( )
    {
        return $this->_nom_repertoire ;
    } // end of member function getNomRepertoire

    /**
     *  Ajoute une liste a un projet
     *  Effectue une insertion dans projet_lien_liste
     *
     * @param liste_discussion liste Une instance de la classe liste_discussion
     * @return void
     * @access public
     */
    function ajouterListe( &$liste )
    {
        $requete = "insert into projet_lien_liste set pl_id_liste=".$this->_db->escapeSimple($liste->getId()).
                    ', pl_id_projet='.$this->_db->escapeSimple($this->_id_projet) ;
        $resultat = $this->_db->query ($requete) ;
        if (DB::isError ($resultat)) {
            return ("Echec de la requete : $requete<br />".$resultat->getMessage()) ;
        }
    }

    /**
     * Supprime la liste de discussion associee au projet
     *
     * @return void
     * @access public
     */
    function supprimerListe(&$liste)
    {
        $requete = 'delete from projet_lien_liste where pl_id_liste='.$this->_db->escapeSimple($liste->getId()) ;
        $resultat = $this->_db->query ($requete) ;
        if (DB::isError ($resultat)) {
            return ('Echec de la requete : '.$requete.'<br />'.$resultat->getMessage()) ;
        }
        $requete = 'delete from projet_liste where pl_id_liste='.$this->_db->escapeSimple($liste->getId()) ;
        $resultat = $this->_db->query ($requete) ;
        if (DB::isError ($resultat)) {
            return ('Echec de la requete : '.$requete.'<br />'.$resultat->getMessage()) ;
        }
    }


    /**
     * Renvoie vrai si le projet est racine.
     *
     * @return bool
     * @access public
     */
    function isRacine( )
    {
        return $this->_est_racine ;
    } // end of member function isRacine

    /**
     * Renvoie le nombre d'inscrits au projet. Effectue une requete dans la table
     * projet_statut_utilisateurs
     *
     * @return int
     * @access public
     */
    function getNombreInscrits( )
    {
        $requete = 'select count(psu_id_utilisateur) as nbre from projet_statut_utilisateurs where psu_id_projet='.$this->_db->escapeSimple($this->_id_projet) ;
        $resultat = $this->_db->query ($requete) ;
        if (DB::isError ($resultat)) {
            die ('Echec de la requete : '.$requete.'<br />'.$resultat->getMessage()) ;
        }
        $ligne = $resultat->fetchRow (DB_FETCHMODE_OBJECT) ;
        return $ligne->nbre ;
    } // end of member function getNombreInscrits


    /**
     * Renvoie un tableau contenant les identifiants des fils du projet courant.
     *
     * @return Array
     * @access public
     */
    function getHierarchie( )
    {
        $requete = 'select ph_id_projet_fils from projet_hierarchie where ph_id_projet_pere='.$this->_db->escapeSimple($this->_id_projet) ;
        $resultat = $this->_db->query ($requete) ;
        if (DB::isError ($resultat)) {
            die ('Echec de la requete : '.$requete.'<br />'.$resultat->getMessage()) ;
        }
        $tableau_resultat = array() ;
        while ($ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT)) {
            array_push ($tableau_resultat, $ligne->ph_id_projet_fils) ;
        }
        return $tableau_resultat ;
    } // end of member function getHierarchie

    /**
     * Renvoie l'identifiant du pere du projet courrant.
     *
     * @return int
     * @access public
     */
    function getIdPere()
    {
        $requete = 'select ph_id_projet_pere from projet_hierarchie where ph_id_projet_fils='.$this->_db->escapeSimple($this->_id_projet) ;
        $resultat = $this->_db->query ($requete) ;
        if (DB::isError ($resultat)) {
            die ('Echec de la requete : '.$requete.'<br />'.$resultat->getMessage()) ;
        }
        $tableau_resultat = array() ;
        $ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT) ;
        return $ligne->ph_id_projet_pere ;
    } // end of member function getIdPere()

    /**
     * Renvoie le nom Wiki du wikini associe au projet.
     *
     * @return string
     * @access public
     */
    function getWikini( )
    {
        return $this->_nom_wikini ;
    } // end of member function getWikini

    /**
     * Renvoie le type du projet, ou zero si le projet n'a pas de type.
     *
     * @return int
     * @access public
     */
    function getType( )
    {
        return $this->_type ;
    } // end of member function getType

    /**
     * Renvoie les themes du projet, ou zero si le projet n'a pas de type.
     *
     * @return int
     * @access public
     */
    function getThemes( )
    {
        return $this->_themes ;
    } // end of member function getType

	/**
     * Renvoie 1 si les inscriptions au projet sont moderees.
     *
     * @return int
     * @access public
     */
    function isModere( )
    {
        return $this->_isModere ;
    } // end of member function getType



    /**
     * initAttributes sets all projet attributes to its default value make
     * sure to call this method within your class constructor
     */
    function initAttributes( )
    {
        $this->chemin_wikini = "projet/wikini/";
    }


} // end of projet
?>