<?php


/////////////////////////////////////////////////////////////////
//                                                             //
//  EISPortal, das Eisfair-Webfrontend                         //
//  Filename: ModulAnalyser.php                                //
//  Created on 18.11.2006                                      //
//  Author: Yves Schumann <eisportal(at)hiluxumbau(dot)de>     //
//                                                             //
/////////////////////////////////////////////////////////////////
//  $Id$

class ModulAnalyser {

    private $m_aAvailableModules;
    private $m_sPortalRootPath;
    private $m_sGlobalLanguage;
    private $m_AuthObject;
    private $m_LanguageObject;
    private $m_Logger;
    private $m_MDB2;

    /**
     * Constructor
     * 
     * Generierung der Arrays mit den momentan verfuegbaren Modulen. Zum Aufbau
     * und Inhalt des Arrays siehe <code>findInstalledModules</code>.
     * 
     * @param Object - Das erzeugte Auth-Objekt, womit festgestellt wird, ob
     * User eingeloggt ist oder nicht.
     * 
     * @param String - Kuerzel um in das EisPortal-Hauptverzeichnis zu gelangen.
     * Notwendig um aus dem Admin-Folder "herauszukommen" und die vorhandenen
     * Klassen nutzen zu koennen.
     * 
     */
    function __construct($authObject, $portalRootPath) {
        $this->m_sPortalRootPath = $portalRootPath;
        $this->m_AuthObject = $authObject;
        $this->m_Logger = Logger :: singleton();
        $this->m_MDB2 = & MDB2 :: singleton(DSN);
    }

    /**
     * Liefern des Arrays mit den momentan verfuegbaren Modulen. Zum Aufbau
     * und Inhalt des Arrays siehe <code>findInstalledModules</code>.
     * 
     * @return Array - Array der verfuegbaren Module
     */
    function getAvailableModules($userInfo) {
        if (!$this->m_aAvailableModules) {
            $this->m_aAvailableModules = $this->findInstalledModules($userInfo);
        }

        $this->m_Logger->logDebug(_("Available modules") . ":");
        $this->m_Logger->logDebug($this->m_aAvailableModules);

        return $this->m_aAvailableModules;
    }

    /** 
     * Auslesen der vorhandenen Module und Erstellen eines Arrays mit Daten 
     * zu den gefundenen Modulen. Modul erscheint in der Liste nur dann, wenn 
     * User das notwendige Recht dazu hat.
     * 
     * Bsp.:
     * Array
     * (
     *     [0] => Array
     *         (
     *             [ID] => 2
     *             [modulName] => blablub
     *             [naviText] => Blubberei
     *             [icon] => icon_navigation.jpg
     *             [visibility] => 2
     *         )
     * 
     *     [1] => Array
     *         (
     *             [ID] => 1
     *             [modulName] => eisfaxweb
     *             [naviText] => EisFax
     *             [icon] => icon_navigation.jpg
     *             [visibility] => 1
     *         )
     * 
     *     ...
     * )
     * 
     * @return Array - Array der verfuegbaren Module
     * 
     */
    function findInstalledModules($userInfo) {
        $this->m_Logger->logDebug(__FUNCTION__ . "()");

        // wenn keine Userinfo uebergeben, dann nur die freien Module liefern
        if (!$userInfo) {
            return $this->findFreeModules();
        }

        // wenn nicht eingeloggt, dann nur die freien Module liefern
        if (!$this->m_AuthObject->checkAuth()) {
            return $this->findFreeModules();
        }

        // Verzeichnis der Module einlesen
        $modules = @ scandir($this->m_sPortalRootPath . "modules");

        // wenn leer (keine Module gefunden), dann gleich zurueckspringen
        #   if (array_count_values($modules) < 1) {
        if ($modules == false) {
            return array ();
        }

        // Rechte des Users holen
        $userRights = getUserRights($userInfo);
        //print_r($userRights);

        // IDs der Module holen
        $modulIDs = getAllModulIDs();
        //print_r($modulIDs);

        // in dieses Array werden die Moduldaten eingetragen
        $availableModules = array ();
        $i = 0;

        foreach ($modules as $key => $value) {
            if ($value != "." && $value != ".." && $value != ".svn") {
                // falls sich Grossbuchstaben eingeschlichen haben...
                $value = strtolower($value);

                // Konfiguration des Moduls laden
                $EPV_modulVisibility = "0";
                // jetzt $modulVisibility aus der Konfig laden, also neu setzen
                require ($this->m_sPortalRootPath . "modules/" . $value . "/config.php");

                // Default: Kein Zutritt
                $userHasTheRight = false;

                //          if ($modulIsActive != "yes"){
                //              // Modul ist _nicht_ aktiv
                //              continue;
                //          }

                // Pruefen, ob ein Modul mit dem Names des Verzeichnisses
                // aus $value existiert
                if (!array_key_exists($value, $modulIDs)) {
                    // Eintrag fuer dieses Modul anlegen
                    $sql = "INSERT INTO eisportal_modules ";
                    $sql .= "( modulname ) "; //
                    $sql .= " VALUES ( '"; //
                    $sql .= $value . "' "; //
                    $sql .= ");"; //

                    // Und Query abschicken
                    $this->m_MDB2->query($sql);

                    // und IDs neu auslesen
                    $modulIDs = getAllModulIDs();

                    // User ist ein Admin, dann kann er dieses Modul sehen
                    // ansonsten sind noch keine Rechte vorhanden
                    if ($userInfo[0]['role'] == PORTALADMIN) {
                        // User ist ein Portaladmin, keine weitere Pruefung noetig
                        $userHasTheRight = true;
                    }
                } else
                    if ($EPV_modulIsActive == "yes" && $EPV_modulVisibility == "2") {
                        // dieses Modul ist immer sichtbar
                        $userHasTheRight = true;
                    } else
                        if ($EPV_modulVisibility == "1") {
                            // Modul ist nur eingeloggten Users sichtbar
                            // Eintrag existiert, jetzt Rechte des Users pruefen
                            if ($userInfo[0]['role'] == PORTALADMIN) {
                                // User ist ein Portaladmin, keine weitere Pruefung noetig
                                $userHasTheRight = true;
                            } else
                                if ($modulIsActive == "yes" && $userRights[$userInfo[0]['ID']][$modulIDs[$value]] > NO_RIGHT) {
                                    // Wenn Modul aktiv ist und wenn Recht des Users groesser
                                    // $NO_RIGHT ist, dann Modul darstellen
                                    $userHasTheRight = true;
                                }
                        } else
                            if ($userInfo[0]['role'] == PORTALADMIN) {
                                // User ist ein Portaladmin, keine weitere Pruefung noetig
                                $userHasTheRight = true;
                            }

                if ($userHasTheRight == true) {
                    // // Konfiguration des Moduls laden
                    // require ($mainPath . "modules/" . $value . "/config.php");

                    // ID des Modules eintragen
                    $availableModules[$i]['ID'] = $modulIDs[$value];

                    // physischen Name des Modules eintragen
                    $availableModules[$i]['modulName'] = $value;

                    // Sprachdatei des Moduls laden
                    //                    if (file_exists($this->m_sPortalRootPath . "modules/" . $value . "/lang/" . $LanguageObject->getLanguage() . ".php")) {
                    //                        // wenn gefunden, dann global eingestellte Sprache laden
                    //                        require_once ($this->m_sPortalRootPath . "modules/" . $value . "/lang/" . $LanguageObject->getLanguage() . ".php");
                    //                    } else {
                    //                        // wenn nicht gefunden, dann im Modul eingestellte Sprache laden
                    //                        require_once ($this->m_sPortalRootPath . "modules/" . $value . "/lang/" . $modulLanguage . ".php");
                    //                    }

                    // anzuzeigenden Name des Modules eintragen
                    // $lang_ModulTitle kommt aus dem Sprachfile des Moduls,
                    // deshalb kein Praefix ""
                    $availableModules[$i]['naviText'] = $lang_ModulTitle;

                    // Sichtbarkeit des Moduls
                    //$availableModules[$i]['visibleTo'] = $modulIsVisibleTo;

                    // Icon fuer Navi-Leiste
                    $availableModules[$i]['icon'] = "icon_navigation.jpg";

                    // Verfuegbarkeit des Moduls eintragen
                    $availableModules[$i]['visibility'] = $EPV_modulVisibility;

                    $i++;
                }
            }
        }
        return $availableModules;
    }

    /** 
     * Auslesen der vorhandenen Module und Erstellen eines Arrays mit Daten
     * zu den Modulen, die _ohne_ Login erreichbar sind. Modul erscheint in der
     * Liste also nur dann, wenn $modulVisibility aus config.php des
     * jeweiligen Moduls == 2
     * 
     * Bsp.:
     * Array
     * (
     *     [0] => Array
     *         (
     *             [ID] => 2
     *             [modulName] => blablub
     *             [naviText] => Blubberei
     *             [icon] => icon_navigation.jpg
     *             [visibility] => 2
     *         )
     * 
     *     [1] => Array
     *         (
     *             [ID] => 1
     *             [modulName] => eisfaxweb
     *             [naviText] => EisFax
     *             [icon] => icon_navigation.jpg
     *             [visibility] => 1
     *         )
     * 
     *     ...
     * )
     * 
     * @return Array - Array der verf�gbaren Module
     * 
     */
    function findFreeModules() {
        $this->m_Logger->logDebug(__FUNCTION__ . "()");

        // Verzeichnis der Module einlesen
        $modules = @ scandir($this->m_sPortalRootPath . "modules");

        // wenn leer, dann gleich zur�ckspringen
        #   if (array_count_values($modules) < 1) {
        if ($modules == false) {
            $this->m_Logger->logInfo(_("No modules found"));
            return array ();
        }

        // IDs der Module holen
        $modulIDs = $this->getAllModulIDs();
        $this->m_Logger->logDebug(_("Modul-IDs") . ":");
        $this->m_Logger->logDebug($modulIDs);

        // in dieses Array werden die Moduldaten eingetragen
        $availableModules = array ();
        $i = 0;

        $this->m_Logger->logDebug($modules);

        foreach ($modules as $key => $value) {
            if ($value != "." && $value != ".." && $value != ".svn") {
                // falls sich Grossbuchstaben eingeschlichen haben...
                $value = strtolower($value);

                // Konfiguration des Moduls laden
                $EPV_modulVisibility = MODUL_NOT_VISIBLE;
                // jetzt $modulVisibility aus der Konfig laden, also neu setzen
                require ($this->m_sPortalRootPath . "modules/" . $value . "/config.php");

                // Wenn Modul deaktiviert wurde,
                // dann ueberspringen
                if ($EPV_modulIsActive != "yes") {
                    // Modul ist _nicht_ aktiv
                    $this->m_Logger->logDebug(_("Module") . " " . $value . " " . _("not active."));
                    continue;
                }

                // Pruefen, ob ein Modul mit dem Names des Verzeichnisses
                // aus $value auch in der DB existiert
                if (!array_key_exists($value, $modulIDs)) {
                    $this->m_Logger->logDebug(_("Module") . " " . $value . " " . _("in database not found. Creating entry..."));

                    // In DB nicht vorhanden, also Eintrag fuer dieses Modul anlegen
                    $sql = "INSERT INTO eisportal_modules ";
                    $sql .= "( modulname ) "; //
                    $sql .= " VALUES ( '"; //
                    $sql .= $value . "' "; //
                    $sql .= ");"; //

                    // Query abschicken
                    $this->m_MDB2->query($sql);

                    // und IDs neu auslesen
                    $modulIDs = $this->getAllModulIDs();

                } else
                    if ($EPV_modulVisibility == MODUL_ALWAYS_VISIBLE) {
                        // Modul ist immer sichtbar
                        $this->m_Logger->logDebug(_("Module") . " " . $value . " " . _("is always visible."));

                        // ID des Modules eintragen
                        $availableModules[$i]['ID'] = $modulIDs[$value];

                        // physischen Name des Modules eintragen
                        $availableModules[$i]['modulName'] = $value;

                        // Sprachdatei des Moduls laden, wenn Sprachfile in
                        // globaler Sprache vorhanden und globale Sprache im
                        // Modul aktiviert ist
                        //                    if ((file_exists($this->m_sPortalRootPath . "modules/" . $value . "/lang/" . $this->m_LanguageObject->getLanguage() . ".php")) && ($modulLanguage == "gl")) {
                        //                        // wenn gefunden, dann global eingestellte Sprache laden
                        //                        require_once ($this->m_sPortalRootPath . "modules/" . $value . "/lang/" . $language . ".php");
                        //                    } else {
                        //                        // wenn nicht gefunden, dann im Modul eingestellte Sprache laden
                        //                        require_once ($this->m_sPortalRootPath . "modules/" . $value . "/lang/" . $modulLanguage . ".php");
                        //                    }

                        // anzuzeigenden Name des Modules eintragen
                        // $lang_ModulTitle kommt aus dem Sprachfile des Moduls,
                        // deshalb kein Praefix ""
                        $availableModules[$i]['naviText'] = $lang_ModulTitle; // Sichtbarkeit des Moduls
                        //$availableModules[$i]['visibleTo'] = $modulIsVisibleTo;
                        // Icon fuer Navi-Leiste
                        $availableModules[$i]['icon'] = "icon_navigation.jpg"; // Verfuegbarkeit des Moduls eintragen
                        $availableModules[$i]['visibility'] = $EPV_modulVisibility;
                        $i++;
                    }
            }
        }
        return $availableModules;
    }

    /**
     * Liefert ein Array mit den Modulnamen als Key und den ID's als Value
     * 
     * Bsp.:
     * Array
     * (
     *     [eisfaxweb] => 1
     *     [blablub] => 2
     *     [webmail] => 3
     *     [oelkj] => 4
     * )
     * 
     * @return Array - siehe oben
     * 
     */
    function getAllModulIDs() {
        $sql = "SELECT ID, modulname ";
        $sql .= "FROM eisportal_modules ";
        $sql .= "ORDER BY modulname ";

        $res = $this->m_MDB2->query($sql);

        // Resultat extrahieren
        $modulIDs = array ();
        while ($row = $res->fetchRow()) {
            //    $modulIDs[$row['modulname']] = $row['ID'];
            $modulIDs[$row[1]] = $row[0];
        }

        $this->m_Logger->logDebug(_("Module IDs") . ":");
        $this->m_Logger->logDebug($modulIDs);

        return $modulIDs;
    }

    /**
     * Liefert ein Array mit den ID's als Key und den Modulnamen als Value
     * Bsp.:
     * Array
     * (
     *     [1] => eisfaxweb
     *     [2] => blablub
     *     [3] => webmail
     *     [4] => oelkj
     * )
     * 
     * @return Array - siehe oben
     * 
     */
    function getAllModulNames() {
        $sql = "SELECT ID, modulname ";
        $sql .= "FROM eisportal_modules ";
        $sql .= "ORDER BY ID ";

        $res = $this->m_MDB2->query($sql);

        // Resultat extrahieren
        $modulNames = array ();
        while ($row = $res->getRow()) {
            $modulNames[$row[0]] = $row[1];
        }

        $this->m_Logger->logDebug(_("Modulnames") . ":");
        $this->m_Logger->logDebug($modulNames);

        return $modulNames;
    }
}
?>
