diff --git a/bureau/class/m_messages.php b/bureau/class/m_messages.php
new file mode 100644
index 00000000..6c8acd9b
--- /dev/null
+++ b/bureau/class/m_messages.php
@@ -0,0 +1,262 @@
+Cette classe gère les messages qui peuvent apparaitre lors d'appels
+ * à l'API d'AlternC. Ces msgs sont stockées sous la forme d'1 nombre
+ * (Classe ID) ainsi que du msg en associé.
+ * Des messages localisés sont aussi disponibles.
+ * Cette classe se charge aussi d'insérer les appels à l'API d'AlternC
+ * dans les logs du système dans /var/log/alternc/bureau.log
+ *
+ * Copyleft {@link http://alternc.net/ AlternC Team}
+ *
+ * @copyright AlternC-Team 2002-11-01 http://alternc.net/
+ */
+class m_messages {
+
+ /** Tableau qui va contenir les messages et leur id */
+ var $arrMessages = array();
+
+ /** Emplacement du fichier de logs d'AlternC */
+ var $logfile = "/var/log/alternc/bureau.log";
+
+ /** Liste of possible type */
+ var $ARRTYPES = array("ERROR", "ALERT", "INFO", "OK");
+
+ /** Associate css classes */
+ var $ARRCSS = array(
+ "ERROR" => "alert-danger",
+ "ALERT" => "alert-warning",
+ "INFO" => "alert-info",
+ "OK" => "alert-success"
+ );
+
+ public function __construct() {
+ $this->init_msgs();
+ }
+
+ /**
+ * Enregistre un message, signale celle-ci dans les logs
+ *
+ * Cette fonction enregistre un message, l'ajoute dans les logs d'AlternC,
+ * et la met à disposition pour le bureau virtuel pour affichage ultérieur.
+ *
+ * @param string $cat The category of the msg array to work with
+ * @param integer $clsid Classe qui lève le message
+ * @param mixed $msg Message
+ * @param string $param Paramètre chaine associé au message (facultatif)
+ * @return boolean TRUE si le msg est enregistré, FALSE sinon.
+ *
+ */
+ function raise($cat = "Error", $clsid, $msg, $param = "") {
+ $arrInfos = array();
+
+ $type = strtoupper($cat);
+ if (! in_array($type, $this->ARRTYPES)) {
+ return false;
+ }
+
+ $arrInfos['clsid'] = $clsid;
+ $arrInfos['msg'] = $msg;
+ $arrInfos['param'] = is_array($param)?$param:(empty($param)?"":array($param));
+
+ $this->arrMessages[$type][] = $arrInfos;
+
+ $this->logAlternC($cat);
+ return true;
+ }
+
+ function init_msgs() {
+ // Initialisation du tableau des message
+ foreach ($this->ARRTYPES as $v) {
+ $this->arrMessages[$v] = array();
+ }
+ }
+
+ /**
+ * Indique s'il y a ds msgs enregistrés pour une catégorie si le param $cat contient une catégorie
+ * ou pour toutesl es catégories si $cat est vide
+ *
+ * @param string $cat The category of the msg array to work with
+ * @return boolean True if there is/are msg recorded.
+ *
+ */
+ function has_msgs($cat) {
+ $type = strtoupper($cat);
+ if (in_array($type, $this->ARRTYPES)) {
+ return (count($this->arrMessages[$type]) > 0);
+ } else {
+ foreach ($this->arrMessages as $v) {
+ if (count($v) > 0)
+ return true;
+ }
+ return false;
+ }
+ }
+
+ /**
+ * Retourne la chaine de message concaténés de l'ensemble des msgs enregistrés
+ * ou du dernièr message rencontré
+ *
+ * @param string $cat The category of the msg array to work with
+ * @param string $sep The separator used to concatenate msgs
+ * @param boolean $all show all the messages or only the last one
+ *
+ * @return string Message.
+ *
+ */
+ function msg_str($cat = "Error", $sep = "", $all = true) {
+ $str = "";
+
+ $type = strtoupper($cat);
+ if (! in_array($type, $this->ARRTYPES)) {
+ return false;
+ }
+
+ if (! $this->has_msgs($cat))
+ return "";
+
+ if ($all) {
+ foreach ($this->arrMessages[$type] as $k => $arrMsg) {
+ $args = $arrMsg['param'];
+
+ if (is_array($args) && count($args) > 0) {
+ array_unshift($args, $arrMsg['msg']);
+ if ($sep == "")
+ $str .= "" . call_user_func_array("sprintf", $args) . "";
+ else
+ $str .= call_user_func_array("sprintf", $args) . $sep;
+ } else
+ if ($sep == "")
+ $str .= "" . $arrMsg['msg'] . "";
+ else
+ $str .= $arrMsg['msg'] . $sep;
+ }
+
+ if ($sep == "")
+ $str = "";
+
+ } else {
+ $i = count($this->arrMessages[$type]) - 1;
+ if ($i > 0) {
+ $arr_msg=$this->arrMessages[$type][$i];
+ $args = $arr_msg['param'];
+ if (is_array($args) && count($args) > 0) {
+ array_unshift($args, $arr_msg['msg']);
+ $str = call_user_func_array("sprintf", $args);
+ } else
+ $str = $arr_msg['msgId'];
+ }
+ }
+
+ return $str;
+ }
+
+ /**
+ * Retourn le message au format Html avec la class Css associée
+ *
+ * @param string $cat The category of the msg array to work with
+ * @param string $sep The separator used to concatenate msgs
+ * @param boolean $all show all the messages or only the last one
+ *
+ * @return string HTML message
+ */
+ function msg_html($cat = "Error", $sep = "", $all = true) {
+ $type = strtoupper($cat);
+ if (! in_array($type, $this->ARRTYPES)) {
+ return false;
+ }
+
+ if (count($this->arrMessages[$type]) == 0)
+ return "";
+
+ $str = $this->msg_str($cat, $sep, $all);
+ $str = "" . $str . "
";
+
+ return $str;
+ }
+
+ /**
+ * Retourn le message de toutes les catégories au format Html avec la class Css associée
+ *
+ * @param string $sep The separator used to concatenate msgs
+ * @param boolean $all show all the messages or only the last one
+ *
+ * @return string HTML message
+ */
+ function msg_html_all($sep = "", $all = true, $init = false) {
+ $msg="";
+
+ $msg.=$this->msg_html("Error", $sep, $all);
+ $msg.=$this->msg_html("Ok", $sep, $all);
+ $msg.=$this->msg_html("Info", $sep, $all);
+ $msg.=$this->msg_html("Alert", $sep, $all);
+
+ if ($init)
+ $this->init_msgs();
+
+ return $msg;
+ }
+
+ /**
+ * Envoi un log dans /var/log/alternc/bureau.log
+ *
+ * Cette fonction Loggue le dernier msg dans /var/log sur la machine,
+ * permettant ainsi aux admins de savoir ce qu'il se passe...
+ * Elle est appelée automatiquement par error
+ * @access private
+ */
+ function logAlternC($cat = "Error") {
+ global $mem;
+
+ $type = strtoupper($cat);
+ if (! in_array($type, $this->ARRTYPES)) {
+ return false;
+ }
+
+ @file_put_contents($this->logfile, date("d/m/Y H:i:s") . " - " . get_remote_ip() . " - $type - " . $mem->user["login"] . " - " . $this->msg_str($cat, "", false), FILE_APPEND);
+ }
+
+ /**
+ * Envoi un log d'appel d'API dans /var/log/alternc/bureau.log
+ *
+ * Cette fonction loggue dans /var/log l'appel à la fonction de l'API
+ * d'AlternC.
+ *
+ * @param integer $clsid Numéro de la classe dont on a appelé une fonction
+ * @param string $function Nom de la fonction appelée
+ * @param string $param Paramètre (facultatif) passés à la fonction de l'API.
+ * @return boolean TRUE si le log a été ajouté, FALSE sinon
+ *
+ */
+ function log($clsid, $function, $param = "") {
+ global $mem;
+ return @file_put_contents($this->logfile, date("d/m/Y H:i:s") . " - " . get_remote_ip() . " - CALL - " . $mem->user["login"] . " - $clsid - $function - $param\n", FILE_APPEND);
+ }
+
+}
+
+/* Classe m_messages */