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 */