<?php
/**
 * Ce fichier permet de declarer la classe dbForm.
 *
 * @package openmairie
 * @link http://www.openmairie.org/
 * @version SVN : $Id$
 */

/**
 *
 */
(defined("PATH_OPENMAIRIE") ? "" : define("PATH_OPENMAIRIE", ""));
require_once PATH_OPENMAIRIE."om_debug.inc.php";
(defined("DEBUG") ? "" : define("DEBUG", PRODUCTION_MODE));
require_once PATH_OPENMAIRIE."om_logger.class.php";
require_once PATH_OPENMAIRIE."om_message.class.php";

/**
 *
 */
require_once PATH_OPENMAIRIE."formulairedyn.class.php";

/**
 * Si la constante DB_PREFIXE n'est pas initialisee, on l'initialise pour
 * permettre la compatibilite avec les version anterieures
 */
(defined("DB_PREFIXE") ? "" : define("DB_PREFIXE", ""));
(defined("FORMATDATE") ? "" : define("FORMATDATE", "AAAA-MM-JJ"));

/**
 * Cette classe permet de gerer une interface entre un objet metier et sa
 * representation dans la base de donnees.
 *
 * @abstract
 */
class dbForm {

    /**
     *
     * @var array Informations DB nom de chaque champ
     */
    var $champs = array();

    /**
     *
     * @var array Informations DB type de chaque champ
     */
    var $type = array();

    /**
     *
     * @var array Informations DB taille de chaque champ
     */
    var $longueurMax = array();

    /**
     *
     * @var array ??? Informations DB flag de chaque champ
     */
    var $flags = array();

    /**
     *
     * @var array Valeur des champs requete selection
     */
    var $val = array();

    /**
     *
     * @var array Valeur des champs retournes pour saisie et maj
     */
    var $valF = array();

    /**
     *
     * @var string Message retourne au formulaire de saisie
     */
    var $msg = "";

    /**
     *
     * @var boolean Flag pour validation des donnees
     */
    var $correct;

    /**
     * @deprecated
     */
    var $selectioncol = "";

    /**
     * @deprecated
     */
    var $recherche = "";

    /**
     *
     * @var object Objet formulaire
     */
    var $form = NULL;

    /**
     *
     * @var object Objet de connexion DB
     */
    var $db = NULL;

    /**
     *
     * @var array Valeurs de tous les parametres
     */
    var $parameters = array();

    //Permet de proposer le bouton d'archivage sur les tableau
    var $archivable = FALSE;
    /**
     * Constructeur
     *
     * @param string $id
     * @param object $db Objet de connexion DB
     * @param boolean $DEBUG Mode debug (@deprecated)
     */
    function constructeur($id, &$db, $DEBUG = false) {
        // Affectation de l'identifiant de base de donnees dans l'attribut db
        // de l'objet
        $this->db = $db;
        // Inclusion du fichier de parametre de la table pour recuperer les
        // trois parametres permettant de construire la requete de selection
        // $champs - clause select
        // $tableSelect - clause from
        // $selection - clause where
        $fichier = "../sql/".$this->db->phptype."/".$this->table.".form.inc.php";
        if (file_exists($fichier)) {
            include $fichier;
        } else {
            $fichier = "../sql/".$this->db->phptype."/".$this->table.".form.inc";
            if (file_exists($fichier)) {
                include $fichier;
            }
        }
        //Si le flag $archivable est posé
        if(isset($archivable) and $archivable){
            $this->archivable=TRUE;
        } else {
            $this->archivable=FALSE;
        }
        // Concatenation des champs pour constitution de la clause select
        $listeChamp = "";
        foreach ($champs as $elem) {
            $listeChamp .= $elem.",";
        }
        // Suppresion de la derniere virgule
        $listeChamp = substr($listeChamp, 0, strlen($listeChamp)-1);
        // Initialisation de la variable selection
        if (!isset($selection)) {
            $selection = "";
        }
        // Concatenation de la requete de selection
        $sql = " select ".$listeChamp." from ".$tableSelect." ";
        // Si mode ajout
        if ($id == "]") {
            // Remplacement du 'and' par 'where' dans la varibale $selection
            $selection = ltrim($selection);
            if (strtolower(substr($selection, 0, 3)) == "and") {
                $selection = " where ".substr($selection, 4, strlen($selection));
            }
        } else { // Si mode modification ou suppression
            // Clause where en fonction du type de la cle primaire
            if ($this->typeCle == "A") {
                $sql .= " where ".$this->clePrimaire." like '".$id."' ";
            } else {
                $sql .= " where ".$this->table.".".$this->clePrimaire." = ".$id." ";
            }
        }
        $sql .= " ".$selection." ";
        // Execution de la requete
        $res = $db->limitquery($sql, 0, 1);
        // Logger
        $this->addToLog("constructeur(): db->limitquery(\"".str_replace(",",", ",$sql)."\", 0, 1);", VERBOSE_MODE);
        // Si une erreur survient
        if (database::isError($res)) {
            // Appel de la methode de recuperation des erreurs
            $this->erreur_db($res->getDebugInfo(), $res->getMessage(), $tableSelect);
        } else {
            // Recuperation des informations sur la structure de la table
            // ??? compatibilite POSTGRESQL (len = -1, type vide, flags vide)
            $info = $res->tableInfo();
            // Initialisation de la cle a 0
            $i = 0;
            // Recuperation du nom de chaque champ dans l'attribut 'champs'
            foreach ($info as $elem) {
                $this->champs[$i++] = $elem['name'];
            }
            // ??? Le $i devrait �tre initialises a 0 pour chaque attribut suivant
            // Recuperation de la taille de chaque champ dans l'attibut 'longueurMax'
            foreach ($info as $elem) {
                $this->longueurMax[$i++] = $elem['len'];
            }
            // Recuperation du type de chaque champ dans l'attribut 'type'
            // ??? Non utilise
            foreach ($info as $elem) {
                $this->type[$i++] = $elem['type'];
            }
            // Recuperation du flag de chaque champ dans l'attribut 'flags'
            // ??? Non utilise
            foreach ($info as $elem) {
                $this->flags[$i++] = $elem['flags'];
            }
            // Recuperation de l'enregistrement resultat de la requete
            while ($row =& $res->fetchRow()) {
                // Initialisation de la cle a 0
                $i = 0;
                // Recuperation de la valeur de chaque champ dans l'attribut 'val'
                foreach ($row as $elem) {
                    $this->val[$i++] = $elem;
                }
            }
        }
    }

    /**
     * Cette methode permet d'executer l'ajout (MODE 'insert') de l'objet dans
     * la base de donnees.
     *
     * @param array $val
     * @param object $db Objet de connexion DB
     * @param boolean $DEBUG Mode debug (@deprecated)
     */
    function ajouter($val, &$db = NULL, $DEBUG = false) {
        // Logger
        $this->addToLog("ajouter() - begin", EXTRA_VERBOSE_MODE);
        // Appel au mutateur specifique au MODE 'insert' de l'attribut valF de
        // l'objet
        $this->setValFAjout($val);
        // Appel au mutateur de l'attribut valF de l'objet
        $this->setValF($val);
        // Verification de la validite des donnees
        $this->verifier($val, $db, $DEBUG);
        // Verification specifique au MODE 'insert' de la validite des donnees
        $this->verifierAjout($val, $db);
        // Verification du verrou
        $this->testverrou();
        // Si les verifications precedentes sont correctes, on procede a
        // l'ajout, sinon on ne fait rien et on affiche un message d'echec
        if ($this->correct) {
            // Appel au mutateur pour le calcul de la cle primaire (si la cle
            // est automatique) specifique au MODE 'insert'
            $this->setId($db);
            // Execution du trigger 'before' specifique au MODE 'insert'
            // Le premier parametre est vide car en MODE 'insert'
            // l'enregistrement n'existe pas encore donc il n'a pas
            // d'identifiant
            $this->triggerajouter("", $db, $val, $DEBUG);
            // Execution de la requ�te d'insertion des donnees de l'attribut
            // valF de l'objet dans l'attribut table de l'objet
            $res = $db->autoExecute(DB_PREFIXE.$this->table, $this->valF, DB_AUTOQUERY_INSERT);
            // Si une erreur survient
            if (database::isError($res)) {
                // Appel de la methode de recuperation des erreurs
                $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
            } else {
                // Log
                $this->addToLog(_("Requete executee"), VERBOSE_MODE);
                // Log
                $message = _("Enregistrement")."&nbsp;".$this->valF[$this->clePrimaire]."&nbsp;";
                $message .= _("de la table")."&nbsp;\"".$this->table."\"&nbsp;";
                $message .= "[&nbsp;".$db->affectedRows()."&nbsp;";
                $message .= _("enregistrement(s) ajoute(s)")."&nbsp;]";
                $this->addToLog($message, VERBOSE_MODE);
                // Message de validation
                $this->addToMessage(_("Vos modifications ont bien ete enregistrees.")."<br/>");
                // Mise en place du verrou pour ne pas valider plusieurs fois
                // le m�me formulaire
                $this->verrouille();
            }
            // Execution du trigger 'after' specifique au MODE 'insert'
            // Le premier parametre est vide car en MODE 'insert'
            // l'enregistrement n'existe pas encore donc il n'a pas
            // d'identifiant
            $this->triggerajouterapres("", $db, $val, $DEBUG);
        } else {
            // Message d'echec (saut d'une ligne supplementaire avant le
            // message pour qu'il soit mis en evidence)
            $this->addToMessage("<br/>"._("SAISIE NON ENREGISTREE")."<br/>");
        }
        // Logger
        $this->addToLog("ajouter() - end", EXTRA_VERBOSE_MODE);
    }

    /**
     *
     * @param array $val
     */
    function setValFAjout($val = array()) {

        // initialisation valF pour la cle primaire (si pas de cle automatique)
        // [value primary key to database - not automatic primary key]
           $this->valF[$this->clePrimaire] = $val[$this->clePrimaire];

    }

    /**
     *
     * @param object $db Objet de connexion DB
     */
    function setId(&$db = NULL) {

        // initialisation valF pour la cle primaire (si  cle automatique)
        // [value primary key to database - automatic primary key]
        // id automatique method nextid
        // automatic id with dbpear method nextid

    }

    /**
     *
     * @param array $val
     * @param object $db Objet de connexion DB
     */
    function verifierAjout($val = array(), &$db = NULL) {

        // Verifier [verify]
        // la cle primaire est obligatoire
        // [primary key is compulsory]
        if ($this->valF[$this->clePrimaire] == "") {
            //
            $this->correct = false;
            //
            $this->msg .= "<br/>";
            $this->msg .= _("L'\"identifiant\" est obligatoire")."&nbsp;";
            $this->msg .= "[&nbsp;"._($this->clePrimaire)."&nbsp;]";
        }

    }

    /**
     * Cette methode permet d'executer la modification (MODE 'update') de
     * l'objet dans la base de donnees.
     *
     * @param array $val
     * @param object $db Objet de connexion DB
     * @param boolean $DEBUG Mode debug (@deprecated)
     */
    function modifier($val = array(), &$db = NULL, $DEBUG = false) {
        // Logger
        $this->addToLog("modifier() - begin", EXTRA_VERBOSE_MODE);
        // Recuperation de la valeur de la cle primaire de l'objet
        $id = $val[$this->clePrimaire];
        // Appel au mutateur de l'attribut valF de l'objet
        $this->setValF($val);
        // Verification de la validite des donnees
        $this->verifier($val, $db, $DEBUG);
        // Verification du verrou
        $this->testverrou();
        // Si les verifications precedentes sont correctes, on procede a
        // la modification, sinon on ne fait rien et on affiche un message
        // d'echec
        if ($this->correct) {
            // Execution du trigger 'before' specifique au MODE 'update'
            $this->triggermodifier($id, $db, $val, $DEBUG);
            // Execution de la requête de modification des donnees de l'attribut
            // valF de l'objet dans l'attribut table de l'objet
            $res = $db->autoExecute(DB_PREFIXE.$this->table, $this->valF, DB_AUTOQUERY_UPDATE, $this->getCle($id));
            // Si une erreur survient
            if (database::isError($res)) {
                // Appel de la methode de recuperation des erreurs
                $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
            } else {
                // Log
                $this->addToLog(_("Requete executee"), VERBOSE_MODE);
                // Log
                $message = _("Enregistrement")."&nbsp;".$id."&nbsp;";
                $message .= _("de la table")."&nbsp;\"".$this->table."\"&nbsp;";
                $message .= "[&nbsp;".$db->affectedRows()."&nbsp;";
                $message .= _("enregistrement(s) mis a jour")."&nbsp;]";
                $this->addToLog($message, VERBOSE_MODE);
                // Message de validation
                if ($db->affectedRows() == 0) {
                    $this->addToMessage(_("Attention vous n'avez fait aucune modification.")."<br/>");
                } else {
                    $this->addToMessage(_("Vos modifications ont bien ete enregistrees.")."<br/>");
                }
                // Mise en place du verrou pour ne pas valider plusieurs fois
                // le m�me formulaire
                $this->verrouille();
            }
            // Execution du trigger 'after' specifique au MODE 'update'
            $this->triggermodifierapres($id, $db, $val, $DEBUG);
        } else {
            // Message d'echec (saut d'une ligne supplementaire avant le
            // message pour qu'il soit mis en evidence)
            $this->addToMessage("<br/>"._("SAISIE NON ENREGISTREE")."<br/>");
        }
        // Logger
        $this->addToLog("modifier() - end", EXTRA_VERBOSE_MODE);
    }

    /**
     * Cette methode permet d'executer la suppression (MODE 'delete') de
     * l'objet dans la base de donnees.
     *
     * @param array $val
     * @param object $db Objet de connexion DB
     * @param boolean $DEBUG Mode debug (@deprecated)
     */
    function supprimer($val = array(), &$db = NULL, $DEBUG = false) {
        // Logger
        $this->addToLog("supprimer() - begin", EXTRA_VERBOSE_MODE);
        // Recuperation de la valeur de la cle primaire de l'objet
        $id = $val[$this->clePrimaire];
        // Verification des contraintes d'integrite specifique au MODE 'delete'
        $this->correct=true;
        $this->cleSecondaire($id, $db, $val, $DEBUG);
        // Verification du verrou
        $this->testverrou();
        // Si les verifications precedentes sont correctes, on procede a
        // la suppression, sinon on ne fait rien et on affiche un message
        // d'echec
        if ($this->correct) {
            // Execution du trigger 'before' specifique au MODE 'delete'
            $this->triggersupprimer($id, $db, $val, $DEBUG);
            // Construction de la requ�te de suppression de l'objet dans
            // l'attribut table de l'objet
            $sql = "delete from ".DB_PREFIXE.$this->table." where ".$this->getCle($id);
            // Execution de la requ�te de suppression de l'objet
            $res = $db->query($sql);
            // Logger
            $this->addToLog("supprimer(): db->query(\"".$sql."\");", VERBOSE_MODE);
            // Si une erreur survient
            if (database::isError($res)) {
                // Appel de la methode de recuperation des erreurs
                $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
            } else {
                // Log
                $message = _("Enregistrement")."&nbsp;".$id."&nbsp;";
                $message .= _("de la table")."&nbsp;\"".$this->table."\"&nbsp;";
                $message .= "[&nbsp;".$db->affectedRows()."&nbsp;";
                $message .= _("enregistrement(s) supprime(s)")."&nbsp;]";
                $this->addToLog($message, VERBOSE_MODE);
                // Message de validation
                $this->addToMessage(_("La suppression a ete correctement effectuee.")."<br/>");
                // Mise en place du verrou pour ne pas valider plusieurs fois
                // le m�me formulaire
                $this->verrouille();
            }
            // Execution du trigger 'after' specifique au MODE 'delete'
            $this->triggersupprimerapres($id, $db, $val, $DEBUG);
        } else {
            // Message d'echec (saut d'une ligne supplementaire avant le
            // message pour qu'il soit mis en evidence)
            $this->addToMessage("<br/>"._("SUPPRESSION NON EFFECTUEE")."<br/>");
        }
        // Logger
        $this->addToLog("supprimer() - end", EXTRA_VERBOSE_MODE);
    }
    
    /**
     * Cette methode permet d'executer l'archivage de
     * l'objet dans la base de donnees.
     *
     * @param array $val
     * @param object $db Objet de connexion DB
     * @param boolean $DEBUG Mode debug (@deprecated)
     */
    function archiver($val = array(), &$db = NULL, $DEBUG = false) {
        // Logger
        $this->addToLog("archiver() - begin", EXTRA_VERBOSE_MODE);
        // Recuperation de la valeur de la cle primaire de l'objet
        $id = $val[$this->clePrimaire];
        $this->correct=true;
        // Verification du verrou
        $this->testverrou();
        // Si les verifications precedentes sont correctes, on procede a
        // la suppression, sinon on ne fait rien et on affiche un message
        // d'echec
        if ($this->correct) {
            // Execution du trigger 'before' specifique au MODE 'delete'
            $this->triggerarchiver($id, $db, $val, $DEBUG);
            // Construction de la requête de suppression de l'objet dans
            // l'attribut table de l'objet
            $sql = "UPDATE ".DB_PREFIXE.$this->table." SET actif=FALSE WHERE ".$this->getCle($id);
            // Execution de la requête de suppression de l'objet
            $res = $db->query($sql);
            // Logger
            $this->addToLog("archiver(): db->query(\"".$sql."\");", VERBOSE_MODE);
            // Si une erreur survient
            if (database::isError($res)) {
                // Appel de la methode de recuperation des erreurs
                $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
            } else {
                // Log
                $message = _("Enregistrement")."&nbsp;".$id."&nbsp;";
                $message .= _("de la table")."&nbsp;\"".$this->table."\"&nbsp;";
                $message .= "[&nbsp;".$db->affectedRows()."&nbsp;";
                $message .= $this->table._("archive")."&nbsp;]";
                $this->addToLog($message, VERBOSE_MODE);
                // Message de validation
                $this->addToMessage(_("L'archivage a ete correctement effectuee.")."<br/>");
                // Mise en place du verrou pour ne pas valider plusieurs fois
                $this->verrouille();
            }
            // Execution du trigger 'after' specifique au MODE 'delete'
            $this->triggerarchiverapres($id, $db, $val, $DEBUG);
        } else {
            // Message d'echec (saut d'une ligne supplementaire avant le
            // message pour qu'il soit mis en evidence)
            $this->addToMessage("<br/>"._("Archivage NON EFFECTUEE")."<br/>");
        }
        // Logger
        $this->addToLog("archiver() - end", EXTRA_VERBOSE_MODE);
    }
    
    /**
     *
     * @param array $val
     * @param object $db Objet de connexion DB
     * @param boolean $DEBUG Mode debug (@deprecated)
     */
    function verifier($val = array(), &$db = NULL, $DEBUG = false) {

        // Verification de saisie
        $this->correct = true;

    }

    /**
     * Cette methode est appelee lors de la suppression d'un objet, elle permet
     * d'effectuer des tests pour verifier si l'objet supprime n'est pas cle
     * secondaire dans une autre table pour en empecher la suppression.
     *
     * @param string $id Identifiant (cle primaire) de l'objet dans la base
     * @param object $db Objet Base de donnees
     * @param array $val Tableau associatif representant les valeurs du
     *                   formulaire
     * @param integer $DEBUG Mode debug :
     *                       - 0 => Pas de Mode debug
     *                       - 1 => Mode debug
     *
     * @return void
     */
    function cleSecondaire($id, &$db = NULL, $val = array(), $DEBUG = false) {
        // Initialisation de l'attribut correct a true
        $this->correct = true;
    }

    /**
     *
     * @param array $val
     */
    function setvalF($val = array()) {

        // recuperation automatique [automatic recovery]
        foreach(array_keys($val) as $elem){
             $this->valF[$elem] =$val[$elem];
        }

    }

    /**
     *
     * @param string $id
     * @param object $db Objet de connexion DB
     * @param array $val
     * @param boolean $DEBUG Mode debug (@deprecated)
     */
    function triggerajouter($id, &$db = NULL, $val = array(), $DEBUG = false) {
        //
    }

    /**
     *
     * @param string $id
     * @param object $db Objet de connexion DB
     * @param array $val
     * @param boolean $DEBUG Mode debug (@deprecated)
     */
    function triggermodifier($id, &$db = NULL, $val = array(), $DEBUG = false) {
        //
    }

    /**
     *
     * @param string $id
     * @param object $db Objet de connexion DB
     * @param array $val
     * @param boolean $DEBUG Mode debug (@deprecated)
     */
    function triggersupprimer($id, &$db = NULL, $val = array(), $DEBUG = false) {
        //
    }
        /**
     *
     * @param string $id
     * @param object $db Objet de connexion DB
     * @param array $val
     * @param boolean $DEBUG Mode debug (@deprecated)
     */
    function triggerarchiver($id, &$db = NULL, $val = array(), $DEBUG = false) {
        //
    }

    /**
     *
     * @param string $id
     * @param object $db Objet de connexion DB
     * @param array $val
     * @param boolean $DEBUG Mode debug (@deprecated)
     */
    function triggerajouterapres($id, &$db = NULL, $val = array(), $DEBUG = false) {
        //
    }

    /**
     *
     * @param string $id
     * @param object $db Objet de connexion DB
     * @param array $val
     * @param boolean $DEBUG Mode debug (@deprecated)
     */
    function triggermodifierapres($id, &$db = NULL, $val = array(), $DEBUG = false) {
        //
    }

    /**
     *
     * @param string $id
     * @param object $db Objet de connexion DB
     * @param array $val
     * @param boolean $DEBUG Mode debug (@deprecated)
     */
    function triggersupprimerapres($id, &$db = NULL, $val = array(), $DEBUG = false) {
        //
    }
    
    /**
     *
     * @param string $id
     * @param object $db Objet de connexion DB
     * @param array $val
     * @param boolean $DEBUG Mode debug (@deprecated)
     */
    function triggerarchiverapres($id, &$db = NULL, $val = array(), $DEBUG = false) {
        //
    }

    // {{{ Gestion des parametres

    /**
     *
     */
    function setParameters($parameters = array()) {
        //
        $this->parameters = array_merge($this->parameters, $parameters);
    }

    /**
     *
     */
    function setParameter($parameter = "", $value = "") {
        //
        $this->parameters[$parameter] = $value;
    }

    /**
     *
     */
    function getParameter($parameter = "") {
        //
        if (isset($this->parameters[$parameter])) {
            return $this->parameters[$parameter];
        } else {
            return NULL;
        }
    }

    // }}}

    /**
     * Methode permettant aux objets metiers de surcharger facilement
     * la methode formulaire et de passer facilement des variables
     * supplementaires en parametre. Cette methode retourne une chaine
     * representant l'attribut action du formulaire.
     *
     * @return string Attribut action du form
     */
    function getDataSubmit() {
        //
        $datasubmit = "";
        $datasubmit .= "form.php";
        $datasubmit .= "?";
        $datasubmit .= "obj=".get_class($this);
        $datasubmit .= "&amp;validation=".$this->getParameter("validation");
        if ($this->getParameter("idx") != "]") {
            //
            $datasubmit .= "&amp;idx=".$this->getParameter("idx");
            $datasubmit .= "&amp;idz=".$this->getParameter("idz");
            switch ($this->getParameter("maj")){
                case 1 :
                    $datasubmit .= "&amp;action=modifier";
                    break;
                case 2 :
                    $datasubmit .= "&amp;ids=1&amp;action=supprimer";
                    break;
                case 3 :
                    $datasubmit .= "&amp;action=archiver";
                    break;
                case 4 :
                    $datasubmit .= "&amp;action=consulter";
                    break;
                
            }
        }
        $datasubmit .= "&amp;premier=".$this->getParameter("premier");
        $datasubmit .= "&amp;recherche=".$this->getParameter("recherche");
        $datasubmit .= "&amp;tricol=".$this->getParameter("tricol");
        $datasubmit .= "&amp;selectioncol=".$this->getParameter("selectioncol");
        $datasubmit .= "&amp;advs_id=".$this->getParameter("advs_id");
        //
        return $datasubmit;
    }

    /**
     * Cette methode permet de gerer l'affichage et la validation des
     * formulaires pour la mise a jour de la base de donnees.
     *
     * @param string $enteteTab
     * @param integer $validation
     * @param integer $maj 0 ajouter / 1 mise a jour / 2 suppression / 3 supprimer tout
     * @param object $db Objet de connexion DB
     * @param array $postVar Donnees du formulaire
     * @param string $aff
     * @param boolean $DEBUG Mode debug (@deprecated)
     * @param string $idx Identifiant de l'objet
     * @param integer $premier Pagignation de la page de retour
     * @param string $recherche Recherche de la page de retour
     * @param string $tricol Tri de la page de retour
     * @param string $idz
     * @param string $selectioncol Colonne recherchee de la page de retour
     * @param array $extra_parameters Parametres supplementaires
     *
     * @todo Changer l'attribut name du formulaire pour optimiser la gestion
     * des formulaires
     */
    function formulaire($enteteTab, $validation, $maj, &$db, $postVar, $aff, $DEBUG = false, $idx, $premier = 0, $recherche = "", $tricol = "", $idz = "", $selectioncol = "", $advs_id = "", $extra_parameters = array()) {
        // Mode debug desactive
        $DEBUG = false;
        // Affectation des parametres dans un tableau associatif pour le
        // stocker en attribut de l'objet
        $parameters = array(
            "aff" => $aff,
            "validation" => $validation,
            "maj" => $maj,
            "idx" => $idx,
            "premier" => $premier,
            "recherche" => $recherche,
            "tricol" => $tricol,
            "idz" => $idz,
            "selectioncol" => $selectioncol,
            "advs_id" => $advs_id
        );
        // Affectation du tableau precedant dans l'attribut 'parameters'
        $this->setParameters($parameters);
        // Affectation du tableau passe en parametre dans l'attribut 'parameters'
        $this->setParameters($extra_parameters);
        // Ouverture de la balise form
        echo "\n<!-- ########## START DBFORM ########## -->\n";
        echo "<form";
        echo " method=\"post\"";
        echo " name=\"f1\"";
        echo " id=\"".get_class($this)."\"";
        echo " class=\"dbForm\"";
        echo " action=\"";
        echo $this->getDataSubmit();
        echo "\"";
        echo ">\n";
        // Compatibilite anterieure - On decremente la variable validation
        $this->setParameter("validation", $this->getParameter("validation") - 1);
        // Instanciation de l'objet formulaire
        $this->form = new formulaire($enteteTab, $this->getParameter("validation"), $maj, $this->champs, $this->val, $this->longueurMax);
        // Valorisation des variables formulaires
        $this->setVal($this->form, $maj, $this->getParameter("validation"), $this->db, $DEBUG);
        $this->setType($this->form, $maj);
        $this->setLib($this->form, $maj);
        $this->setTaille($this->form, $maj);
        $this->setMax($this->form, $maj);
        $this->setSelect($this->form, $maj, $this->db, $DEBUG);
        $this->setOnchange($this->form, $maj);
        $this->setOnkeyup($this->form, $maj);
        $this->setOnclick($this->form, $maj);
        $this->setGroupe($this->form, $maj);
        $this->setRegroupe($this->form, $maj);
        //
        $this->form->recupererPostvar($this->champs, $this->getParameter("validation"), $postVar, $DEBUG);
        // Si le formulaire a ete valide
        if ($this->getParameter("validation") > 0) {
            // Appel des methodes en fonction du mode pour inserer, modifier ou
            // supprimer l'objet de/dans la base de donnees.
            switch ($maj) {
                case 0 :
                    // (MODE 'insert')
                    $db->autoCommit(false);
                    $this->ajouter($this->form->val, $this->db, $DEBUG) ;
                    $db->commit();
                    break;
                case 1 :
                    // (MODE 'update')
                    $db->autoCommit(false);
                    $this->modifier($this->form->val, $this->db, $DEBUG);
                    $db->commit();
                    break;
                case 2 :
                    // (MODE 'delete')
                    $db->autoCommit(false);
                    $this->supprimer($this->form->val, $this->db, $DEBUG);
                    $db->commit();
                    break;
                case 3 :
                    // (MODE 'archive')
                    $db->autoCommit(false);
                    $this->archiver($this->form->val, $this->db, $DEBUG);
                    $db->commit();
                    break;
                case 4 :
                    // (MODE 'consulter')
                    $db->autoCommit(false);
                    $this->consulter($this->form->val, $this->db, $DEBUG);
                    $db->commit();
                    break;
            }
        }
        // Desactivation du verrou
        $this->deverrouille($this->getParameter("validation"));
        // Si le formulaire a ete valide
        //if ($this->getParameter("validation") > 0) {
            // Affichage du message avant d'afficher le formulaire
            $this->message();
            // Si le formulaire est valide
            //if ($this->correct) {
                // Affichage du bouton retour
                $this->retour($premier, $recherche, $tricol);
            //}
        //}
        // Affichage du contenu du formulaire
        $this->form->entete();
        $this->form->afficher($this->champs, $this->getParameter("validation"), $DEBUG, $this->correct);
        $this->form->enpied();
        // Affichage du bouton et du bouton retour
        echo "\n<!-- ########## START FORMCONTROLS ########## -->\n";
        echo "<div class=\"formControls\">\n";
        if($maj !=4) {
            $this->bouton($maj);
        }
        $this->retour($premier, $recherche, $tricol);
        echo "</div>\n";
        echo "<!-- ########## END FORMCONTROLS ########## -->\n";
        // Fermeture de la balise form
        echo "</form>\n";
        echo "<!-- ########## END DBFORM ########## -->\n";
        // Sous formulaire interne et zone supplementaire
        if ($maj == 1) {
            $this->sousformulaireinterne(get_class($this), $idx, $this->db);
        } else {
            if ($maj == 0 and isset($this->valF[$this->clePrimaire]) and $this->valF[$this->clePrimaire] != "") {
                $this->sousformulaireinterne(get_class($this), $this->valF[$this->clePrimaire], $this->db);
            }
        }
    }

    /**
     *
     */
    function deverrouille($validation) {

        //
        if (!isset($_SESSION['verrou']) or !is_array($_SESSION['verrou'])) {
            $_SESSION['verrou'] = array();
        }

        //
        if ($validation == 0) {
            $_SESSION['verrou'][get_class($this)] = 0;
        }

    }

    /**
     *
     */
    function verrouille() {
        //
        if (!isset($_SESSION['verrou']) or !is_array($_SESSION['verrou'])) {
            $_SESSION['verrou'] = array();
        }
        $_SESSION['verrou'][get_class($this)] = 1;
    }

    /**
     *
     */
    function testverrou() {

        //
        if (file_exists("../dyn/var.inc")) {
            include "../dyn/var.inc";
        }

        //
        if (!isset($_SESSION['verrou']) or !is_array($_SESSION['verrou'])) {
            $_SESSION['verrou'] = array();
        }

        //
        if (!isset($verrou)) {
            $verrou = 1;
            $_SESSION['verrou'][get_class($this)] = 0;
        }

        //
        if ($_SESSION['verrou'][get_class($this)] == 1 and $verrou == 1) {
            $this->correct = false;
            $this->addToMessage(_("Il y a actuellement un verrou sur cet element a cause d'une procedure anormale."));
        }

        // Log
        $this->addToLog("testverrou() - "._("Le parametre de verrou dans le fichier var.inc est :")." ".($verrou?"true":"false"), EXTRA_VERBOSE_MODE);
        // Log
        $this->addToLog("testverrou() - "._("Le verrou sur cet element est :")." ".($_SESSION['verrou'][get_class($this)]?_("active"):_("desactive")), EXTRA_VERBOSE_MODE);

    }

    /**
     *
     */
    function message() {

        if ($this->msg != "") {

            //
            $m = new message();

            //
            if ($this->correct) {
                $class = "valid";
            } else {
                $class = "error";
            }
            $m->displayMessage($class, $this->msg);

        }

    }

    /**
     *
     */
    function retour($premier = 0, $recherche = "", $tricol = "") {

        echo "\n<a class=\"retour\" ";
        echo "href=\"";
        //
        echo "tab.php";
        echo "?";
        echo "obj=".get_class($this);
        echo "&amp;premier=".$this->getParameter("premier");
        echo "&amp;tricol=".$this->getParameter("tricol");
        echo "&amp;recherche=".$this->getParameter("recherche");
        echo "&amp;selectioncol=".$this->getParameter("selectioncol");
        echo "&amp;advs_id=".$this->getParameter("advs_id");
        //
        echo "\"";
        echo ">";
        //
        echo _("Retour");
        //
        echo "</a>\n";

    }

    /**
     * Cette methode permet d'afficher le bouton de validation du formulaire
     *
     * @param integer $maj Mode de mise a jour
     * @return void
     */
    function bouton($maj) {

        if (!$this->correct) {
            /*
            switch ($maj) {
                case 0:
                    $bouton = _("Ajouter");
                    break;
                case 1:
                    $bouton = _("Modifier");
                    break;
                case 2:
                    $bouton = _("Supprimer");
                    break;
                case 3:
                    $bouton = _("Archiver");
                    break;
                case 4:
                    $bouton = _("Consulter");
                    break;
            }
            //
            $bouton .= "&nbsp;".strtolower(_($this->table));
            */
            $bouton=_("Valider");
            echo "<input type=\"submit\" value=\"".$bouton."\" ";
            echo "class=\"om-button\" />";
        }

    }

    /**
     *
     */
    function boutonsousformulaire($datasubmit, $maj, $val=null) {

        if (!$this->correct) {
            /*
            switch ($maj) {
                case 0:
                    $bouton = _("Ajouter");
                    break;
                case 1:
                    $bouton = _("Modifier");
                    break;
                case 2:
                    $bouton = _("Supprimer");
                    break;
                case 3:
                    $bouton = _("Archiver");
                    break;
                case 4:
                    $bouton = _("Consulter");
                    break;
            }
            //
            $bouton .= "&nbsp;"._("l'enregistrement de la table");
            $bouton .= "&nbsp;'"._($this->table)."'";
            */
            $bouton=_("Valider");
            echo "<input type=\"button\" value=\"".$bouton."\" ";
            echo "onclick=\"affichersform('".get_class($this)."', '$datasubmit', this.form);\" ";
            echo "class=\"om-button\" />";
        }

    }

    /**
     *
     */
    function setVal(&$form, $maj, $validation, &$db, $DEBUG = false) {

        //

    }

    /**
     *
     */
    function setType(&$form, $maj) {

        //

    }

    /**
     *
     */
    function setLib(&$form, $maj) {

        // libelle automatique
        //[automatic wording]
            foreach(array_keys($form->val) as $elem){
                 $form->setLib($elem,_($elem));
            }

    }

    /**
     *
     */
    function setTaille(&$form, $maj) {

        //

    }

    /**
     *
     */
    function setMax(&$form, $maj) {

        //

    }

    /**
     *
     */
    function setSelect(&$form, $maj, $db, $DEBUG = false) {

        //

    }

    /**
     *
     */
    function setOnchange(&$form, $maj) {

        //

    }

    /**
     *
     */
    function setOnkeyup(&$form, $maj) {

        //

    }

    /**
     *
     */
    function setOnclick(&$form, $maj) {

        //

    }

    /**
     *
     */
    function setGroupe(&$form, $maj) {

        //

    }

    /**
     *
     */
    function setRegroupe(&$form, $maj) {

        //

    }

    /**
     *
     */
    function sousformulaireinterne($obj, $idx) {

        //

    }

    /**
     *
     */
    function sousformulaire($enteteTab, $validation, $maj, &$db, $postVar,
                            $premiersf, $DEBUG, $idx, $idxformulaire,
                            $retourformulaire, $typeformulaire, $objsf,
                            $tricolsf) {
        /*
        $enteteTab: libelle d entete du formulaire
        $styleform: style des controles du formulaires
        $maj      : 0 ajouter / 1 mise a jour / 2 suppression
        $db       : connexion base de donnees
        $aff      : appel formulaire
        $DEBUG    : 0= normal / 1= debugage
        $idx      : valeur de l'id de la table mouvement (pour relancer la requete
        $idxformulaire : idx du formulaire
        $retourformulaire : nom du formulaire de retour
        */
        //passage tricolonne soustableau par $tricolsf
        $DEBUG=0;
        //sousformulaire genere par ajax [sub form with ajax]
        $datasubmit="";
        switch ($maj) {
            case 0 : //Ajout
                $datasubmit="../scr/sousform.php?obj=$objsf&premiersf=$premiersf&retourformulaire=$retourformulaire&idxformulaire=$idxformulaire&trisf=$tricolsf".
                            "&validation=$validation&action=ajouter";
                break;
            case 1 : //Modification
                $datasubmit="../scr/sousform.php?obj=$objsf&premiersf=$premiersf&retourformulaire=$retourformulaire&idxformulaire=$idxformulaire&trisf=$tricolsf".
                            "&validation=$validation&action=modifier&idx=$idx";
                break;
            case 2 : //Suppression
                $datasubmit="../scr/sousform.php?obj=$objsf&premiersf=$premiersf&retourformulaire=$retourformulaire&idxformulaire=$idxformulaire&trisf=$tricolsf".
                            "&validation=$validation&ids=1&action=supprimer&idx=$idx";
                break;
            case 3 : //Archivage
                $datasubmit="../scr/sousform.php?obj=$objsf&premiersf=$premiersf&retourformulaire=$retourformulaire&idxformulaire=$idxformulaire&trisf=$tricolsf".
                            "&validation=$validation&action=archiver&idx=$idx";
                break;
            case 4 : //Consultation
                $datasubmit="../scr/sousform.php?obj=$objsf&premiersf=$premiersf&retourformulaire=$retourformulaire&idxformulaire=$idxformulaire&trisf=$tricolsf".
                            "&validation=$validation&ids=1&action=consulter&idx=$idx";
                break;
            case 5 : //Suppression totale
                $datasubmit="../scr/sousform.php?obj=$objsf&premiersf=$premiersf&retourformulaire=$retourformulaire&idxformulaire=$idxformulaire&trisf=$tricolsf".
                            "&validation=$validation&ids=2";
                break;
        }
        echo "<form name=\"f2\" action=\"\" id=\"".$objsf."\" methode=\"post\" ";
        echo "onsubmit=\"affichersform('".$objsf."', '$datasubmit', this);return false;\" >";
        $validation--; // compatibilite anterieure
        $form = new formulaire($enteteTab, $validation, $maj, $this->champs,$this->val,$this->longueurMax);
        $this->form = $form;
        //--------------------------------------------------------------------------
        // valorisation des variables formulaires    [form variables values]
        //--------------------------------------------------------------------------
        $this->setValsousformulaire($form,$maj,$validation,$idxformulaire,$retourformulaire,$typeformulaire,$db,$DEBUG);
        $this->setType($form,$maj) ;
        $this->setLib($form,$maj) ;
        $this->setTaille($form,$maj) ;
        $this->setMax($form,$maj) ;
        $this->setSelect($form,$maj,$db,$DEBUG) ;
        $this->setOnchange($form,$maj) ;
        $this->setOnkeyup($form,$maj) ;
        $this->setOnclick($form,$maj) ;
        $this->setGroupe($form,$maj) ;
        $this->setRegroupe($form,$maj) ;
        //--------------------------------------------------------------------------
        // affichage du formulaire
        // -------------------------------------------------------------------------
        $form->recupererPostvarsousform($this->champs,$validation,$postVar,$DEBUG);
        // validation ==============================================================
        if ($validation > 0) {
            // Appel des methodes en fonction du mode pour inserer, modifier ou
            // supprimer l'objet de/dans la base de donnees.
            switch ($maj) {
                case 0 :
                    // (MODE 'insert')
                    $db->autoCommit(false);
                    
                    $this->ajouter($this->form->val, $this->db, $DEBUG) ;
                    $db->commit();
                    break;
                case 1 :
                    // (MODE 'update')
                    $db->autoCommit(false);
                    $this->modifier($this->form->val, $this->db, $DEBUG);
                    $db->commit();
                    break;
                case 2 :
                    // (MODE 'delete')
                    $db->autoCommit(false);
                    $this->supprimer($this->form->val, $this->db, $DEBUG);
                    $db->commit();
                    break;
                case 3 :
                    // (MODE 'archive')
                    $db->autoCommit(false);
                    $this->archiver($this->form->val, $this->db, $DEBUG);
                    $db->commit();
                    break;
                case 4 :
                    // (MODE 'consulter')
                    $db->autoCommit(false);
                    $this->consulter($this->form->val, $this->db, $DEBUG);
                    $db->commit();
                    break;
            }
        }

        $this->deverrouille($validation);
        
        if ($validation > 0) {
            $this->message();
            if ($this->correct) {
                $this->retoursousformulaire($idxformulaire,$retourformulaire,$form->val,$objsf,$premiersf,$tricolsf);
            }
        }
        $form->entete();
        $form->afficher($this->champs,$validation,$DEBUG,$this->correct);
        $form->enpied();

        echo "<div class=\"formControls\">";
        //Suppression du bouton de validation si l'action est "consulter"
        if($maj!=4)
            $this->boutonsousformulaire($datasubmit,$maj,$form->val);
        $this->retoursousformulaire($idxformulaire,$retourformulaire,$form->val,$objsf,$premiersf,$tricolsf);
        echo "</div>\n";

        echo "</form>";
        // ---------------------
        // sousformulaireinterne
        // ---------------------
        //if($maj==1) {
        //  $this->sousformulaireinterne(get_class($this),$idx,$db);
        //}
        if($maj==1) { // moyen_com
          $this->sousformulaireinterne(get_class($this),$idx,$db);
        }else{
            if ($maj == 0 and isset($this->valF[$this->clePrimaire])
                and $this->valF[$this->clePrimaire] != "") {
            $this->sousformulaireinterne(get_class($this),$this->valF[$this->clePrimaire],$db);
          }
        }

    }

    /**
     *
     */
    function retoursousformulaire($idxformulaire, $retourformulaire, $val, $objsf, $premiersf, $tricolsf) {

        echo "\n<a class=\"retour\" ";
        echo "href=\"";
        echo "#";
        echo  "\" ";
        echo "onclick=\"ajaxIt('".$objsf."', '";
        //
        echo "../scr/soustab.php";
        echo "?";
        echo "obj=".$objsf;
        echo "&amp;retourformulaire=".$retourformulaire;
        echo "&amp;idxformulaire=".$idxformulaire;
        echo "&amp;premier=".$premiersf;
        echo "&amp;tricol=".$tricolsf;
        //
        echo "'); return false;";
        echo "\"";
        echo ">";
        //
        echo _("Retour");
        //
        echo "</a>\n";

    }

    /**
     *
     */
    function setValsousformulaire(&$form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire, &$db, $DEBUG = false) {

        if ($validation==0) {
          if ($maj == 0){

            $form->setVal($retourformulaire, $idxformulaire);
        }}

    }

    /**
     *
     */
    function formulaire_fenetre($enteteTab, $validation, $maj, &$db, $postVar, $aff, $DEBUG = false, $idx, $idxformulaire, $retourformulaire) {

        /*
        $enteteTab: libelle d entete du formulaire         [form head (not use)]
        $styleform: style des controles du formulaires     [control form style]
        $maj      : 0 ajouter / 1 mise a jour / 2 suppression [0=add,1=modify,2=delete,3=delete all]
        $db       : connexion base de donnees [dbpear object : database connexion]
        $aff      : appel formulaire  [call form]  *** remplacement de aff par get_class($this)
        $DEBUG    : 0= normal / 1= debugage
        $idx      : valeur de l'id de la table [occurence]
        */
        // variables
        $DEBUG=0;
        // *** 21/12/2009
        // FORM
        if ($idx=="]" ) { // ajouter [add]
            echo "<form method=\"POST\" action=\"form_fenetre.php?obj=".get_class($this).
                 "&validation=".$validation.
                 "\"  name=f1 style ='margin: 0; padding: 0;'>";
        } else {
            if($maj==1) {      // modifier [modify] //*** 21/12/2009 selectioncol
                echo "<form method=\"POST\" action=\"form_fenetre.php?obj=".get_class($this).
                    "&validation=".$validation."&idx=".$idx.
                    "\" name=f1 style ='margin: 0; padding: 0;'>"; // passage de idx
            } else {             // supprimer [delete]
                echo "<form method=\"POST\" action=\"form_fenetre.php?obj=".get_class($this).
                    "&validation=".$validation."&action=1&ids=1"."&idx=".$idx.
                    "\" name=f1 style ='margin: 0; padding: 0;'>"; // passage de idx
            }
        }
        $validation--; // compatibilite anterieure [old compatibility]
        $form = new formulaire($enteteTab, $validation, $maj, $this->champs,$this->val,$this->longueurMax);
        $this->form = $form;
        //--------------------------------------------------------------------------
        // valorisation des variables formulaires  [form variables values]
        //--------------------------------------------------------------------------
        $this->setValformulaire_fenetre($form,$maj,$validation,$idxformulaire,$retourformulaire,$db,$DEBUG);
        $this->setType($form,$maj) ;
        $this->setLib($form,$maj) ;
        $this->setTaille($form,$maj) ;
        $this->setMax($form,$maj) ;
        $this->setSelect($form,$maj,$db,$DEBUG) ;
        $this->setOnchange($form,$maj) ;
        $this->setOnkeyup($form,$maj) ;
        $this->setOnclick($form,$maj) ;
        //$this->setGroupe($form,$maj) et this->setRegroupe($form,$maj) ; non pris en compte
        //--------------------------------------------------------------------------
        //         *** affichage du formulaire ***           [display form]
        // -------------------------------------------------------------------------
        $form->entete();
        $form->recupererPostvar($this->champs,$validation,$postVar,$DEBUG);
        // ----------
        // validation
        // ----------
        if ($validation>0) {
               if ($maj==2){ // [delete]
                  $db->autoCommit(false);
                  $this->supprimer($form->val,$db,$DEBUG);
                  $db->commit() ;
               }else{
                  if($maj==1) {  //[modify]
                      $db->autoCommit(false);
                      $this->modifier($form->val,$db,$DEBUG);
                      $db->commit() ;
                  }else{  // [add]
                      $db->autoCommit(false);
                      $this->ajouter($form->val,$db,$DEBUG) ;
                      $db->commit() ;
               }}
        }
        $this->deverrouille($validation); //*** VERROU
        $form->afficher($this->champs,$validation,$DEBUG,$this->correct);
        // --------------------------------------
        // Affichage du bouton, message et retour
        // [display button, message, return]
        // --------------------------------------
        $this->bouton($maj);
        $this->retour_formulaire_fenetre(get_class($this));// modif ff
        $form->enpied();
        // end form
        echo "</form>";
        if ($validation>0) {
           $this->message();
        }

    }

    /**
     *
     */
    function retour_formulaire_fenetre($obj) {

        echo "\n<a class=\"retour\" ";
        echo "href=\"";
        //
        if (!$this->correct) {
            //
            echo "javascript:window.close();";
        } else {
            //
            echo "#";
            echo "\" ";
            echo "onclick=\"refresh_pere('".$obj."');";
        }
        //
        echo "\"";
        echo ">";
        //
        echo _("Retour");
        //
        echo "</a>\n";

    }

    /**
     *
     */
    function setValformulaire_fenetre(&$form, $maj, $validation, $idxformulaire, $retourformulaire, &$db, $DEBUG = false) {

        // specifique mise a jour de la cle secondaire
        if ($validation==0) {
          if ($maj == 0){
            $form->setVal($retourformulaire, $idxformulaire);
        }}

    }

    /**
     *
     */
    function form_fenetre($obj, $idx, $objfenetre, $hauteur, $largeur) {

        // $obj : objet formulaire
        // $idx : identifiant enregistrement formulaire
        // $objfenetre : objet en fenetre (form_fenetre.php)
        // largeur : largeur de la fenetre
        // hauteur : hauteur de la fenetre
          echo "<span id='img_afficher_".$objfenetre."' ><input type='image' id='bouton_afficher_".$objfenetre.
               "' src='../img/cle.gif' width='15' height='15'  vspace='5' hspace='2' style='vertical-align:middle' onclick=\"javascript:afficher_masquer('".
               $obj."','".$idx."','".$objfenetre."','".$hauteur."','".$largeur.
               "','1')\" style='background:transparent' ></span>";
          echo "<span id='img_masquer_".$objfenetre."'  style='display:none' ><input type='image' id='bouton_afficher_".$objfenetre.
               "' src='../img/clebas.gif' width='15' height='15' vspace='5' hspace='2' style='vertical-align:middle' onclick=\"javascript:afficher_masquer('".
               $obj."','".$idx."','".$objfenetre."','".$hauteur."','".$largeur.
               "','0')\" style='background:transparent'></span>";
          echo "<span style='font-size:10px;color:#ffffff;height:23px'>".$objfenetre."</span>";
          echo "<div id='sous_fenetre_".$objfenetre."' style='display:none'>";
          echo "</div><br>";

    }

    /**
     * Cette methode permet d'obtenir une chaine representant la clause where
     * pour une requ�te de selection sur la cle primaire.
     *
     * @param string $id Valeur de la cle primaire
     * @return string Clause where
     */
    function getCle($id = "") {
        // Construction de la clause where de la requ�te
        if ($this->typeCle == "A") {
            $cle = $this->clePrimaire." = '".$id."'";
        } else {
            $cle = $this->clePrimaire." = ".$id;
        }
        //
        return $cle;
    }

    /**
     * Cette methode permet de faire les verifications necessaires lors de
     * l'ajout de messages, et d'obtenir une coherence dans l'attribut message
     * de l'objet pour l'affichage.
     *
     * @param string $message
     */
    function addToMessage($message = "") {
        //
        if (!isset($this->msg)) {
            $this->msg = "";
        }
        //
        $this->msg .= $message . "<BR />";
    }

    /**
     * Cette methode ne doit plus etre appelee, c'est 'message::isError($res)'
     * qui s'occupe d'afficher le message d'erreur et de faire le 'die()'.
     *
     * @deprecated
     */
    function erreur_db($debuginfo, $messageDB, $table) {
        die(_("Erreur de base de donnees. Contactez votre administrateur."));
    }

    /**
     *
     */
    function dateDB($val) {

        // ======================================================================
        // fonction de traitement de date qui est saisie sous la forme JJ/MM/AAAA
        // dateSyspmePHP renvoie la date systeme au format de la base de donnees
        // dateDB met la date au format de la base de donnees
        // datePHP met la date au format PHP
        // anneePHP, moisPHP, jourPHP controle les dates affichees et transforme
        // en date en format PHP pour les annee mois et jour
        // heureDB controle l heure saisie
        // ======================================================================
        // ============================================================
        // transforme les dates affichees en date pour base de donnees
        // ============================================================
        $dateOK=1; // Flag sur longueur de date annee mois jour
        $date = explode("/", $val);
        // annee est sur 2 caractere / 1 caractere
        if ($date==""){
           if  (strlen($date[2]) ==2) $date[2]="20".$date[2] ;
           if  (strlen($date[2]) ==1) $date[2]="200".$date[2] ;
           if  (strlen($date[2]) !=4){
               echo "faux";
               $dateOK=0;
           }
        // mois sur un caractere
           if  (strlen($date[1]) ==1) $date[1]="0".$date[1] ;
           if  (strlen($date[1]) !=2){
               $dateOK=0;
           }
        }
        // Jour sur 1 caractere
        if  (strlen($date[0]) ==1) $date[0]="0".$date[0] ;
        if  (strlen($date[0]) !=2){
           $dateOK=0;
        }
        // Transforme la date suivant parametre date => connexion
        if ($dateOK==1){
           if (FORMATDATE=="AAAA-MM-JJ"){
           // controle de date
              if (sizeof($date) == 3 and (checkdate($date[1],$date[0],$date[2])or $val=="00/00/0000")) {
                 return $date[2]."-".$date[1]."-".$date[0];
              }else{
                  $this->msg= $this->msg."<br>la date ".$val." n'est pas une date";
                  if($this->correct==true) $this->correct=false;
              }
           }
           if (FORMATDATE=="JJ/MM/AAAA"){
           // controle de date
              if (sizeof($date) == 3  and checkdate($date[1],$date[0],$date[2])){
                 return $date[0]."/".$date[1]."/".$date[2];
              }else{
                  $this->msg= $this->msg."<br>la date ".$val." n'est pas une date";
                  $this->correct=false;
              }
           }
        }else{
              // Format de saisie mauvais
              $this->msg= $this->msg."<br>la date ".$val." n'est pas une date";
              $this->correct=false;
        }

    }

    /**
     *
     */
    function heureDB($val) {

        // =====================================================================
        // controle du champs heure saisi 00 ou 00:00 ou 00:00:00
        // =====================================================================
        // pb saisie H et h **************
        $val = str_replace("H",":",$val);
        $val = str_replace("h",":",$val);
        // ================================
        $heure = explode(":", $val);
           if (sizeof($heure) >= 1 or sizeof($heure) <= 3 ) {
              If (sizeof($heure) ==1 and $heure[0]>=0 and $heure[0] <= 23)
                 return $heure[0].":00:00";
              If (sizeof($heure) ==2 and $heure[0]>=0 and $heure[0] <= 23 and $heure[1]>=0 and $heure[1] <= 59)
                 return $heure[0].":".$heure[1].":00";
              If (sizeof($heure) ==3 and $heure[0]>=0 and $heure[0] <= 23 and $heure[1]>=0 and $heure[1] <= 59 and $heure[2]>=0 and $heure[2] <= 59)
                 return $heure[0].":".$heure[1].":".$heure[2];
           }
               $this->msg= $this->msg."<br>l heure ".$val." n'est pas une heure";
               $this->correct=false;

    }

    /**
     *
     */
    function dateSystemeDB() {

        // =======================================================================
        // mise au format base de donnees de la date systeme
        // =======================================================================
        if (FORMATDATE=="AAAA-MM-JJ")
              return date('Ymd');
        if (FORMATDATE=="JJ/MM/AAAA")
            return date('d/m/y');

    }

    /**
     * Cette methode permet de verifier la validite d'une date et de la
     * retourner sous le format 'AAAA-MM-JJ'
     *
     * @param string $val Date saisie au format 'JJ/MM/AAAA'
     * @return mixed
     */
    function datePHP($val) {

        // On explose la date pour en extraire ses trois elements (jour, mois,
        // annee)
        $date = explode("/", $val);
        // Verification de la validite de la date, c'est-a-dire qu'elle
        // comporte trois elements (jour, mois, annee) et qu'elle existe
        // dans le calendrier gregorien
        if (sizeof($date) == 3 and checkdate($date[1], $date[0], $date[2])) {
            // Retour de la date au format 'AAAA-MM-JJ'
            return $date[2]."-".$date[1]."-".$date[0];
        } else {
            // La date n'est pas valide donc on positionne le flag $correct a
            // false et on decrit l'erreur dans $msg
            $this->correct = false;
            $this->msg .= "<br/>";
            $this->msg .= $val;
            $this->msg .= " "._("n'est pas une date valide");
            $this->msg .= " "._("[calcul date php]");
        }

    }

    /**
     * Cette methode permet de verifier la validite d'une date et d'en
     * retourner l'annee
     *
     * @param string $val Date saisie au format 'JJ/MM/AAAA'
     * @return mixed
     */
    function anneePHP($val) {

        // On explose la date pour en extraire ses trois elements (jour, mois,
        // annee)
        $date = explode("/", $val);
        // Verification de la validite de la date, c'est-a-dire qu'elle
        // comporte trois elements (jour, mois, annee) et qu'elle existe
        // dans le calendrier gregorien
        if (sizeof($date) == 3 and checkdate($date[1], $date[0], $date[2])) {
            // Retour de l'annee
           return $date[2];
        } else {
            // La date n'est pas valide donc on positionne le flag $correct a
            // false et on decrit l'erreur dans $msg
            $this->correct = false;
            $this->msg .= "<br/>";
            $this->msg .= $val;
            $this->msg .= " "._("n'est pas une date valide");
            $this->msg .= " "._("[calcul annee php]");
        }

    }

    /**
     * Cette methode permet de verifier la validite d'une date et d'en
     * retourner le mois
     *
     * @param string $val Date saisie au format 'JJ/MM/AAAA'
     * @return mixed
     */
    function moisPHP($val) {

        // On explose la date pour en extraire ses trois elements (jour, mois,
        // annee)
        $date = explode("/", $val);
        // Verification de la validite de la date, c'est-a-dire qu'elle
        // comporte trois elements (jour, mois, annee) et qu'elle existe
        // dans le calendrier gregorien
        if (sizeof($date) == 3 and checkdate($date[1], $date[0], $date[2])) {
            // Retour du mois
           return $date[0];
        } else {
            // La date n'est pas valide donc on positionne le flag $correct a
            // false et on decrit l'erreur dans $msg
            $this->correct = false;
            $this->msg .= "<br/>";
            $this->msg .= $val;
            $this->msg .= " "._("n'est pas une date valide");
            $this->msg .= " "._("[calcul mois php]");
        }

    }

    /**
     * Cette methode permet de verifier la validite d'une date et d'en
     * retourner le jour
     *
     * @param string $val Date saisie au format 'JJ/MM/AAAA'
     * @return mixed
     */
    function jourPHP($val) {

        // On explose la date pour en extraire ses trois elements (jour, mois,
        // annee)
        $date = explode("/", $val);
        // Verification de la validite de la date, c'est-a-dire qu'elle
        // comporte trois elements (jour, mois, annee) et qu'elle existe
        // dans le calendrier gregorien
        if (sizeof($date) == 3 and checkdate($date[1], $date[0], $date[2])) {
            // Retour du jour
           return $date[1];
        } else {
            // La date n'est pas valide donc on positionne le flag $correct a
            // false et on decrit l'erreur dans $msg
            $this->correct = false;
            $this->msg .= "<br/>";
            $this->msg .= $val;
            $this->msg .= " "._("n'est pas une date valide");
            $this->msg .= " "._("[calcul jour php]");
        }

    }

    /**
     * Cette methode permet de rechercher le nombre d'enregistrements
     * ayant le champ 'field' correspondant a la valeur 'id' dans la table
     * 'table'. Si il y a des enregistrements, alors l'attribut 'correct' de
     * l'objet est passe a la valeur false et un message supplementaire est
     * ajoute a l'attribut msg de l'objet.
     *
     * Cette methode est principalement destinee a etre appellee depuis la
     * methode cleSecondaire.
     *
     * @param object $db Objet de connexion DB
     * @param string $table
     * @param string $field
     * @param string $id
     * @param boolean $DEBUG Mode debug (@deprecated)
     * @param string $selection
     */
    function rechercheTable(&$db = NULL, $table, $field, $id, $DEBUG = false, $selection = "") {

        //
        $sql = "select count(*) from ".DB_PREFIXE.$table." ";
        if ($this->typeCle == "A") {
            $sql .= "where ".$field."='".$id."' ";
        } else {
            $sql .= "where ".$field."=".$id." ";
        }
        $sql .= $selection;

        //
        $nb = $db->getone($sql);
        $this->addToLog("rechercheTable(): db->getone(\"".$sql."\");", VERBOSE_MODE);
        if (database::isError($nb)) {

            //
            $this->erreur_db($nb->getDebugInfo(), $nb->getMessage(), '');

        } else {

            //
            if ($nb > 0) {
                $this->correct = false;
                $this->msg .= $nb." ";
                $this->msg .= _("enregistrement(s) lie(s) a cet enregistrement dans la table");
                $this->msg .= " ".$table."<br />";
            }

        }

    }

    /**
     * Cette methode permettait de realiser la traduction selon l'ancien
     * systeme.
     *
     * @param string $texte
     * @return string
     * @deprecated
     */
    function lang($texte) {

        return _($texte);

    }

    /**
     * Cette methode permettait de realiser la traduction selon l'ancien
     * systeme.
     *
     * @param string $texte
     * @return string
     * @deprecated
     */
    function om_lang($texte) {

        return _($texte);

    }

    // {{{ Gestion des messages de debug

    /**
     *
     */
    function addToLog($message, $type = DEBUG_MODE) {
        //
        logger::instance()->log("class ".get_class($this)." - ".$message, $type);
    }

    // }}}

    /**
     *
     */
    function __destruct() {
        // Logger
        $this->addToLog("__destruct()", EXTRA_VERBOSE_MODE);
    }

}

?>
