<?php
/**
 * Ce script contient la définition des classes 'layout' et 'layout_base'.
 *
 * @package framework_openmairie
 * @version SVN : $Id$
 */

/**
 *
 */
if (defined("PATH_OPENMAIRIE") !== true) {
    /**
     * @ignore
     */
    define("PATH_OPENMAIRIE", "");
}

/**
 * Définition de la classe 'layout'.
 *
 * La classe 'layout' est une classe d'abstraction de l'affichage. C'est cette
 * classe qui est instanciée et utilisée par d'autres scripts pour gérer
 * l'affichage de la structure des pages et ce peu importe l'affichage utilisé.
 * Son objectif est d'instancier la classe d'affichage spécifique aussi appelée
 * plugin d'affichage correspondant au paramétrage sélectionné. Cette classe
 * d'affichage spécifique hérite de la classe 'layout_base' qui lui sert de
 * modèle.
 */
class layout {

    /**
     *
     */
    public $layout_type = NULL;

    /**
     *
     */
    public $layout = NULL;

    /**
     *
     */
    public $error = NULL;

    /**
     *
     */
    public function __construct($layout_type = NULL) {
        //
        if (is_null($layout_type)) {
            return $this->error(-1);
        }
        //
        if (file_exists("../obj/om_layout_".$layout_type.".class.php")) {
            require_once "../obj/om_layout_".$layout_type.".class.php";
            $layout_class = "om_layout_".$layout_type;
        } elseif (file_exists(PATH_OPENMAIRIE."om_layout_".$layout_type.".class.php")) {
            require_once PATH_OPENMAIRIE."om_layout_".$layout_type.".class.php";
            $layout_class = "layout_".$layout_type;
        } else {
            return $this->error(-2);
        }
        //
        $this->layout = new $layout_class($this);
    }

    /**
     *
     */
    //
    public function display() { $this->layout->display(); }
    //
    public function display_html_header() { $this->layout->display_html_header(); }
    public function display_header() { $this->layout->display_header(); }
    public function display_content_start() { $this->layout->display_content_start(); }
    public function display_content_end() { $this->layout->display_content_end(); }
    public function display_footer() { $this->layout->display_footer(); }
    public function display_html_footer() { $this->layout->display_html_footer(); }
    public function display_page_title($page_title = "") { $this->layout->display_page_title($page_title); }
    public function display_page_title_subtext($page_title_subtext = "") { $this->layout->display_page_title_subtext($page_title_subtext); }
    public function display_page_subtitle($page_subtitle = "") { $this->layout->display_page_subtitle($page_subtitle); }
    public function display_page_description($page_description = "") { $this->layout->display_page_description($page_description); }
    public function display_link_js_close_window($js_function_close = "") { $this->layout->display_link_js_close_window($js_function_close); }
    public function display_message($class = "", $message = "", $titre = "") { $this->layout->display_message($class, $messagem , $titre); }
    public function display_messages() { $this->layout->display_messages(); }
    public function display_script_js_call($js = "") { $this->layout->display_script_js_call($js); }
    //
    public function display_icon($icon, $title) { $this->layout->display_icon($icon, $title); }
    public function display_action_login() { $this->layout->display_action_login(); }
    public function display_action_collectivite() { $this->layout->display_action_collectivite(); }
    public function display_action_extras() {$this->layout->display_action_extras(); }
    //
    public function display_table_start($param) { $this->layout->display_table_start($param); }
    public function display_table_start_class_default($param) { $this->layout->display_table_start_class_default($param); }
    public function display_table_pagination($params) { $this->layout->display_table_pagination($params); }
    public function display_table_search_simple($params) { $this->layout->display_table_search_simple($params); }
    public function display_table_global_actions($actions) { $this->layout->display_table_global_actions($actions); }
    public function display_table_lien_data_colonne_une($params) { $this->layout->display_table_lien_data_colonne_une($params); }
    public function display_table_lien_entete_colonne_une($param) { $this->layout->display_table_lien_entete_colonne_une($param); }
    public function display_table_cellule_entete_colonnes($param) { $this->layout->display_table_cellule_entete_colonnes($param); }
    //
    public function display_formulaire_debutFieldset($params) { $this->layout->display_formulaire_debutFieldset($params); }
    public function display_formulaire_finFieldset($params) { $this->layout->display_formulaire_finFieldset($params); }
    public function display_formulaire_portlet_start($params = array()) { $this->layout->display_formulaire_portlet_start($params); }
    public function display_formulaire_portlet_end($params = array()) { $this->layout->display_formulaire_portlet_end($params); }
    public function display_formulaire_conteneur_libelle_widget($type_champ) { $this->layout->display_formulaire_conteneur_libelle_widget($type_champ); }
    public function display_formulaire_conteneur_libelle_champs() { $this->layout->display_formulaire_conteneur_libelle_champs(); }
    public function display_formulaire_conteneur_champs() { $this->layout->display_formulaire_conteneur_champs(); }
    public function display_formulaire_fin_conteneur_champs() { $this->layout->display_formulaire_fin_conteneur_champs(); }
    public function display_formulaire_css() { $this->layout->display_formulaire_css(); }// a voir
    public function display_formulaire_select_personnalise($params) { $this->layout->display_formulaire_select_personnalise($params); }
    public function display_formulaire_lien_vupload_upload($champ, $obj, $id, $contraintes = null, $form = null) { $this->layout->display_formulaire_lien_vupload_upload($champ, $obj, $id, $contraintes, $form); }
    public function display_formulaire_lien_voir_upload($champ, $obj, $id, $form = null) { $this->layout->display_formulaire_lien_voir_upload($champ, $obj, $id, $form); }
    public function display_formulaire_lien_supprimer_upload($champ, $form = null) { $this->layout->display_formulaire_lien_supprimer_upload($champ, $form); }
    public function display_formulaire_text($params) { $this->layout->display_formulaire_text($params); }
    public function display_formulaire_champs_upload($params) { $this->layout->display_formulaire_champs_upload($params); }
    //
    public function display_tab_lien_onglet_un($param) { $this->layout->display_tab_lien_onglet_un($param); }
    //
    public function display_form_button($params) { $this->layout->display_form_button($params); }
    public function display_form_retour($params) { $this->layout->display_form_retour($params); }
    public function display_form_start_conteneur_onglets_accordion() { $this->layout->display_form_start_conteneur_onglets_accordion(); }
    public function display_form_close_conteneur_onglets_accordion() { $this->layout->display_form_close_conteneur_onglets_accordion(); }
    public function display_form_start_conteneur_chaque_onglet_accordion() { $this->layout->display_form_start_conteneur_chaque_onglet_accordion(); }
    public function display_form_close_conteneur_chaque_onglet_accordion() { $this->layout->display_form_close_conteneur_chaque_onglet_accordion(); }
    public function display_form_lien_onglet_accordion($params) { $this->layout->display_form_lien_onglet_accordion($params); }
    public function display_form_lien_onglet_un($param) { $this->layout->display_form_lien_onglet_un($param); }
    public function display_form_recherche_sousform($param) { $this->layout->display_form_recherche_sousform($param); }
    public function display_form_recherche_sousform_accordion($param) { $this->layout->display_form_recherche_sousform_accordion($param); }
    //
    public function display_password_input_submit() { $this->layout->display_password_input_submit(); }
    //commun
    public function display_stop_fieldset() { $this->layout->display_stop_fieldset(); }
    public function display_stop_legend_fieldset() { $this->layout->display_stop_legend_fieldset(); }
    public function display_start_fieldset($params = array()) { $this->layout->display_start_fieldset($params); }
    //   A VOIR
    public function display_lien($param) { $this->layout->display_lien($param); }
    public function display_lien_retour($param) { $this->layout->display_lien_retour($param); }
    public function display_input($param) { $this->layout->display_input($param); }
    //
    public function display_start_liste_responsive() { $this->layout->display_start_liste_responsive(); }
    public function display_start_block_liste_responsive($nbr_elements) { $this->layout->display_start_block_liste_responsive($nbr_elements); }
    public function display_start_block_liste_responsive_theme_c($nbr_elements) { $this->layout->display_start_block_liste_responsive_theme_c($nbr_elements); }
    public function display_close_block_liste_responsive() { $this->layout->display_close_block_liste_responsive(); }
    public function display_close_liste_responsive() { $this->layout->display_close_liste_responsive(); }
     //
    public function display_start_navbar() { $this->layout->display_start_navbar(); }
    public function display_stop_navbar() { $this->layout->display_stop_navbar(); }

    /**
     * Ouverture d'une balise de formulaire.
     *
     * @param array $params
     *
     * @return void
     */
    function display__form_container__begin($params = null) {
        $this->layout->display__form_container__begin($params);
    }

    /**
     * Fermeture d'une balise de formulaire.
     *
     * @param array $params
     *
     * @return void
     */
    function display__form_container__end($params = null) {
        $this->layout->display__form_container__end($params);
    }

    /**
     * Ouverture d'un conteneur de contrôles de formulaire.
     *
     * @param array $params
     *
     * @return void
     */
    function display__form_controls_container__begin($params = null) {
        $this->layout->display__form_controls_container__begin($params);
    }

    /**
     * Fermeture d'un conteneur de contrôles de formulaire.
     *
     * @param array $params
     *
     * @return void
     */
    function display__form_controls_container__end($params = null) {
        $this->layout->display__form_controls_container__end($params);
    }

    /**
     * Affichage de bouton de soumission de formulaire.
     *
     * @param array $params
     *
     * @return void
     */
    function display__form_input_submit($params = null) {
        $this->layout->display__form_input_submit($params);
    }

    /**
     *
     */
    public function display_list($params = array()) { $this->layout->display_list($params); }
    public function display_link($params = array()) { $this->layout->display_link($params); }


    /**
     *
     */
    private function error($infos = NULL) {
        $this->error = $infos;
        return $infos;
    }

    /**
     *
     */
    public function set_parameter($parameter, $value) { $this->layout->set_parameter($parameter, $value); }

}

/**
 * Définition de la classe 'layout_base'.
 */
class layout_base {

    /**
     *
     */
    var $layout = "base";

    /**
     *
     */
    protected $html_header_displayed = false;
    protected $header_displayed = false;
    protected $footer_displayed = false;
    protected $html_footer_displayed = false;

    /**
     *
     */
    protected $html_head_css = array();
    protected $html_head_js = array();

    /**
     *
     */
    var $parameters = array();
    function get_parameter($parameter) { return (isset($this->parameters[$parameter]) ? $this->parameters[$parameter] : NULL); }
    function set_parameter($parameter, $value) { $this->parameters[$parameter] = $value; }

    /**
     * Utilitaires
     */

    /**
     * Cette méthode permet de transformer une chaine de caractère standard
     * en une chaine utilisable comme sélecteur css. Le principe est de
     * supprimer les espaces, les caractères spéciaux et les accents.
     *
     * @param string $string La chaine de caractère à normaliser
     *
     * @return string La chaine de caractère normalisée
     */
    function normalize_string($string = "") {
        //
        $invalid = array('Š'=>'S', 'š'=>'s', 'Đ'=>'Dj', 'đ'=>'dj', 'Ž'=>'Z',
            'ž'=>'z', 'Č'=>'C', 'č'=>'c', 'Ć'=>'C', 'ć'=>'c', 'À'=>'A', 'Á'=>'A',
            'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A', 'Å'=>'A', 'Æ'=>'A', 'Ç'=>'C', 'È'=>'E',
            'É'=>'E', 'Ê'=>'E', 'Ë'=>'E', 'Ì'=>'I', 'Í'=>'I', 'Î'=>'I', 'Ï'=>'I',
            'Ñ'=>'N', 'Ò'=>'O', 'Ó'=>'O', 'Ô'=>'O', 'Õ'=>'O', 'Ö'=>'O', 'Ø'=>'O',
            'Ù'=>'U', 'Ú'=>'U', 'Û'=>'U', 'Ü'=>'U', 'Ý'=>'Y', 'Þ'=>'B', 'ß'=>'Ss',
            'à'=>'a', 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'ä'=>'a', 'å'=>'a', 'æ'=>'a',
            'ç'=>'c', 'è'=>'e', 'é'=>'e', 'ê'=>'e',  'ë'=>'e', 'ì'=>'i', 'í'=>'i',
            'î'=>'i', 'ï'=>'i', 'ð'=>'o', 'ñ'=>'n', 'ò'=>'o', 'ó'=>'o', 'ô'=>'o',
            'õ'=>'o', 'ö'=>'o', 'ø'=>'o', 'ù'=>'u', 'ú'=>'u', 'û'=>'u', 'ý'=>'y',
            'ý'=>'y', 'þ'=>'b', 'ÿ'=>'y', 'Ŕ'=>'R', 'ŕ'=>'r', "`" => "", "´" => "",
            "„" => "", "`" => "", "´" => "'", "“" => "\"", "”" => "\"",
            "´" => "'", "&acirc;€™" => "'", "{" => "", "~" => "", "–" => "-",
            "’" => "",  "(" => "",  ")" => "", " " => "-", "/"=>"-", "'"=>"_",
            "&" => "", "--" => "-",
        );

        $string = str_replace(array_keys($invalid), array_values($invalid), $string);
        $string = strtolower($string);
        return $string;
    }

    // {{{ STRUCTURE GENERALE DE LA PAGE

    public function display() {
        //
        if ($this->get_parameter("flag") != "nohtml"
            && $this->get_parameter("flag") != "login_and_nohtml"
            && $this->get_parameter("flag") != "login"
            && $this->get_parameter("flag") != "logout"
            && $this->get_parameter("flag") != "anonym") {
            //
            $this->display_html_header();
            //
            if ($this->get_parameter("flag") != "htmlonly"
                && $this->get_parameter("flag") != "htmlonly_nodoctype") {
                //
                $this->display_header();
            }
            //display_button_page_icon_arrow_r
            $this->display_messages();
        }
    }
    /**
     *
     */
    protected function display_html_header_doctype() {
        //
        echo "<!DOCTYPE html>\n";
    }

    /**
     *
     */
    protected function display_html_header_htmltag() {
        //
        echo "<html lang='fr'>\n";
    }

    /**
     * Affiche ou non la balise pour le favicon.
     *
     * Si le paramètre 'favicon' correspond à un fichier existant sur le
     * serveur, alors on affiche la balise link vers le favicon spécifié.
     * Sinon on affiche rien.
     */
    protected function display_html_header_favicon() {
        // Si le path vers le fichier spécifié en paramètre n'existe pas
        // on sort de la méthode sans rien afficher.
        if (file_exists($this->get_parameter("favicon")) !== true) {
            return;
        }
        // Dans tous les autres cas, on affiche la balise.
        printf(
            "\t<link rel='icon' href='%s' />\n",
            $this->get_parameter("favicon")
        );
    }

    /**
     *
     */
    protected function display_html_header_charset() {
        //
        echo "\t<meta http-equiv=\"Content-Type\" ";
        echo "content=\"text/html;charset=".HTTPCHARSET."\" />\n";
    }

    /**
     *
     */
    protected function display_html_header_extrametas() {
        //

    }

    /**
     *
     */
    public function display_html_header() {
        // Si le header HTML n'a pas déjà été affiché
        if ($this->html_header_displayed == false) {
            // Déclaration du doctype
            if ($this->get_parameter("flag") != "nodoctype"
                && $this->get_parameter("flag") != 'htmlonly_nodoctype') {
                //
                $this->display_html_header_doctype();
            }
            // Ouverture de la balise html
            $this->display_html_header_htmltag();
            //
            echo "<head>\n";
            // Gestion du favicon.ico
            $this->display_html_header_favicon();
            // Déclaration du charset
            $this->display_html_header_charset();
            // Affichage du titre
            echo "\t<title>".$this->get_parameter("html_title")."</title>\n";
            // Déclaration des balises méta supplémentaires
            $this->display_html_header_extrametas();

            // Gestion des inclusions des scripts javascript
            $html_head_js = $this->get_parameter("html_head_js");
            if ($html_head_js != null && isset($html_head_js["set"])) {
                foreach ($html_head_js["set"] as $elem) {
                    foreach ($elem as $js) {
                        $this->display_script_js_call($js);
                    }
                }
            } else {
                if ($html_head_js != null && isset($html_head_js["add"])) {
                    foreach ($html_head_js["add"] as $order => $value) {
                        if (!isset($this->html_head_js[$order])) {
                            $this->html_head_js[$order] = array();
                        }
                        $this->html_head_js[$order] = array_merge($this->html_head_js[$order], $value);
                    }
                }
                //
                foreach ($this->html_head_js as $elem) {
                    foreach ($elem as $js) {
                        $this->display_script_js_call($js);
                    }
                }
            }

            // Gestion des inclusions des scripts css
            $html_head_css = $this->get_parameter("html_head_css");
            if ($html_head_css != null && isset($html_head_css["set"])) {
                // On réordonne le tableau par clé dans le cas où l'ordre de la
                // définition ne correspond pas à l'ordre des clés
                ksort($html_head_css["set"]);
                // On boucle sur chaque catégorie puis sur chaque script css
                // de la catégorie pour l'afficher
                foreach ($html_head_css["set"] as $elem) {
                    foreach ($elem as $css) {
                        $this->display_script_css_call($css);
                    }
                }
            } else {
                if ($html_head_css != null && isset($html_head_css["add"])) {
                    foreach ($html_head_css["add"] as $order => $value) {
                        if (!isset($this->html_head_css[$order])) {
                            $this->html_head_css[$order] = array();
                        }
                        $this->html_head_css[$order] = array_merge($this->html_head_css[$order], $value);
                    }
                }
                // On réordonne le tableau par clé dans le cas où l'ordre de la
                // définition ne correspond pas à l'ordre des clés
                ksort($this->html_head_css);
                // On boucle sur chaque catégorie puis sur chaque script css
                // de la catégorie pour l'afficher
                foreach ($this->html_head_css as $elem) {
                    foreach ($elem as $css) {
                        $this->display_script_css_call($css);
                    }
                }
            }

            //
            echo $this->get_parameter("html_head_extras");
            //
            echo "</head>\n";
            // Ouverture de la balise body
            if ($this->get_parameter("html_body") == NULL) {
                echo "<body id=\"".$this->layout."\"";
                //
                echo " class=\"";
                $css_class = "";
                //  Le flag est ajouté comme classe css du body
                if ($this->get_parameter("flag") != NULL) {
                    $css_class .= " ".$this->get_parameter("flag")." ";
                }
                // La première composante du titre de la page
                // est ajoutée comme classe css du body
                $css_mainrubrik = explode(" -> ", $this->get_parameter("page_title"));
                $css_mainrubrik = (isset($css_mainrubrik[0]) ? $css_mainrubrik[0] : "default");
                $css_class .= " ".$this->normalize_string($css_mainrubrik)." ";
                //
                echo trim($css_class);
                echo "\"";
                //
                echo ">\n\n";
            } else {
                echo $this->get_parameter("html_body");
                echo "\n\n";
            }
            //
            $this->html_header_displayed = true;
        }
    }

    /**
     * Permet d'afficher le header, c'est-à-dire le logo, les actions, les
     * raccourcis, le menu, d'ouvrir la section contenu, d'afficher le titre
     * et l'aide si le header HTML a été préalamblement affiche et que le
     * header ne l'a pas été
     */
    public function display_header() {
        // Si le header n'a pas deja ete affiche et si le header HTML a bien
        // ete affiche alors on affiche le header
        if ($this->header_displayed == false
            and $this->html_header_displayed == true) {
            //
            printf(
                '
                <header id="header">
                    <div id="header-left">
                        %s
                        %s
                    </div>
                    <div id="header-right">
                        %s
                        %s
                    </div>
                </header>
                ',
                $this->display_menu_toggle(),
                $this->display_logo(),
                $this->display_actions(),
                $this->display_shortlinks()
            ); 
    
            // MenuW
            // Content
            $this->display_content_start();
            // Titre
            echo "<section>";
            $this->display_page_title();
            // Marqueur : le header est affiche
            $this->header_displayed = true;
        }
    }

    /**
     * Cette méthode permet d'afficher le début de la section contenu
     */
    public function display_content_start() {
        //
        echo "<!-- ########## START CONTENT ########## -->\n";
        echo "<div id=\"content\"";
        echo ">\n\n";
    }

    /**
     * Cette méthode permet d'afficher la fin de la section contenu
     */
    public function display_content_end() {
        //
        echo "\n</div>\n";
        echo "\n</section>\n";
        echo "<!-- ########## END CONTENT ########## -->\n";
    }

    /**
     * Permet de fermer la section contenu et d'afficher le footer qui contient
     * le nom de l'application, le numero de version et les liens presents
     * dans l'attibut footer si le header a ete prealamblement affiche et que
     * le footer ne l'a pas ete
     */
    //
    public function display_footer() {
        // Si le footer n'a pas deja ete affiche et si le header a bien ete
        // affiche alors on affiche le footer
        if ($this->footer_displayed == false
            and $this->header_displayed == true) {
            // Fin du contenu
            $this->display_content_end();
            // Footer
            echo "<!-- ########## START FOOTER ########## -->\n";
            echo "<div id=\"footer\"";
            echo " class=\"ui-widget";
            // XXX
            if (count($this->get_parameter("menu")) == 0) {
                echo " nomenu";
            }
            echo "\"";
            echo ">\n";
            //
            echo "\t<h5 class=\"hiddenStructure\">".__("Actions globales")."</h5>\n";
            echo "\t<span class=\"ui-corner-all ui-widget-content\">\n";

            // Version de l'application
            echo "\t\t".$this->get_parameter('application');
            if ($this->get_parameter("version") != NULL) {
                echo " ".__("Version")." ".$this->get_parameter("version");
            }
            echo "\n";

            //
            foreach ($this->get_parameter("actions_globales") as $link) {

                //
                echo "\t\t&nbsp;|&nbsp;\n";

                //
                $this->display_link($link);

                //
                echo "\n";
            }

            // Fin du footer
            echo "\t</span>\n";
            echo "</div>\n";
            echo "<!-- ########## END FOOTER ########## -->\n";
            // Marqueur : le footer est affiche
            $this->footer_displayed = true;
        }
    }

    /**
     * Permet d'afficher le footer HTML, c'est-à-dire de fermer les balises
     * body et html uniquement si un header html a ete prealamblement affiche
     */
    public function display_html_footer() {
        // Si le footer HTML n'a pas deja ete affiche et si le header HTML a
        // bien ete affiche alors on affiche le footer HTML
        if ($this->html_footer_displayed == false
            and $this->html_header_displayed == true) {
            // Footer HTML
            echo "\n</body>\n";
            echo "</html>";
            // Marqueur : le footer HTML est affiche
            $this->html_footer_displayed = true;
        }
    }

    // }}} STRUCTURE GENERALE DE LA PAGE - END

    function display_script_js_call($js = "") {
        if (file_exists($js) || strpos($js, "http") === 0) {
            // On ajoute le numero de version du logiciel en parametre du fichier
            // pour que le fichier ne soit pas récupéré dans le cache des navigateurs
            // lors d'une mise à jour
            $js .= (strpos($js, "?") === false ? "?" : "&")."v=".urlencode($this->get_parameter("version"));
            //
            echo "\t<script type=\"text/javascript\" src=\"".$js."\"></script>\n";
        }
    }

    function display_script_css_call($css = "", $media = "screen") {
        if (file_exists($css) || strpos($css, "http") === 0) {
            // On ajoute le numero de version du logiciel en parametre du fichier
            // pour que le fichier ne soit pas récupéré dans le cache des navigateurs
            // lors d'une mise à jour
            $css .= (strpos($css, "?") === false ? "?" : "&")."v=".urlencode($this->get_parameter("version"));
            //
            echo "\t<link rel=\"stylesheet\" type=\"text/css\" media=\"".$media."\" href=\"".$css."\" />\n";
        }
    }




    //
    public function display_menu_toggle() {
        if (isset($_SESSION["login"])=== true and $_SESSION['login'] != "") {
            return sprintf('
                <div id="menu-toggle">
                    <input type="checkbox" id="menu-toggle-input">
                    <label id="menu-toggle-label" for="menu-toggle">
                        <i id="menu-toggle-icon" class="ri-menu-fold-line"></i>
                    </label>
                </div>
                ',
            );
        }
    }

    //
    public function display_logo() {
        // WIP : Ajoputer condition pour petit écran pour afficher soit applicaation_logo ou application_logo_responsive
        $logo = $this->get_parameter("logo_responsive");
        return sprintf('
            <div id="logo">
                <a href="%1$s" title="%3$s - %2$s">
                        <img src="%4$s" alt="Logo %3$s"/>
                        <b>
                            %3$s
                        </b>
                </a>
            </div>
            ',
            $this->get_parameter("url_dashboard"),
            __("Tableau de bord"),
            $this->get_parameter("application"),
            $logo,
        );
    }


    public function display_action_login() {
/*         echo "\t\t\t<li class=\"action-login\">";
        echo $_SESSION['login'];
        echo "</li>\n"; */
        if (isset($_SESSION['login'])) {
                    return sprintf('
            <li class="action-login">
                %1$s
            </li>
        ',
        $_SESSION['login']
        );
        }
    }

    public function display_action_collectivite() {
        $collectivite = $this->get_parameter("collectivite");
        $collectivite_name = isset($collectivite["ville"]) ? $collectivite["ville"] : $this->get_parameter("collectivite");
/*         echo "\t\t\t<li class=\"action-collectivite\">";
        if (isset($collectivite["ville"])) {
            echo $collectivite["ville"];
        }
        echo "</li>\n"; */
        return sprintf('
            <li class="action-collectivite">
                %1$s
            </li>
        ',
        $collectivite_name
        );
    }

    public function display_action_extras() {}
    /**
     *
     * @return void
     */
    public function display_actions() {
        $actions_items = array();

         foreach ($this->get_parameter("actions_personnelles") as $key => $value) {
            $item_class = isset($value['class']) ? " ".$value['class'] : "";
            array_push($actions_items,
                sprintf(
                '
                    <li class="actions-list-elem%1$s">
                        %2$s
                    </li> 
                ',
                $item_class,
                $this->display_link($value)

                )
            ); 
        }

        return sprintf(
            //<h5 class="hiddenStructure">%1$s</h5>
            '
            <ul id="actions">
                %2$s
                %3$s
                %4$s
                %5$s

            </ul>
            ',
            __("Actions personnelles"),
            $this->display_action_login(),
            $this->display_action_collectivite(),
            $this->display_action_extras(),
            implode("", $actions_items)
        );
    }


    /**
     *
     */
    function display_shortlinks() {
        $actions_items = array();

        foreach ($this->get_parameter("raccourcis") as $key => $value) {
            $item_class = isset($value['class']) ? " ".$value['class'] : "";
            array_push($actions_items,
                sprintf(
                '
                    <li class="raccourcis-list-elem%1$s">
                        %2$s
                    </li> 
                ',
                $item_class,
                $this->display_link($value)

                )
            ); 
        }

        return sprintf(
            //<h5 class="hiddenStructure">%1$s</h5>
            '
            <ul id="raccourcis">
                %2$s
            </ul>
            ',
            __("Raccourcis"),
            implode("", $actions_items)
        );
    }

    /**
     * Affichage du menu
     */
    public function display_menu() {
        //
        if ($this->get_parameter("menu") == NULL) {
            return;
        }

        // Initialisation des variables de menu
        $compteurMenu = 0;
        $menuOpen = null;

        echo "<!-- ########## START MENU ########## -->\n";
        echo "<aside>";
        echo "<nav id=\"menu\">\n";
        //echo "<h5 class=\"hiddenStructure\">".__("Menu")."</h5>\n";
        
        //
        //echo "<ul id=\"\">\n";
        
        // Boucle sur les rubriques
        foreach ($this->get_parameter("menu") as $m => $menuItem) {
            $title = isset($menuItem['description']) and $menuItem['description'] != "" ?? $menuItem['description'];
            $linksList = array();
            $href = isset($menuItem['href']) and $menuItem['href'] != "" ?? $menuItem['href'];
            //
            $cpt_links = 0;

            foreach ($menuItem['links'] as $link) {
                $menuElement = "";
                if (isset($link["href"])) {
                    $menuElement = sprintf('
                            <li class="">
                                <a href="%s">
                                    %s
                                </a>
                            </li>
                        ',
                        $link['href'] ,
                        $link['title']
                    );
                }  else {
                    $menuElement = sprintf('
                            <h3 class="menu-subtitle">
                                    %s
                            </h3>
                        ',
                        $link['title']
                    );
                };

                array_push($linksList, $menuElement);
            }

            if (isset($menuItem["selected"])) {
                $menuOpen = $m;
            }
            printf('
                <details id="nav-%1$s" class="nav-item">
                    <summary>
                        %1$s
                    </summary>
                    <ul>    
                        %2$s
                    </ul>    
                </details>
                ',
                $menuItem['title'] ,
                implode("", $linksList)
            );
            
        }
        // Fin du menu
        //echo "</ul>\n"; 
        //echo "<span id='menuopen_val'>$menuOpen</span>";
        echo "</nav>\n";
        echo "</aside>";
        // Positionnement d'une variable recuperee en javascript pour ouvrir la rubrique active
        //
        echo "<!-- ########## END MENU ########## -->\n";
    }

    /**
     *
     */
    function display_page_breadcrumbs($page_title = "") {
        //
        if ($page_title == "") {
            $page_title = $this->get_parameter("page_title");
        }
        //
        if (!is_null($page_title) && $page_title != "") {
            //
            echo "<div id=\"title\" class=\"";
            echo $this->get_parameter("style_title");
            echo "\">\n";
            echo "<h2>\n";
            // Remplacement les caracteres -> par une image de fleche
            $ent = str_replace("->", " <span class=\"om-icon om-icon-16 om-icon-fix arrow-right-16\">></span> ", $page_title);
            $ent = str_replace("&nbsp;", " ", $ent);
            // Afichage du titre
            echo "\t".$ent."\n";
            // Fin du title
            echo "</h2>\n";
            echo "</div>\n\n";
        }
    }


    /**
     *
     */
    function display_page_title($page_title = "", $retour_params = []) {
        //
        if ($page_title == "") {
            $page_title = $this->get_parameter("page_title");
        }
        //
        if (!is_null($page_title) && $page_title != "") {
            //
            echo "<div id=\"title\" class=\"";
            echo $this->get_parameter("style_title");
            echo "\">\n";
            echo "<h1 class='content-title'>\n";
            // Remplacement les caracteres -> par une image de fleche
            $ent = str_replace("->", '<i class="ri-arrow-right-s-line"></i>', $page_title);
            $ent = str_replace("&nbsp;", " ", $ent);
            // Afichage du titre
            echo "\t".$ent."\n";
            // Fin du title
            echo "</h1>\n";
            echo "</div>\n\n";
        }
    }

    /**
     *
     */
    function display_page_title_subtext($page_title_subtext = "") {
        //
        if ($page_title_subtext == "") {
            $page_title_subtext = $this->get_parameter("page_title_subtext");
        }
        //
        if (!is_null($page_title_subtext) && $page_title_subtext != "") {
            //
            echo "<div id=\"title_subtext\">\n";
            echo "<h2>\n";
            echo "<small>\n";
            // Afichage du titre
            echo "\t".$page_title_subtext."\n";
            // Fin du title
            echo "</small>\n";
            echo "</h2>\n";
            echo "</div>\n\n";
        }
    }

    /**
     *
     */
    function display_page_description($page_description = "") {
        //
        if ($page_description == "") {
            $page_description = $this->get_parameter("page_description");
        }
        //
        if (!is_null($page_description) && $page_description != "") {
            //
            echo "<div class=\"pageDescription\">\n";
            echo "\t<p>\n";
            echo "\t\t".$page_description."\n";
            echo "\t</p>\n";
            echo "</div>\n";
        }
    }

    function display_page_subtitle($page_subtitle = "") {
        //
        if ($page_subtitle == "") {
            $page_subtitle = $this->get_parameter("page_subtitle");
        }
        //
        if (!is_null($page_subtitle) && $page_subtitle != "") {
            // Title
            echo "<div class=\"subtitle\">\n";
            echo "<h3>\n";
            // Remplacement les caracteres -> par une image de fleche
            $ent = str_replace("->", " <span class=\"om-icon om-icon-16 om-icon-fix arrow-right-16\">></span> ", $page_subtitle);
            $ent = str_replace("&nbsp;", " ", $ent);
            // Afichage du titre
            echo "\t".$ent."\n";
            // Fin du title
            echo "</h3>\n";
            echo "</div>\n\n";
        }
    }

    function display_link_js_close_window($js_function_close = "") {
        //
        if ($js_function_close == "") {
            $js_function_close = "window.close();";
        }
        //
        echo "\n<p class=\"linkjsclosewindow\">";
        echo "<a class=\"linkjsclosewindow\" href=\"#\" ";
        echo "onclick=\"".$js_function_close."\">";
        echo __("Fermer");
        echo "</a>";
        echo "</p>\n";
    }

    /**
     *
     * @return void
     */
    public function display_message($class = "", $message = "", $titre = "") {

        //
        if ($class == "ok") {
            $class = "success";
        }
        //
        echo "\n<div class=\"message ".$class."\">\n";
        echo "<div class=\"message-body\">\n";
        echo $message;
        echo "\n</div>\n";
        echo "</div>\n";

    }

    /**
     *
     * @return void
     */
    function display_messages() {
        foreach ($this->get_parameter("messages") as $message) {
            $this->display_message($message['class'], $message['message']);
        }
        $this->message = array();
    }

    public function display_table_start_class_default($param) {
        // Affichage de la table
        echo "<!-- tab-tab -->\n";
        echo "<table class=\"table tab-tab\">\n";
    }
    public function display_table_start($param) {
        $class=$param['class'];
        // Affichage de la table
        echo "<!-- tab-tab -->\n";
        echo "<table class=\"table ".$class."-tab\">\n";
    }

    public function display_icon($icon, $title) {
        echo "<i class=\"ri-".$icon."\"";
        echo " title=\"".$title."\">";
        echo "</i>";
    }

    // {{{

    /**
     * Cette méthode permet d'afficher le système de pagination d'un tableau.
     * Les paramètres attendus sont :
     * $params = array(
     *     "obj" => ,
     *     "style" => ,
     *     "first" => ,
     *     "last" => ,
     *     "total" => ,
     *     "search" => ,
     *     "previous" => ,
     *     "next" => ,
     * );
     */
    public function display_table_pagination($params) {
        // Affichage du conteneur de message de pagination
        $html_pagination_text = $this->get_html_table_pagination_text($params["first"], $params["last"], $params["total"], $params["search"]);


        // Si il y a une page precedente
        $html_previous_page = '';
        if ($params["previous"] != "") {
            $html_previous_page = $this->get_html_table_pagination_link_to_switch_page(
                $params["previous"],
                'pagination-prev',
                'ui-icon-circle-triangle-w',
                __("Page precedente"),
                $params["onglet"],
                $params["obj"]
            );
        }
        // Si il y a une page suivante
        $html_next_page = '';
        if ($params["next"] != "") {
            $html_next_page = $this->get_html_table_pagination_link_to_switch_page(
                $params["next"],
                'pagination-next',
                'ui-icon-circle-triangle-e',
                __("Page suivante"),
                $params["onglet"],
                $params["obj"]
            );
        }

        // Selecteur de page
        $html_select_page = '';
        if ($params["pagination_select"]["active"] == true) {
            $html_select_page = $this->get_html_table_page_select($params["pagination_select"], $params["onglet"],$params["obj"]);
        }

        printf(
            '<div class="%s-pagination ui-state-default ui-corner-top ui-tabs-selected ui-state-active">
                <div class="pagination-nb">
                    %s
                    %s
                    %s
                </div>
                    %s
                <div class="visualClear"><!-- --></div>
            </div>',
            $params["style"],
            $html_previous_page,
            $html_pagination_text,
            $html_next_page,
            $html_select_page
        );
    }

    /**
     * Renvoie le html d'affichage des icones permettant de changer
     * de page.
     *
     * @param integer $switch : ???
     * @param integer $class : classe du lien de redirection
     * @param integer $class : classe de l'icone associee au lien (< ou >)
     * @param integer $text  : titre de l'element
     * @param string  $onglet : ???
     * @param string  $obj : objet vers lequel est fait la redirection
     * @return string
     */
    public function get_html_table_pagination_link_to_switch_page($switch, $class, $class_icon, $text, $onglet = null, $obj = null) {
        $link = $switch;
        $onclick = '';
        if ($onglet) {
            $link = '#';
            $onclick = sprintf("onclick=\"ajaxIt('%s', '%s');\" ", $obj, $switch);
        }

        return sprintf(
            '<a href="%1$s" %2$stitle="%3$s" class="%4$s">
                <span class="ui-icon %5$s">%3$s</span>
            </a>',
            $link,
            $onclick,
            $text,
            $class,
            $class_icon
        );
    }

    /**
     * Renvoie le html d'affichage du texte du bloc de pagination
     * des listings.
     *
     * Affiche le texte sous la forme :
     *   n - m enregistrement(s) (sur = [valeur de recherche])
     * Avec la partie () affiche si une recherche est effectuee.
     *
     * @param integer $first_index : index du premier element affiche
     * @param integer $last_index : index du dernier element affiche
     * @param integer $total_description : message de description du total (nombre d'element ou autre)
     * @param string  $search_value : recherche effectue
     * @return string
     */
    public function get_html_table_pagination_text($first_index, $last_index, $total_description, $search_value) {
        $search_value_text = '';
        if (! empty($search_value)) {
            $search_value_text = sprintf(' = [%s]', $search_value);
        }

        return sprintf(
            '<span class="pagination-text">
                %d - %d %s %s %s
            </span>',
            $first_index,
            $last_index,
            __("enregistrement(s) sur"),
            $total_description,
            $search_value_text
        );
    }

    /**
     * Renvoie le html d'affichage du select permettant de choisir la
     * page a afficher
     *
     * @param integer $pagination_select : tableau contenant le parametrage du select
     * @param string  $onglet : ???
     * @param string  $obj : objet vers lequel est fait la redirection
     * @return string
     */
    public function get_html_table_page_select($pagination_select, $onglet, $obj) {
        // Preparation du trigger permettant de changer de page
        $onchange = sprintf('onchange="allerpage(\'%s\');" ', $pagination_select["link"]);
        if ($onglet) {
            $onchange = sprintf(
                'onchange="ajaxIt(\'%s\', \'%s\');" ',
                $obj,
                $pagination_select["link"]
            );
        }

        // Preparation du contenu du select
        $options = '';
        for ($i = 1; $i <= $pagination_select["page_number"]; $i++) {
            // Affiche l'option et si on est sur la page correspondante
            // marque la page comme selectionnee
            $options .= sprintf(
                '<option value="%d" %s>%d / %d</option>',
                ($i - 1) * $pagination_select["serie"],
                (($i - 1) * $pagination_select["serie"] == $pagination_select["premier"] ?
                    'selected="selected"' :
                    ''
                ),
                $i,
                $pagination_select["page_number"]
            );
        }
    
        // Renvoie le rendu du selecteur de la page
        return sprintf(<<< HTML
                %s
                &nbsp;%s&nbsp;
                <div class="pagination-select select">
                    <select name="page" size="1" %sclass="champFormulaire">
                        %s
                    </select>
                </div>
                    <script type="text/javascript">
                        function allerpage(link) {
                            location=link.replace(/&amp;/g, "&")
                        }
                    </script>
                %s
            HTML
            ,
            $this->get_html__form_container__begin(array("action" => "")),
            __('Page'),
            $onchange,
            $options,
            $this->get_html__form_container__end()
        );
    }

    //
    public function display_table_search_simple($params) {
        //
        echo "<!-- tab-search -->\n";
        // Affichage de la table
        echo "<div class=\"".$params["style"]."-search flex-form\">\n";
        // Affichage du formulaire
        $this->display__form_container__begin(array(
            "action" =>  $params["form_action"],
            "id" => "f1",
            "name" => "f1",
        ));
        // Affichage du champ permettant la saisie du terme a rechercher
        echo "\t\t<input type=\"text\" name=\"recherche\" ";
        echo "value=\"".$params["search"]."\" ";
        echo "class=\"input champFormulaire\" />\n";
        // Affichage du champ select permettant de choisir le champ sur lequel
        // doit agir la recherche
        echo '<div class="select">';
        echo "\t\t<select name=\"selectioncol\" class=\"champFormulaire\">\n";
        if ($params["column_search_selected_key"] == "") {
            echo "\t\t\t<option value=\"\" selected=\"selected\">".__("Tous")."</option>\n";
            foreach($params["column_search"] as $key => $elem) {
                echo "\t\t\t<option value=\"".$key."\">".$elem."</option>\n";
            }
        } else {
            echo "\t\t\t<option value=\"\">".__("Tous")."</option>\n";
            foreach($params["column_search"] as $key => $elem) {
                if($params["column_search_selected_key"] == $key) {
                    echo "\t\t\t<option value=\"".$key."\" selected=\"selected\">".$elem."</option>\n";
                } else {
                    echo "\t\t\t<option value=\"".$key."\">".$elem."</option>\n";
                }
            }
        }
        echo "\t\t</select>\n";
        echo "</div>";
        // Affichage du bouton de soumission du formulaire
        $this->display__form_input_submit(array(
            "id" => "search-submit",
            "name" => "s1",
            "value" => __("Recherche"),
            "class" => "button",
        ));
        // Fermeture de la balise formulaire
        $this->display__form_container__end();
        // Fermeture de la balise table
        echo "</div>\n";
    }


    public function display_table_global_actions($actions) {
        //
        foreach($actions as $params) {
            //
            if ($params["type"] == "om_validite") {
                // Si le paramètre 'id' est passé alors on compose l'attribut id du lien
                $attr_id = "";
                if (isset($params["id"]) === true) {
                    $attr_id = sprintf(' id="%s"', $params["id"]);
                }
                // On affiche le lien
                printf(
                    '<span class="om_validite_link"><a href="%s"%s>%s</a></span>',
                    $params["link"],
                    $attr_id,
                    $params["title"]
                );
            } elseif ($params["type"] == "edition") {

                echo "<!-- tab-edition -->\n";
                // Ouverture du conteneur
                echo "<div class=\"".$params["style"]."-edition\">\n";
                // Affichage du lien vers le fichier php d'edition pdf
                echo "<a href=\"".$params["link"]."\" ";
                echo "title=\"".$params["title"]."\" ";
                echo "target='_blank'>";
                // Affichage de l'image representant l'edition
                echo "<span class=\"om-icon om-icon-25 print-25\">".__("Edition")."</span>";
                // Fermeture de la balise lien
                echo "</a>";

                // Fermeture du conteneur
                echo "</div>\n";

            } elseif ($params["type"] == "export") {
                echo "<!-- tab-edition -->\n";
                // Ouverture du conteneur
                echo "<div class=\"".$params["style"]."-export\">\n";
                // Affichage du lien vers le fichier php d'edition pdf
                echo "<a href=\"".$params["link"]."\" ";
                echo "title=\"".$params["title"]."\" ";
                echo "target='_blank'>";
                // Affichage de l'image representant l'edition
                echo "<span class=\"om-icon om-icon-25 ".$params['class']."-25\">".__("Edition")."</span>";
                // Fermeture de la balise lien
                echo "</a>";

                // Fermeture du conteneur
                echo "</div>\n";
            }
        }
    }
    // }}}

    // {{{ FORM

    /**
     * @ignore
     */
    function display__form_input_submit($params) {
        echo "<input";
        echo " type=\"submit\"";
        echo " value=\"".$params["value"]."\" ";
        if (isset($params["name"]) && $params["name"] != "") {
            echo " name=\"".$params["name"]."\"";
        }
        if (isset($params["onclick"]) && $params["onclick"] != "") {
            echo " onclick=\"".$params["onclick"]."\"";
        }
        if (isset($params["id"]) && $params["id"] != "") {
            echo " id=\"".$params["id"]."\"";
        }
        echo " class=\"button om-button";
        if (isset($params["class"]) && $params["class"] != "") {
            echo " ".$params["class"]."";
        }
        echo "\"";
        echo " />";
    }

    /**
     * Cette méthode permet d'afficher le bouton de validation du formulaire
     */
    public function display_form_button($params) {
        //
        echo "<input";
        echo " type=\"submit\"";
        echo " value=\"".$params["value"]."\" ";
        if (isset($params["name"]) && $params["name"] != "") {
            echo " name=\"".$params["name"]."\"";
        }
        if (isset($params["onclick"]) && $params["onclick"] != "") {
            echo " onclick=\"".$params["onclick"]."\"";
        }
        echo " class=\"om-button\"";
        echo " />";
    }

    /**
     * Cette méthode permet d'afficher un lien retour
     */
    public function display_form_retour($params) {
        //
        echo "\n";
        //
        echo "<a";
        // Attribut class
        echo " class=\"button retour";
        if (isset($params["class"]) && $params["class"] != "") {
            echo " ".$params["class"];
        }
        echo "\"";
        // Attribut href
        echo " href=";
        echo "\"";
        if (isset($params["href"]) && $params["href"] != "") {
            echo $params["href"];
        }
        echo "\"";
        // Attribut id
        if (isset($params["id"]) && $params["id"] != "") {
            echo " id=";
            echo "\"";
            echo $params["id"];
            echo "\"";
        }
        //
        echo ">";
        //
        echo __("Retour");
        //
        echo "</a>";
        //
        echo "\n";
    }

    /**
     * Cette methode permet d'ouvrir un fieldset
    */
    public function display_formulaire_debutFieldset($params) {
        // Ouverture du fieldset
        echo "      <fieldset";
        echo (isset($params["identifier"]) ? " id=\"".$params["identifier"]."\"" : "");
        echo " class=\"cadre ui-corner-all ui-widget-content ".$params["action2"]."\">\n";
        echo "        <legend class=\"ui-corner-all ui-widget-content ui-state-active\">";
        echo $params["action1"];
        echo "        </legend>\n";
        // Ouverture du conteneur interne du fieldset
        echo "        <div class=\"fieldsetContent\">\n";
    }
    /**
     * Cette methode permet de fermer un fieldset
    */
    public function display_formulaire_finFieldset($params) {
        // Fermeture du fieldset
        echo "          <div class=\"visualClear\"><!-- --></div>\n";
        echo "        </div>\n";
        echo "      </fieldset>\n";
    }
    public function display_formulaire_portlet_start($params = array()) {
        // affichage du portlet d'actions contextuelles
        echo "<div id=\"portlet-actions\" class=\"ui-widget-content ui-corner-all ui-state-default\">";
        echo "<ul class=\"portlet-list\">";
    }
    public function display_formulaire_portlet_end($params = array()) {
        // fermeture du portlet d'actions contextuelles
        echo "</ul>";
        echo "</div>";
    }
    public function display_formulaire_conteneur_libelle_widget($type_champ) {
        //ouverture div contenant  libelle champs
         echo "      <div class=\"field field-type-".$type_champ."\">\n";
    }

    public function display_formulaire_conteneur_libelle_champs() {
        //ouverture conteneur libelle champs
         echo "        <div class=\"form-libelle\">\n";
    }
    public function display_formulaire_conteneur_champs() {
        //ouverture conteneur libelle champs
         echo "        <div class=\"form-content\">\n";
    }
    public function display_formulaire_fin_conteneur_champs() {
        //fin conteneur libelle champs et champs
        echo "        </div>\n";
    }
    public function display_tab_lien_onglet_un($param) {
        // premier onglet
        echo "<ul>\n";
        echo "\t<li><a href=\"#tabs-1\">".$param."</a></li>\n";
        echo "</ul>\n";
    }
    public function display_form_lien_onglet_un($param) {
        // Ouverture de la liste des onglets
        echo "\t<ul>\n";
        // Affichage du premier onglet
        echo "\t\t<li><a id=\"main\" href=\"#tabs-1\">".$param."</a></li>\n";
    }


    public function display_form_start_conteneur_onglets_accordion() {
        // ouverture conteneur onglets sous formulaire
        // affichage en accordeon sous le formulaire
        //echo "<div id=\"accordion\" >";

    }
    public function display_form_close_conteneur_onglets_accordion() {
        // fermeture conteneur onglets sous formulaire
        // affichage en accordeon sous le formulaire
        //echo  "</div>";

    }

    /**
     * Affiche le contenu d'un bouton qui déclenche l'affichage d'un sous
     * formulaire en accordion. Cette méthode est appelée entre :
     * - display_form_start_conteneur_chaque_onglet_accordion()
     * - display_form_close_conteneur_chaque_onglet_accordion()
     *
     * @param array $params
     *
     * @return void
     */
    public function display_form_lien_onglet_accordion($params) {
        printf(
            '
            <legend class="ui-corner-all ui-widget-content ui-state-active">
                <a href="#" onclick="ajaxIt(\'%s\', \'%s\');">%s</a>
            </legend>',
            $params["elem"],
            $params["href"],
            $params["title"]
        );
    }

    public function display_form_start_conteneur_chaque_onglet_accordion() {
        //
        //  conteneur de chaque onglet  accordion
        //
         echo "<div>\n";
         echo "<fieldset class=\"cadre ui-corner-all ui-widget-content collapsed\">\n";
        //
    }
    public function display_form_close_conteneur_chaque_onglet_accordion() {
        //
        //  conteneur de chaque onglet  accordion
        //
        echo "</fieldset>";
        echo  "</div>";

        //
    }
    public function display_form_recherche_sousform($param) {
    //  Affichage de la recherche pour les sous formulaires

        echo "\t\t<li id=\"recherche_onglet\" style=\"display:none;\">\n";
        echo "\t\t\t<span  >\n";
        echo "\t\t\t\t";
        echo "<form action=\"#\">";
        echo "<input  type=\"hidden\" name=\"advs_id\" id=\"advs_id\" ";
        echo "value=\"".$param["advs_id"]."\" class=\"input champFormulaire\" />";
        echo "<input  type=\"text\" name=\"recherchedyn\" id=\"recherchedyn\" ";
        echo "value=\"\" class=\"input champFormulaire\" ";
        echo "onkeyup=\"recherche('".$param["link"]."');\" />";
        echo "</form>";
        echo "\n";
        echo "\t\t\t</span>\n";
        echo "\t\t</li>\n";
    }
    public function display_form_recherche_sousform_accordion($param) {
    //  Affichage de la recherche pour les sous formulaires
        echo "\t\t<li>\n";
        echo "\t\t\t<span  id=\"recherche_onglet\" style=\"display:none;\">\n";
        echo "\t\t\t\t";
        echo "<input  type=\"text\" name=\"recherchedyn\" id=\"recherchedyn\" ";
        echo "value=\"\" class=\"input champFormulaire\" ";
        echo "onkeyup=\"recherche('".$param["link"]."');\" />";
        echo "\n";
        echo "\t\t\t</span>\n";
        echo "\t\t</li>\n";
    }
    public function display_formulaire_css() {
        //
        //   class formulaire
        //
        echo " class=\"'input champFormulaire\" \n";
    }

    /**
     * Affiche un élément cliquable permettant d'accéder à l'écran de
     * téléversement d'un fichier dans le champ passé en paramètre.
     *
     * @param string $champ
     * @param mixed $obj
     * @param mixed $id
     * @param mixed $form
     *
     * @return void
     */
    public function display_formulaire_lien_vupload_upload($champ, $obj = "", $id = "", $configuration = null, $form = null) {
        //
        if ($form === "sousform") {
            $jsfunction = "vupload2";
        } else {
            $jsfunction = "vupload";
        }
        //
        $contraintes = "'',''";
        if (isset($configuration)
            && is_array($configuration)
            && isset($configuration['constraint'])
            && is_array($configuration['constraint'])) {
            //
            if (isset($configuration['constraint']['size_max'])) {
                $contraintes = "'".$configuration['constraint']['size_max']."',";
            } else {
                $contraintes = "'', ";
            }
            //
            if (isset($configuration['constraint']['extension'])) {
                $contraintes .= "'".$configuration['constraint']['extension']."'";
            } else {
                $contraintes .= "''";
            }
        }
        //
        printf(
            '<a class="upload ui-state-default ui-corner-all" href="javascript:%s(\'%s\', %s);">
                <span class="ui-icon ui-icon-arrowthickstop-1-s" title="%s">%s</span>
            </a>
            ',
            $jsfunction,
            $champ,
            $contraintes,
            __("Cliquer ici pour telecharger un fichier depuis votre poste de travail"),
            __("Telecharger")
        );
    }

    /**
     * Affiche un élément cliquable permettant de visualiser le fichier du
     * champ passé en paramètre.
     *
     * @param string $champ
     * @param mixed $obj
     * @param mixed $id
     * @param mixed $form
     *
     * @return void
     */
    public function display_formulaire_lien_voir_upload($champ, $obj = "" , $id = "", $form = null) {
        //
        if ($form === "sousform") {
            $jsfunction = "voir2";
        } else {
            $jsfunction = "voir";
        }
        //
        printf(
            '<a class="voir ui-state-default ui-corner-all" href="javascript:%s(\'%s\', \'%s\', \'%s\');">
                <span class="ui-icon ui-icon-newwin" title="%s">%s</span>
            </a>
            ',
            $jsfunction,
            $champ,
            $obj,
            $id,
            __("Cliquer ici pour voir le fichier"),
            __("Voir")
        );
    }

    /**
     * Function permettant de vider le champ de formulaire upload.
     *
     * @param string $champ champ surlequel ajouter le bouton supprimer
     * @param mixed $form
     *
     * @return void
     */
    public function display_formulaire_lien_supprimer_upload($champ, $form = null) {
        //
        if ($form === "sousform") {
            $jsfunction = "supprimerUpload2";
        } else {
            $jsfunction = "supprimerUpload";
        }
        //
        printf(
            '<a class="upload ui-state-default ui-corner-all" href="javascript:%s(\'%s\');">
                <span class="ui-icon ui-icon-closethick" title="%s">%s</span>
            </a>
            ',
            $jsfunction,
            $champ,
            __("Cliquer ici pour supprimer le fichier"),
            __("Supprimer")
        );
    }

    public function display_password_input_submit() {
        //
        //   bouton  valider password
        //
         echo "<input ";
         echo " type=\"submit\" name=\"submit-change-password\" value=\"".__("Valider")."\" class=\"boutonFormulaire\" />";
        //
    }
    public function display_start_fieldset($params = array()) {
        // Rétro-compatibilité
        if (count($params) == 0) {
            //
            echo "<fieldset class=\"cadre ui-corner-all ui-widget-content collapsible\">\n";
            //
            echo "\t<legend class=\"ui-corner-all ui-widget-content ui-state-active\">";
            //
            return;
        }
        //
        echo "<fieldset";
        if (isset($params["fieldset_class"])) {
            echo " class=\"".$params["fieldset_class"]."\"";
        }
        echo ">";
        echo "<legend";
        if (isset($params["legend_class"])) {
            echo " class=\"".$params["legend_class"]."\"";
        }
        echo ">";
        if (isset($params["legend_content"])) {
            echo $params["legend_content"];
        } else {
            echo "...";
        }
        echo "</legend>";
    }
    public function display_stop_fieldset() {
        //
        //   fiedset
        //
        echo "</fieldset>\n";
        //
    }
    public function display_stop_legend_fieldset() {
        //
        //   fiedset
        //
        echo "</legend>\n";
        //
    }

    /**
     * Affiche un lien.
     *
     * @param $param mixed Tableau de paramètres.
     */
    public function display_lien($params) {
        // XXX Rétro compatibilité
        if (isset($params["lien"])) {
            echo $params["lien"];
            return;
        }
        //
        $this->display_link($params);
    }



    /**
     * Affiche le lien retour présent sur beaucoup de pages de l'applicatif.
     *
     * @param $param mixed Tableau de paramètres.
     */
    public function display_lien_retour($params) {
        // Rétro compatibilité
        if (isset($params["lien"])) {
            echo $params["lien"];
            return;
        }
        //
        $this->display_link(
            array(
                "href" => $params["href"],
                "title" => __("Retour"),
                "class" => "retour",
            )
        );
    }
    public function display_input($param) {
        //
        //   lien
        //
        echo $param['input'];
        //
    }
    public function display_start_liste_responsive() {
        //
        //   liste responsive mobile    - general
        //
        //
    }
    public function display_start_block_liste_responsive($nbr_elements) {
        //
        //   block liste responsive mobile  - general
        //
        echo "<div class=\"choice ui-corner-all ui-widget-content\">\n";
        //
    }
    public function display_start_block_liste_responsive_theme_c($nbr_elements) {
        //
        //   block liste responsive mobile  - general
        //
        echo "<div class=\"choice ui-corner-all ui-widget-content\">\n";
        //
    }
    public function display_close_block_liste_responsive() {
        //
        //   close block liste responsive mobile    - general
        //
        //
        echo "</div>\n";
        //
    }
    public function display_close_liste_responsive() {
        //
        //   close liste responsive mobile  - general
        //
        //
    }
    public function display_start_navbar() {
        //
        //   barre navigation -  mobile
        //
        //
    }
    public function display_stop_navbar() {
        //
        //   barre navigation -  mobile
        //
        //
    }
    public function display_formulaire_select_personnalise($params) {
        //
        //  select
        //
        echo "<select ";
         echo " name='".$params["champ"]."' ";
        echo " id=\"".$params["champ"]."\" ";
        echo " size='1' ";
        echo " class=\"'input champFormulaire\" \n";
        echo " >\n";
       //
        //
    }
    public function display_table_lien_data_colonne_une($params) {
        //
        //   tableau :  lien colonne une -> consulter,.....
        //
        echo "<a ";
        // Gestion de l'attribut HTML "class"
        if (isset($params["class"]) === true and $params["class"] !== "") {
            printf(" class=\"%s\" ", $params["class"]);
        }
        if ($params["onglet"] == false or $params["no_ajax"] == true) {

            echo "href=\"".$params["lien"].urlencode($params["row"]).
                 (isset($params["id"]) ? $params["id"] : "")."\"";
            echo " id=\"".$params["identifier"]."\"";
            // Gestion de l'attribut target
            if (isset($params["target"]) === true and $params["target"] != "") {
                printf(" target=\"%s\" ", $params["target"]);
            }

        // En visualisation par onglet ..
        } else {

            // Gestion de l'attribut target
            if (isset($params["target"]) === true and $params["target"] != "") {

                echo "href=\"".$params["lien"].
                     urlencode($params["row"]).$params["id"]."\"";
                echo " id=\"".$params["identifier"]."\"";
                printf(" target=\"%s\" ", $params["target"]);

            // Sans target, rechargement du bloc en ajax
            } else {
                echo "href=\"";
                echo "#";
                echo "\" ";
                echo " id=\"".$params["identifier"]."\"";
                echo " onclick=\"ajaxIt('";
                echo $params["obj"]."','";
                echo $params["lien"].urlencode($params["row"]);
                echo $params["id"];
                echo "');\"";
            }
        }

        echo ">";
        echo $params["lib"];
        echo "</a>";
        echo "&nbsp;";
        //
    }
    public function display_table_lien_entete_colonne_une($param) {
        //
        //   tableau :  entete -> lien colonne une ->creation...
        //
        echo "<a href=\"";
        if ($param["onglet"]) {
            echo "#";
            echo "\" ";
            echo " onclick=\"ajaxIt('".$param["obj"]."','";
            echo $param["lien"].$param["id"];
            echo "');";
        } else {
            echo $param["lien"].$param["id"];
        }

        echo "\"";
        echo " id=\"".$param["identifier"]."\"";
        echo ">";
        echo $param["lib"];
        echo "</a>";
        //
    }
    public function display_table_cellule_entete_colonnes($param) {
        //
        //   tableau :  cellule entete colonnes...
        //
        echo "\t\t\t<th class=\"title col-". $param["key"]."";
        //
        if ( $param["key"] == 0) {
            echo " firstcol";
        }
        //
        if ( $param["key"] ==  count($param["info"])-1) {
            echo " lastcol";
        }
        // fermeture balise th -  entete table
        echo "\">";
        //
    }
    public function display_formulaire_text($params) {
        //
        //  formulaire champs texte
        //
         echo "<input";
        echo " type=\"".$params["type"]."\"";
        echo " name=\"".$params["name"]."\"";
        echo " id=\"".$params["id"]."\" ";
        echo " value=\"".$params["value"]."\"";
        echo " size=\"".$params["size"]."\"";
        echo " maxlength=\"".$params["maxlength"]."\"";
        echo " class=\"input champFormulaire\"";
        if (!$params["correct"]) {
            if ($params["onchange"] != "") {
                echo $params["onchange"];
            }
            if ( $params["onkeyup"] != "") {
                echo $params["onkeyup"];
            }
            if ($params["onclick"] != "") {
                echo  $params["onclick"];
            }
        } else {
            echo " disabled=\"disabled\"";
        }
       //
        echo " />\n";
       //
    }
    public function display_formulaire_champs_upload($params) {
        //
        //  formulaire champs bouton upload
        //
     echo "<input type=\"text\"";
        echo " name=\"".$params["name"]."_upload\"";
        echo " id=\"".$params["id"]."_upload\" ";
        if ($params["value"] != "") {
            echo $params["value"];
        } else {
            echo " value=\"\" ";
        }

        echo " class=\"input champFormulaire upload\"";
        if (!$params["correct"]) {
            if ($params["onchange"] != "") {
                echo $params["onchange"];
            }
            if ( $params["onkeyup"] != "") {
                echo $params["onkeyup"];
            }
            if ($params["onclick"] != "") {
                echo  $params["onclick"];
            }
        } else {
            echo " disabled=\"disabled\"";
        }
        echo " />\n";
       //
    }
    public function display_start_regroup_horizontal() {
        // regroupement bouton - uiliser pour mobile
    }
    public function display_stop_regroup_horizontal() {
        // regroupement bouton - uiliser pour mobile
    }

    // {{{

    /**
     *
     */
    function display_list($params) {
        //
        if (isset($params["title"])) {
            echo $params["title"];
        }
        //
        echo "<ul>";
        //
        foreach($params["list"] as $key => $value) {
            //
            echo "<li>";
            //
            $this->display_link($value);
            //
            if (isset($value["links"]) && is_array($value["links"]) && count($value["links"]) > 0) {
                //
                foreach ($value["links"] as $link) {
                    //
                    $this->display_link($link);
                }
            }
            //
            echo "</li>";
        }
        echo "</ul>";
    }

    /**
     * Affiche un lien.
     *
     * @param $param mixed Tableau de paramètres.
     */
    public function display_link($params) {
        //
        $isset_href = isset($params['href']);
        $title = isset($params['description']) ? $params['description'] : "";
        $class = isset($params['class']) ? $params['class'] : "";
        $target = isset($params['target']) ? $params['target'] : "";
        $id = isset($params['id']) ? $params['id'] : "";

        if (isset($params['href'])) {
            return sprintf(
                '
                <a
                    href="%1$s"
                    id="%2$s"
                    class="%3$s"
                    target="%4$s"
                    title="%5$s"
                >
                %6$s
                </a>
                ',
                $params['href'],
                $id,
                $class,
                $target,
                $title,
                $params['title'],

            );
        }
    }

    // }}}

    /**
     * @ignore
     */
    function display__form_container__begin($params = null) {
        echo $this->get_html__form_container__begin($params);
    }

    /**
     * @ignore
     */
    public function get_html__form_container__begin($params = null) {
        //
        $attributes = array("class", "enctype", "id", "name", "onsubmit", "target", );
        foreach ($attributes as $attribute) {
            if (isset($params[$attribute])) {
                ${$attribute} = sprintf(
                    ' %s="%s"',
                    $attribute,
                    $params[$attribute]
                );
            } else {
                ${$attribute} = "";
            }
        }
        //
        return sprintf(
            '<form method="post" action="%s"%s%s%s%s%s%s>',
            $params["action"],
            $class,
            $enctype,
            $id,
            $name,
            $onsubmit,
            $target
        );
    }

    /**
     * @ignore
     */
    function display__form_container__end($params = null) {
        echo $this->get_html__form_container__end();
    }

    /**
     * @ignore
     */
    public function get_html__form_container__end() {
        return sprintf(
            '</form>'
        );
    }

    /**
     * @ignore
     */
    function display__form_controls_container__begin($params = null) {
        printf(
            '<div class="formControls">'
        );
    }

    /**
     * @ignore
     */
    function display__form_controls_container__end($params = null) {
        printf(
            '</div>'
        );
    }

}
