noalyss-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Noalyss-commit] [noalyss] 08/26: Task #0002050: Mobile : menu différent


From: Dany De Bontridder
Subject: [Noalyss-commit] [noalyss] 08/26: Task #0002050: Mobile : menu différent
Date: Wed, 11 Aug 2021 11:08:10 -0400 (EDT)

sparkyx pushed a commit to branch master
in repository noalyss.

commit b9744170845f02fa1a79901e7e390c25251a2200
Author: sparkyx <danydb@noalyss.eu>
AuthorDate: Thu Jul 29 18:04:25 2021 +0200

    Task #0002050: Mobile : menu différent
---
 html/ajax_misc.php                                 |    4 +-
 html/css/style-classic7.css                        |  125 +-
 html/js/gestion.js                                 |    1 -
 html/js/noalyss_script.js                          |    2 +-
 html/login.php                                     |   33 +-
 html/mobile.php                                    |  100 +
 include/ajax/ajax_get_profile.php                  |   11 +-
 include/ajax/ajax_mobile_device_menu.php           |   66 +
 include/calendar.inc.php                           |    4 +-
 include/class/calendar.class.php                   |    3 +-
 include/class/mobile.class.php                     |  239 ++
 include/class/mobile_device_mtable.class.php       |  153 ++
 include/class/profile_menu.class.php               |   24 +-
 include/class/user.class.php                       | 2621 ++++++++++----------
 include/constant.php                               |    8 +-
 include/database/profile_menu_sql.class.php        |    4 +-
 ..._sql.class.php => profile_mobile_sql.class.php} |   67 +-
 include/lib/message_javascript.php                 |    2 +-
 include/profile.inc.php                            |    5 +-
 include/sql/patch/upgrade163.sql                   |   22 +
 include/template/calendar.php                      |   22 +-
 include/template/mobile-display_menu.php           |   69 +
 22 files changed, 2233 insertions(+), 1352 deletions(-)

diff --git a/html/ajax_misc.php b/html/ajax_misc.php
index b764655..5d4ebf2 100644
--- a/html/ajax_misc.php
+++ b/html/ajax_misc.php
@@ -309,7 +309,9 @@ $path = array(
     // report definition 
     "report_definition"=>"ajax_report_definition",
     // search all card , analytic or accounting
-    "search_account_card"=>"ajax_search_account_card"
+    "search_account_card"=>"ajax_search_account_card",
+    // Mobile device menu from mobile_device_mtable
+    "mobile_device_menu"=>"ajax_mobile_device_menu"
 )    ;
 
 if (array_key_exists($op, $path)) {
diff --git a/html/css/style-classic7.css b/html/css/style-classic7.css
index ba1352d..498c084 100644
--- a/html/css/style-classic7.css
+++ b/html/css/style-classic7.css
@@ -563,23 +563,53 @@ select {
     padding: 3px;
 }
 
+.infobulle {
+        position:absolute;
+        border:1px solid #000000;
+        background-color:#FCFFCC;
+        padding-bottom: 10px;
+        padding-top: 10px;
+        padding-left: 10px;
+        padding-right: 10px;
+        color:#000000;
+        top:0px;left:0px;
+        visibility:hidden;
+        width:80%;
+        z-index:20;
+    }
+/* SM */
+@media (min-width: 576px) {
 
+    .infobulle {
+        position:absolute;
+        border:1px solid #000000;
+        background-color:#FCFFCC;
+        padding-bottom: 10px;
+        padding-top: 10px;
+        padding-left: 10px;
+        padding-right: 10px;
+        color:#000000;
+        top:0px;left:0px;
+        visibility:hidden;
+        width:400px;
+        width:25rem;
+        z-index:20;
+    }
+}
+/* MD */
+@media (min-width: 768px) {
 
-.infobulle {
-    position:absolute;
-    border:1px solid #000000;
-    background-color:#FCFFCC;
-    padding-bottom: 10px;
-    padding-top: 10px;
-    padding-left: 10px;
-    padding-right: 10px;
-    color:#000000;
-    top:0px;left:0px;
-    visibility:hidden;
-    width:400px;
-    width:25rem;
-    z-index:20;
 }
+/* LG */
+@media (min-width: 992px) {
+
+}
+/* XL */
+@media (min-width: 1200px) {
+
+}
+/**========*/
+
 
 span.action {
     height:48px;
@@ -1593,7 +1623,44 @@ div#bookmark_div {
    left:30%;
    width:40%;
 }
+#error_div{
+    position:absolute;
+    border:1px solid #000000;
+    background-color:#DDE6FF;
+    padding-bottom: 2px;
+    padding-top: 2px;
+    padding-left: 2px;
+    padding-right: 2px;
+    color:#FF0000;
+    top:14%;left:2%;
+    visibility:hidden;
+    z-index:20;
+}
+/* SM */
+@media (min-width: 576px) {
+#error_div{
+    position:absolute;
+    border:1px solid #000000;
+    background-color:#DDE6FF;
+    padding-bottom: 2px;
+    padding-top: 2px;
+    padding-left: 2px;
+    padding-right: 2px;
+    color:#FF0000;
+    top:40%;left:25%;
+    visibility:hidden;
+    width:640px;
+    width:40rem;
+    z-index:20;
+}
 
+}
+/* MD */
+@media (min-width: 768px) {
+
+}
+/* LG */
+@media (min-width: 992px) {
 #error_div{
     position:absolute;
     border:1px solid #000000;
@@ -1609,6 +1676,13 @@ div#bookmark_div {
     width:40rem;
     z-index:20;
 }
+}
+/* XL */
+@media (min-width: 1200px) {
+
+}
+/**========*/
+
 #error_div h2 {
     background: #FF0000;
 }
@@ -2960,7 +3034,7 @@ span.tagcell {
     color:white;
 }
 .nav-pills .nav-link.active {
-    background-color: #70829d !important;
+    background-color: hsl(224, 42%, 51.7%) !important;
      border-radius: 0px;
 } 
 .nav-pills .nav-link {
@@ -2972,7 +3046,7 @@ li.li-active {
     
 }
 .nav-level2 {
-    background-color: #0b2d99;
+   background-color: hsl(240, 39%, 41.2%);
 }
 .nav-level2>li {
     border-right: 1px #9fbcd6 ridge;
@@ -3027,3 +3101,22 @@ li.li-active {
     color:white !important;
     border: 0px solid black;
 }
+/**
+ * Module for smartphone menu
+ */
+#mobile_module .nav-pills a.nav-link {
+    background-color:transparent !important;
+    color:navy !important;
+    border:1px solid blue;
+    margin:0px;
+    border-radius: 0px;
+   }
+#mobile_module .nav-pills a.nav-link:hover {
+    background-color: navy !important;
+    color:white !important;
+    border-radius: 0px;
+}
+#mobile_module h1 {
+    text-align: center;
+    font-weight: 700;
+}
\ No newline at end of file
diff --git a/html/js/gestion.js b/html/js/gestion.js
index 8356570..dec6e83 100644
--- a/html/js/gestion.js
+++ b/html/js/gestion.js
@@ -312,7 +312,6 @@ function action_add(p_dossier) {
                  if (p_xml.responseText === 'NOCONX') { reconnect();return;}
                         remove_waiting_box();
                         add_div({id: 'action_add_div',
-                            style:"top:1%;width:80%;left:10%" , 
                             cssclass: 'inner_box'});
                         $('action_add_div').innerHTML=p_xml.responseText;
                         p_xml.responseText.evalScripts();
diff --git a/html/js/noalyss_script.js b/html/js/noalyss_script.js
index 912fa10..15a9c60 100644
--- a/html/js/noalyss_script.js
+++ b/html/js/noalyss_script.js
@@ -2034,7 +2034,7 @@ function show_fin_chdate(obj_id)
 function profile_show(p_div)
 {
     try {
-        var div = ['profile_gen_div', 'profile_menu_div', 'profile_print_div', 
'profile_gestion_div', 'profile_repo_div'];
+        var div = ['profile_gen_div', 'profile_menu_div', 'profile_print_div', 
'profile_gestion_div', 'profile_repo_div','profile_menu_mobile_div'];
         for (var r = 0; r < div.length; r++) {
             $(div[r]).hide();
         }
diff --git a/html/login.php b/html/login.php
index 3e4ab0b..70ce7dd 100644
--- a/html/login.php
+++ b/html/login.php
@@ -25,7 +25,7 @@ include_once NOALYSS_INCLUDE.'/lib/ac_common.php';
  * \brief Login page
  */
 
-require_once NOALYSS_INCLUDE.'/class/database.class.php';
+
 // Verif if User and Pass match DB
     // if no, then redirect to the login page
 $rep=new Database();
@@ -37,11 +37,9 @@ if (defined('MULTI') && MULTI == 0)
 
 if (  isset ($_POST["p_user"] ) )
 {
-    $g_user=strtolower(sql_string($_POST["p_user"]));
-    $g_pass=$_POST["p_pass"];
-    $_SESSION[SESSION_KEY.'g_user']=$g_user;
-    $_SESSION[SESSION_KEY.'g_pass']=$g_pass;
 
+    $User=new User($rep);
+    $User->Check(false,'LOGIN');
 
 
     /*
@@ -57,9 +55,6 @@ if (  isset ($_POST["p_user"] ) )
         echo "<META HTTP-EQUIV=\"REFRESH\" 
content=\"3;url=admin-noalyss.php??action=upgrade&sb=database\">";
         exit();
     }
-    require_once NOALYSS_INCLUDE."/class/user.class.php";
-    $User=new User($rep);
-    $User->Check(false,'LOGIN');
     if (defined('NOALYSS_CAPTCHA') && NOALYSS_CAPTCHA==true) 
     {
           include("securimage/securimage.php");
@@ -70,15 +65,21 @@ if (  isset ($_POST["p_user"] ) )
           echo alert(_('Code invalide'));
           echo "<META HTTP-EQUIV=\"REFRESH\" content=\"0;url=index.php\">";
           exit();
+        }
       }
+      if ($User->get_access_mode()=='PC')
+      {
+        // force the nocache
+        $backurl='user_login.php?v='.microtime(true);
+        if ( isset ($_POST['backurl'])) {
+              $backurl=urldecode($_POST['backurl']);
+          }
+        echo "<META HTTP-EQUIV=\"REFRESH\" content=\"0;url={$backurl}\">";
+        exit();
+      } else {
+           echo "<META HTTP-EQUIV=\"REFRESH\" content=\"0;url=mobile.php\">";
+           exit();
       }
-    // force the nocache
-    $backurl='user_login.php?v='.microtime(true);
-    if ( isset ($_POST['backurl'])) {
-          $backurl=urldecode($_POST['backurl']);
-      }
-    echo "<META HTTP-EQUIV=\"REFRESH\" content=\"0;url={$backurl}\">";
-    exit();
 }
 else
 {
@@ -99,8 +100,6 @@ else
 
       }
 
-    include_once ("class/user.class.php");
-
     $User=new User($rep);
     $User->Check();
 
diff --git a/html/mobile.php b/html/mobile.php
new file mode 100644
index 0000000..7fc7ea7
--- /dev/null
+++ b/html/mobile.php
@@ -0,0 +1,100 @@
+<?php
+
+/*
+ *   This file is part of NOALYSS.
+ *
+ *   PhpCompta is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   PhpCompta is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with PhpCompta; if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+// Copyright (2002-2021) Author Dany De Bontridder <danydb@noalyss.eu>
+
+/**
+ * @file
+ * @brief only for mobile device
+ */
+ 
+require_once '../include/constant.php';
+global $g_user;
+
+$cn=new Database();
+$g_user=new \User($cn);
+$g_user->check();
+define ('ALLOWED',true);
+
+//-----------------------------------------------------------------
+/// if $_REQUEST['gDossier'] is not set then select the folder
+//-----------------------------------------------------------------
+$http=new HttpInput();
+
+$dossier_id=$http->request("gDossier","number",-1);
+if ($dossier_id === -1) {
+    // count the available folder
+    $cnt_folder=$g_user->get_available_folder();
+    
+    // if there is no available folder , then exit
+    if ($cnt_folder==0) {
+        echo _("Aucun dossier disponible");
+        redirect(NOALYSS_URL."/index.php", 3);
+        return;
+    }
+    if (count($cnt_folder ) == 1) {
+        // if only one folder available , connect to it
+        $dossier_id=$cnt_folder[0]['dos_id'];
+        put_global(array(['key'=>'gDossier',"value"=>$dossier_id]));
+    } else {
+        $mobile=new \Noalyss\Mobile();
+        //-----------------------------------------------------------------
+        // --- load the javascript and start a page ----------------------
+        //-----------------------------------------------------------------
+        $mobile->page_start();
+        // propose to select the available folder
+        echo '<ul class="nav bg-light flex-column">';
+        foreach ($cnt_folder as $folder) 
+        {
+            echo '<li>';
+            echo '<a class="nav-item nav-link " 
href="mobile.php?gDossier='.$folder['dos_id'].'">';
+            echo $folder['dos_id']." ".$folder['dos_name']." 
".$folder["dos_description"];
+            echo '</a>';
+            echo '</li>';
+        }
+        echo '</ul>';
+        return;
+    }
+    
+}
+// we are connected to a folder 
+global $g_user,$cn;
+$cn=Dossier::connect();
+$g_user->setDb($cn);
+
+global $g_parameter;
+$g_parameter=new Noalyss_Parameter_Folder($cn);
+$mobile=new \Noalyss\Mobile();
+
+$ac=trim($http->request("ac","string",""));
+
+//-----------------------------------------------------------------
+/// If a module is selected the execute it
+//-----------------------------------------------------------------
+if ( $ac !== "" && $g_user->check_module($ac) == 1) {
+    
+    // if $ac is in the mobile profile then execute it
+    $mobile->execute_menu($ac);
+} else {
+//-----------------------------------------------------------------
+/// inside a folder , propose a menu 
+//-----------------------------------------------------------------
+     $mobile->page_start();
+    $mobile->display_menu();
+}
diff --git a/include/ajax/ajax_get_profile.php 
b/include/ajax/ajax_get_profile.php
index 9379482..270978e 100644
--- a/include/ajax/ajax_get_profile.php
+++ b/include/ajax/ajax_get_profile.php
@@ -39,18 +39,19 @@ $profile=new Profile_sql($cn,$p_id);
 $gDossier=Dossier::id();
 $add_impression=HtmlInput::button("add", _("Ajout 
Menu"),"onclick=\"add_menu({dossier:$gDossier,p_id:$p_id,type:'pr'})\"");
 $call_tab=$http->post('tab', "string",'profile_gen_div');
-$a_tab=array('profile_gen_div'=>'tabs','profile_menu_div'=>'tabs','profile_print_div'=>'tabs','profile_gestion_div'=>'tabs','profile_repo_div'=>'tabs');
+$a_tab=array('profile_gen_div'=>'tabs','profile_menu_div'=>'tabs','profile_print_div'=>'tabs','profile_gestion_div'=>'tabs','profile_repo_div'=>'tabs',"profile_menu_mobile_div"=>"tabs");
 $a_tab[$call_tab]='tabs_selected';
 ?>
 <h1>Profil <?php echo $profile->p_name?></h1>
 <?php
-    echo HtmlInput::anchor(_('Retour'), "", " onclick = \" 
$('detail_profile').hide();$('list_profile').show(); \" ", 'class="line"');
+    echo HtmlInput::anchor("&#10094;"._('Retour'), "", " onclick = \" 
$('detail_profile').hide();$('list_profile').show(); \" ", 'class="line"');
 ?>
 <?php if ($p_id > 0 ) : ?>
 <ul class="tabs">
     
     <li class="<?php echo $a_tab['profile_gen_div']?>"><a 
href="javascript:void(0)"  
onclick="unselect_other_tab(this.parentNode.parentNode);this.parentNode.className='tabs_selected';profile_show('profile_gen_div')"><?php
 echo _('Nom')?></a></li>
     <li class="<?php echo $a_tab['profile_menu_div']?>"><a 
href="javascript:void(0)"  
onclick="unselect_other_tab(this.parentNode.parentNode);this.parentNode.className='tabs_selected';profile_show('profile_menu_div')"><?php
 echo _('Détail Menus')?></a></li>
+    <li class="<?php echo $a_tab['profile_menu_mobile_div']?>"><a 
href="javascript:void(0)"  
onclick="unselect_other_tab(this.parentNode.parentNode);this.parentNode.className='tabs_selected';profile_show('profile_menu_mobile_div')"><?php
 echo _('Menu SmartPhone')?></a></li>
     <li class="<?php echo $a_tab['profile_print_div']?>"><a 
href="javascript:void(0)" 
onclick="unselect_other_tab(this.parentNode.parentNode);this.parentNode.className='tabs_selected';profile_show('profile_print_div')"><?php
 echo _('Détail Impressions')?></a></li>
     <li class="<?php echo $a_tab['profile_gestion_div']?>"><a 
href="javascript:void(0)" style="" 
onclick="unselect_other_tab(this.parentNode.parentNode);this.parentNode.className='tabs_selected';profile_show('profile_gestion_div')"><?php
 echo _('Groupe Gestion')?> </a></li>
     <li class="<?php echo $a_tab['profile_repo_div']?>"><a 
href="javascript:void(0)"  
onclick="unselect_other_tab(this.parentNode.parentNode);this.parentNode.className='tabs_selected';profile_show('profile_repo_div')"><?php
 echo _('Dépôts')?></a>&nbsp;
@@ -112,6 +113,12 @@ if ($profile->p_id > 0)
         $profile_menu->p_id=$p_id;
        $profile_menu->display_profile_menu_detail();
         echo '</div>';
+        
+        
+        echo '<div class="myfieldset" style="display:none" 
id="profile_menu_mobile_div">';
+        $profile_menu->mobile_device();
+        echo '</div>';
+        
         echo '<div class="myfieldset"  style="display:none" 
id="profile_print_div">';
        echo "<h1 class=\"legend\">"._("Impression")."</h1>";
        $profile_menu->printing();
diff --git a/include/ajax/ajax_mobile_device_menu.php 
b/include/ajax/ajax_mobile_device_menu.php
new file mode 100644
index 0000000..14fc61a
--- /dev/null
+++ b/include/ajax/ajax_mobile_device_menu.php
@@ -0,0 +1,66 @@
+<?php
+
+/*
+ *   This file is part of NOALYSS.
+ *
+ *   PhpCompta is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   PhpCompta is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with PhpCompta; if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+// Copyright (2002-2021) Author Dany De Bontridder <danydb@noalyss.eu>
+
+if (!defined('ALLOWED'))
+    die('Appel direct ne sont pas permis');
+
+/**
+ * @file
+ * @brief callback script for mobile_device_mtable
+ * @see Mobile_Device_MTable
+ */
+$http=new HttpInput();
+try
+{
+    $table=$http->request('table');
+    $action=$http->request('action');
+    $p_id=$http->request('p_id', "number");
+    $ctl_id=$http->request('ctl');
+    $profile_id=$http->request("profile_id","number");
+}
+catch (Exception $e)
+{
+    echo $e->getMessage();
+    return;
+}
+
+$object= Mobile_Device_MTable::build($p_id,$profile_id);
+$object->set_profile_id($profile_id);
+$object->set_object_name($ctl_id);
+$object->send_header();
+switch ($action)
+{
+    case "input":
+        echo $object->ajax_input()->saveXML();
+        break;
+
+    case "save":
+        echo $object->ajax_save()->saveXML();
+        break;
+
+    case "delete":
+        echo $object->ajax_delete()->saveXML();
+        break;
+
+    default:
+        
+        break;
+}
\ No newline at end of file
diff --git a/include/calendar.inc.php b/include/calendar.inc.php
index 17c671d..50e3242 100644
--- a/include/calendar.inc.php
+++ b/include/calendar.inc.php
@@ -7,9 +7,9 @@
  * @brief show the calendar
  */
 if ( ! defined ('ALLOWED') ) die('Appel direct ne sont pas permis');
-
+$http=new HttpInput();
 $cal=new Calendar();
-$cal->default_periode=(isset ($_GET['in']))?$_GET['in']:$g_user->get_periode();
+$cal->default_periode=(isset 
($_GET['in']))?$http->get("in","number"):$g_user->get_periode();
 
 ?>
 <div id="calendar_zoom_div">
diff --git a/include/class/calendar.class.php b/include/class/calendar.class.php
index 58aa9e1..e7fa774 100644
--- a/include/class/calendar.class.php
+++ b/include/class/calendar.class.php
@@ -152,7 +152,8 @@ class Calendar
             }
         }
     }
-    /*!\brief display a calendar after a call to Calendar::fill
+    /*!
+     *\brief display a calendar after a call to Calendar::fill
      *\param $p_type long or short
      * 
      *\return HTML String
diff --git a/include/class/mobile.class.php b/include/class/mobile.class.php
new file mode 100644
index 0000000..e882f7d
--- /dev/null
+++ b/include/class/mobile.class.php
@@ -0,0 +1,239 @@
+<?php
+
+/*
+ *   This file is part of NOALYSS.
+ *
+ *   PhpCompta is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   PhpCompta is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with PhpCompta; if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+// Copyright (2002-2021) Author Dany De Bontridder <danydb@noalyss.eu>
+
+namespace Noalyss;
+
+use \HtmlInput;
+use \Dossier;
+use \User;
+
+/**
+ * @file
+ * @brief Main class for Mobile device 
+ */
+
+/**
+ * @class Mobile
+ * @brief Main class for Mobile device
+ */
+class Mobile
+{
+    /**
+     * @brief Load a module with all its data from database thanks the 
access_code
+     * @global \Noalyss\type $g_user
+     * @param type $p_access_code
+     * @return type
+     */
+
+    function load_module($p_access_code)
+    {
+        global $g_user;
+        $cn=Dossier::connect();
+        $aModule=$cn->get_row("
+        select 
+            me_file,me_parameter,me_javascript,me_type,menu_ref.me_code,
+            pmo_id,pmo_order,pmo_default
+        from menu_ref
+        join profile_mobile using (me_code)
+        where
+            me_code=$1 and
+            (me_file is not null or trim(me_file) <>'' or
+            me_javascript is not null or trim (me_javascript) <> '')
+            and profile_mobile.p_id=$2", 
+                array($p_access_code,$g_user->get_profile()));
+
+        if (count($aModule)==0)
+        {
+            return [];
+        }
+        return $aModule;
+    }
+    /**
+     * @brief HTML Page 
+     * @staticvar int $already_call
+     * @return type
+     */
+    function page_start()
+    {
+        // check not called twiced
+        static $already_call=0;
+        if ($already_call==1)
+            return;
+        $already_call=1;
+
+        $style="style-classic7.css";
+
+        $title="NOALYSS";
+        echo '<!doctype html>';
+        printf("\n");
+
+        echo "<HTML>";
+
+        echo "<HEAD>";
+        echo '<meta charset="utf-8">';
+        echo "<META http-equiv=\"Content-Type\" content=\"text/html; 
charset=UTF-8\">";
+        echo "
+        <TITLE>$title</TITLE>
+       <link rel=\"icon\" type=\"image/ico\" href=\"favicon.ico\" />
+    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">
+    <LINK id=\"bootstrap\" REL=\"stylesheet\" type=\"text/css\" 
href=\"css/bootstrap.min.css\" media=\"screen\"/>
+    <LINK id=\"fontello\" REL=\"stylesheet\" type=\"text/css\" 
href=\"css/font/fontello/css/fontello.css\" media=\"screen\"/>
+    <LINK id=\"pagestyle\" REL=\"stylesheet\" type=\"text/css\" 
href=\"css/".$style."?version=".SVNINFO."\" media=\"screen\"/>
+    <link rel=\"stylesheet\" type=\"text/css\" 
href=\"css/style-print.css?version=".SVNINFO."\" media=\"print\"/>";
+
+        // preload font
+        echo '<link rel="preload" href="./css/font/OpenSansRegular.woff" 
as="font" crossorigin="anonymous" />';
+        echo '<link rel="preload" 
href="./css/font/SansationLight/SansationLight.woff" as="font" 
crossorigin="anonymous" />';
+        echo '<link rel="preload" href="./css/font/fontello/fontello.woff" 
as="font" crossorigin="anonymous" />';
+
+        echo '<script language="javascript" src="js/calendar.js"></script>
+        <script type="text/javascript" src="js/lang/calendar-en.js"></script>';
+
+        if 
(isset($_SESSION[SESSION_KEY.'g_lang'])&&$_SESSION[SESSION_KEY.'g_lang']=='fr_FR.utf8')
+        {
+            echo '<script type="text/javascript" 
src="js/lang/calendar-fr.js"></script>';
+        }
+        elseif 
(isset($_SESSION[SESSION_KEY.'g_lang'])&&$_SESSION[SESSION_KEY.'g_lang']=='nl_NL.utf8')
+        {
+            echo '<script type="text/javascript" 
src="js/lang/calendar-nl.js"></script>';
+        }
+
+        echo '
+        <script language="javascript" src="js/calendar-setup.js"></script>
+        <LINK REL="stylesheet" type="text/css" href="css/calendar-blue.css" 
media="screen">
+        ';
+        // language
+        if (isset($_SESSION[SESSION_KEY.'g_lang']))
+        {
+            set_language();
+        }
+
+        echo load_all_script();
+        echo '    </HEAD>    ';
+
+        echo "<BODY>";
+        echo '<div id="info_div"></div>';
+        echo '<div id="error_div">'.
+        HtmlInput::title_box(_("Erreur"), 'error_div', 'hide').
+        '<div id="error_content_div">'.
+        '</div>'.
+        '<p style="text-align:center">'.
+        HtmlInput::button_action('Valider',
+                
'$(\'error_div\').style.visibility=\'hidden\';$(\'error_content_div\').innerHTML=\'\';').
+        '</p>'.
+        '</div>';
+    }
+
+    /**
+     * @brief Display the menu available for this folder 
+     * 
+     */
+    public function display_menu()
+    {
+        if (DEBUGNOALYSS>1)
+        {
+            echo __CLASS__."&rarr;".__FUNCTION__;
+        }
+        $cn=Dossier::connect();
+        $user=new User($cn);
+
+        $aModule=$cn->get_array("select * 
+            from profile_mobile pm 
+            join menu_ref mr on (pm.me_code=mr.me_code)
+                where p_id=$1 order by pmo_order", [$user->get_profile()]);
+        require_once NOALYSS_TEMPLATE."/mobile-display_menu.php";
+    }
+
+    /**
+     * @brief execute the menu
+     * @global type $g_user
+     * @staticvar int $level
+     * @param type $p_access_code
+     * @return type
+     */
+    public function execute_menu($p_access_code)
+    {
+        global $g_user,$g_parameter,$cn;
+        $aModule=$this->load_module($p_access_code);
+        if ( empty($aModule)) {
+            return;
+        }
+        /*-- Load the standard headers if needed -- */
+        if ( $aModule['pmo_default'] == 1) {
+            $this->page_start();
+        }
+        
+        echo HtmlInput::anchor("&#10094;"._("Retour"), 
"mobile.php?".http_build_query(["gDossier"=>Dossier::id()]));
+        
+        if ($aModule['me_file']!="")
+        {
+            if ($aModule['me_parameter']!=="")
+            {
+                // if there are paramter put them in superglobal
+                $array=compute_variable($aModule['me_parameter']);
+                put_global($array);
+            }
+            if (DEBUGNOALYSS==2)
+            {
+                echo $aModule['me_file'], " param : ", 
$aModule['me_parameter'];
+            }
+            /*
+             * Log the file we input to put in the folder test-noalyss for 
replaying it
+             */
+            if (LOGINPUT)
+            {
+                
$file_loginput=fopen($_ENV['TMP'].'/scenario-'.$_SERVER['REQUEST_TIME'].'.php', 
'a+');
+                fwrite($file_loginput, "include '".$aModule['me_file']."';");
+                fwrite($file_loginput, "\n");
+                fclose($file_loginput);
+            }
+            // if file is not a plugin, include the file, otherwise
+            // include the plugin launcher
+            if ($aModule['me_type']!='PL')
+            {
+                if (file_exists($aModule['me_file']))
+                {
+                    require_once $aModule['me_file'];
+                }
+                elseif (file_exists(NOALYSS_INCLUDE.'/'.$aModule['me_file']))
+                {
+                    require_once NOALYSS_INCLUDE.'/'.$aModule['me_file'];
+                }
+                else
+                {
+                    echo echo_warning(_("Fichier non trouvé"));
+                }
+            }
+            else
+            {
+                require 'extension_get.inc.php';
+            }
+
+            exit();
+        }
+        elseif ($aModule['me_javascript']!='')
+        {
+            $js=str_replace('<DOSSIER>', dossier::id(), 
$aModule['me_javascript']);
+            echo create_script($js);
+        }
+    }
+
+}
diff --git a/include/class/mobile_device_mtable.class.php 
b/include/class/mobile_device_mtable.class.php
new file mode 100644
index 0000000..4a4b8a6
--- /dev/null
+++ b/include/class/mobile_device_mtable.class.php
@@ -0,0 +1,153 @@
+<?php
+
+/*
+ *   This file is part of NOALYSS.
+ *
+ *   PhpCompta is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   PhpCompta is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with PhpCompta; if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+// Copyright (2002-2021) Author Dany De Bontridder <danydb@noalyss.eu>
+
+/**
+ * @file
+ * @brief Manage the table profile_mobile
+ */
+
+/**
+ * @class Mobile_Device_MTable
+ * @brief Manage the table profile_mobile
+ */
+class Mobile_Device_MTable extends Manage_Table_SQL
+{
+    private $profile_id; //!< profile_mobile.p_id profile 
+    
+    function __construct(Profile_Mobile_SQL $p_table)
+    {
+        parent::__construct($p_table);
+        $this->set_append_row(true);
+        $this->set_delete_row(true);
+        $this->set_col_label("me_code", _("Code Menu"));
+        $this->set_col_label("pmo_order", _("Ordre apparition"));
+        $this->set_col_label("pmo_default", _("Entêtes standards"));
+        $this->set_col_tips("pmo_default",80 );
+        $this->set_property_visible("pmo_id", false);
+        $this->set_property_visible("p_id", false);
+        $this->set_col_type("pmo_default", "select",array(
+                                                    
["value"=>1,"label"=>_("Oui")],
+                                                    
["value"=>0,"label"=>_("Non")]
+                                                    ));
+        $this->set_col_type("me_code","custom");
+        $this->set_col_type("pmo_order","numeric");
+        $this->set_header_option("pmo_order",'style="text-align:right;"');
+        $this->set_callback("ajax_misc.php");
+        $this->add_json_param("op","mobile_device_menu");
+        $this->set_sort_column("pmo_order");
+        $this->set_col_sort(1);
+        $this->set_order(["me_code","pmo_order","pmo_default"]);
+        
+        
+        $this->set_object_name("profile_menu_mtable");
+    }
+    public function get_profile_id()
+    {
+        return $this->profile_id;
+    }
+
+    public function set_profile_id($profile_id)
+    {
+        $this->profile_id=$profile_id;
+        $this->get_table()->setp('p_id',$profile_id);
+        $this->add_json_param("profile_id",$profile_id);
+        return $this;
+    }
+
+    /**
+     * @brief 
+     * @param number $p_id profile_mobile.pmo_id
+     * @param number $profile_id  profile_mobile.p_id profile 
+     * @return \Mobile_Device_MTable
+     */
+    static function build($p_id,$profile_id)
+    {
+        $cn=Dossier::connect();
+        $profile_mobile=new Profile_Mobile_SQL($cn,$p_id);
+        if ( $p_id== -1) { 
+            $profile_mobile->setp("pmo_order",5); 
+            $profile_mobile->setp("pmo_default",1);
+        }
+        
+        $mobile_device_table=new Mobile_Device_MTable($profile_mobile);
+      /*  $mobile_device_table->set_profile_id($profile_id);
+        $mobile_device_table->get_table()->setp('p_id',$profile_id);*/
+        return $mobile_device_table;
+    }
+    function input_custom($p_key,$p_value)
+    {
+        
+        if ( $p_key == "me_code") {
+            $select = new ISelect("me_code");
+            $cn=$this->get_table()->get_cn();
+            $select->value=$cn->make_array("select me_code , me_code ||' 
'||coalesce(me_description,'') from menu_ref 
+                    where
+                        me_type in ('PL','ME') and trim(me_code) != 'new_line'
+                    order by me_code");
+            $select->rowsize=17;
+            $select->selected=$p_value;
+            echo td($select->input());
+            return;
+        }
+    }
+    function display_row_custom($p_key, $p_value, $p_id=0)
+    {
+        if ( $p_key == 'me_code') {
+            echo td($p_value);
+            return;
+        }
+    }
+    /**
+     * @brief before inserting or updating, check that the data are correct ,
+     * 
+     */
+    function check()
+    {
+        // DB connection
+        $cn=$this->get_table()->cn;
+        // object to insert
+        $profile_mobile_sql=$this->get_table();
+        
$profile_mobile_sql->me_code=strtoupper($profile_mobile_sql->getp('me_code'));
+        $me_code=$profile_mobile_sql->me_code;
+        
+        $profile_id=$profile_mobile_sql->getp("p_id");
+        $pmo_id=$profile_mobile_sql->getp("pmo_id");
+        
+        // check for duplicate
+        if ( $cn->get_value("select count(*) from profile_mobile where p_id = 
$1 and me_code=$2 and pmo_id <> $3",
+                        array($profile_id,$me_code,$pmo_id )) > 0
+            ) {
+            $this->set_error("me_code", _("Doublon"));
+        }
+        
+        if (isNumber($profile_mobile_sql->getp("pmo_order")) != 1 ) {
+            $this->set_error("pmo_order", _("doit être un nombre"));
+        }
+        
+        if ( $cn->get_value("select count(*) from menu_ref where 
me_code=$1",[$me_code]) == 0) {
+            $this->set_error ("me_code",_('Menu code invalide'));
+        }
+        if ($this->count_error() > 0) {
+            return false;
+        }
+        return true;
+    }
+}
\ No newline at end of file
diff --git a/include/class/profile_menu.class.php 
b/include/class/profile_menu.class.php
index b16e509..76d1dff 100644
--- a/include/class/profile_menu.class.php
+++ b/include/class/profile_menu.class.php
@@ -21,12 +21,18 @@
 require_once NOALYSS_INCLUDE.'/database/profile_menu_sql.class.php';
 
 /**
- * Manage the menu of a profile
+ * @file 
+ * @brief Manage the menu of a profile
  *
  * @author dany
  */
+/**
+ * @class Profile_Menu 
+ * @brief Manage the menu of a profile
+ */
 class Profile_Menu extends Profile_Menu_sql
 {
+    
 
     function __construct($p_cn, $p_id=-1)
     {
@@ -35,7 +41,7 @@ class Profile_Menu extends Profile_Menu_sql
     }
 
     /**
-     * Display the content of a profile menu for printing
+     * @brief Display the content of a profile menu for printing
      * @param type $resource
      * @param type $p_id
      */
@@ -97,7 +103,7 @@ class Profile_Menu extends Profile_Menu_sql
         }
 
         /**
-         * Show a table with all the menu and the type
+         * @brief Show a table with all the menu and the type
          * @param type $p_id profile.p_id
          */
         function display_profile_menu_detail()
@@ -224,7 +230,7 @@ class Profile_Menu extends Profile_Menu_sql
         }
 
         /**
-         * Show the available profile for the profile $p_id, it concerns only 
the action of management (action-gestion)
+         * @brief Show the available profile for the profile $p_id, it 
concerns only the action of management (action-gestion)
          * @param $p_id is the profile p_id
          */
         function available_profile()
@@ -250,7 +256,7 @@ class Profile_Menu extends Profile_Menu_sql
         }
 
         /**
-         * Show the available repository for the profile $p_id
+         * @brief Show the available repository for the profile $p_id
          * @param $p_id is the profile p_id
          */
         function available_repository()
@@ -273,6 +279,14 @@ class Profile_Menu extends Profile_Menu_sql
             );
             require_once NOALYSS_TEMPLATE.'/profile_sec_repository.php';
         }
+        /**
+         * @brief menu for device
+         */
+        function mobile_device() {
+            $profile_mobile=Mobile_Device_MTable::build(0,$this->p_id);
+            $profile_mobile->display_table("where p_id=$1 order by 
pmo_order",[ $this->p_id ]);
+            echo 
create_script("profile_menu_mtable.param_add({profile_id:{$this->p_id}});");
+        }
 
     }
 
diff --git a/include/class/user.class.php b/include/class/user.class.php
index 5a7cb6f..35771c0 100644
--- a/include/class/user.class.php
+++ b/include/class/user.class.php
@@ -18,16 +18,14 @@
  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 // Copyright Author Dany De Bontridder danydb@aevalys.eu
-/** 
+/**
  * @file
  * @brief Data & function about connected users
  */
-
 /**
  * @brief Data & function about connected users
  *   
  */
-
 require_once NOALYSS_INCLUDE.'/constant.php';
 require_once NOALYSS_INCLUDE.'/lib/user_common.php';
 require_once NOALYSS_INCLUDE.'/lib/ac_common.php';
@@ -35,63 +33,115 @@ require_once NOALYSS_INCLUDE.'/lib/ac_common.php';
 class User
 {
 
-       var $id;
-       var $pass;
-       var $db;
-       var $admin;
-       var $valid;
+    var $id; //!<  in account_repository , ac_users.use_id
+    var $pass; //!< password
+    var $db; //!< database connx
+    var $admin; //!< is or is not admin
+    var $valid; //!< is or is not valid
     var $first_name;
     var $name;
-    var $active ;
-    var $login ;
-    var $password ;
-    var $email ;
-
-       function __construct($p_cn, $p_id = -1)
-       {
-               // if p_id is not set then check the connected user
-               if ($p_id == -1)
-               {
-                       if (!isset($_SESSION[SESSION_KEY.'g_user']))
-                       {
-                $http=new \HttpInput();
-                $user_login=$http->request("p_user","string","");
-                $user_password=$http->request("p_pass","string","");
-
-                if ($user_login != "" && $user_password != "") {
-                    $_SESSION[SESSION_KEY."g_user"]=$user_login;
-                    $_SESSION[SESSION_KEY."g_pass"]=$user_password;
-                } else {
-                    echo '<h2 class="error">' . _('Session 
expirée<br>Utilisateur déconnecté') . '</h2>';
-                    redirect('index.php', 1);
-                    exit();
-                }
-                       }
-
-                       $this->login 
=strtolower($_SESSION[SESSION_KEY.'g_user']);
-                       $this->pass = $_SESSION[SESSION_KEY.'g_pass'];
-                       $this->id = -1;
-                       $this->db = $p_cn;
-                       $this->lang = (isset($_SESSION[SESSION_KEY.'g_lang'])) 
? $_SESSION[SESSION_KEY.'g_lang'] : 'fr_FR.utf8';
-                       $this->valid = 
(isset($_SESSION[SESSION_KEY.'isValid'])) ? 1 : 0;
-                       if (isset($_SESSION[SESSION_KEY.'g_theme']))
-                               $this->theme = $_SESSION[SESSION_KEY.'g_theme'];
-
-                       $this->admin = ( 
isset($_SESSION[SESSION_KEY.'use_admin']) ) ? 
$_SESSION[SESSION_KEY.'use_admin'] : 0;
-
-                       if (isset($_SESSION[SESSION_KEY.'use_name']))
-                               $this->name = $_SESSION[SESSION_KEY.'use_name'];
-                       if (isset($_SESSION[SESSION_KEY.'use_first_name']))
-                               $this->first_name = 
$_SESSION[SESSION_KEY.'use_first_name'];
-                       $this->load();
-               }
-               else // if p_id is set get data of another user
-               {
-                       $this->id = $p_id;
-                       $this->db = $p_cn;
-                       $this->load();
-               }
-       }
+    var $active; //!< 1 active , 0 disables
+    var $login; //!< login lower case
+    var $password; //!< password 
+    var $email; //!< user's email
+    var $access_mode; //!< MOBILE or PC depending if when connecting $login 
contains @mobile 
+
+    function __construct($p_cn, $p_id=-1)
+    {
+        $this->db=$p_cn;
+        // if p_id is not set then check the connected user
+        if ($p_id==-1)
+        {
+            $this->connect_user();
+        }
+        else // if p_id is set get data of another user
+        {
+            $this->id=$p_id;
+            $this->load();
+        }
+    }
+
+    /**
+     * @brief connect the user and set the $_SESSION variables if not set 
thanks the $_REQUEST  
+     */
+    private function connect_user()
+    {
+        if (!isset($_SESSION[SESSION_KEY.'g_user']))
+        {
+            $http=new \HttpInput();
+            $user_login=$http->request("p_user", "string", "");
+            $user_password=$http->request("p_pass", "string", "");
+
+            if ($user_login!=""&&$user_password!="")
+            {
+                $_SESSION[SESSION_KEY."g_user"]=$user_login;
+                $_SESSION[SESSION_KEY."g_pass"]=$user_password;
+            }
+            else
+            {
+                echo '<h2 class="error">'._('Session expirée<br>Utilisateur 
déconnecté').'</h2>';
+                redirect('index.php', 1);
+                exit();
+            }
+
+
+            if (strpos($user_login, '@mobile')!=false)
+            {
+                $this->access_mode='MOBILE';
+                $this->login=str_ireplace("@mobile", "", $user_login);
+            }
+            else
+            {
+                $this->access_mode='PC';
+                $this->login=strtolower($user_login);
+            }
+            
+            $_SESSION[SESSION_KEY."access_mode"]=$this->access_mode;
+            $_SESSION[SESSION_KEY.'g_user']=$this->login;
+        }
+        $this->login=$_SESSION[SESSION_KEY."g_user"];
+        $this->pass=$_SESSION[SESSION_KEY.'g_pass'];
+        $this->id=-1;
+        
$this->lang=(isset($_SESSION[SESSION_KEY.'g_lang']))?$_SESSION[SESSION_KEY.'g_lang']:'fr_FR.utf8';
+        $this->access_mode=$_SESSION[SESSION_KEY."access_mode"];
+        
+        if ($this->load()==-1)
+        {
+           echo '<h2 class="error">'._('Utilisateur ou mot de passe 
incorrect').'</h2>';
+           
+           redirect('logout.php', 1);
+            exit();
+        }
+
+        $this->load_global_pref();
+
+        $_SESSION[SESSION_KEY.'g_lang']=$this->lang;
+        $this->valid=(isset($_SESSION[SESSION_KEY.'isValid']))?1:0;
+        if (isset($_SESSION[SESSION_KEY.'g_theme']))
+        {
+            $this->theme=$_SESSION[SESSION_KEY.'g_theme'];
+        }
+        $_SESSION[SESSION_KEY.'use_admin']=$this->admin;
+        $_SESSION[SESSION_KEY.'use_name']=$this->name;
+        $_SESSION[SESSION_KEY.'use_first_name']=$this->first_name;
+    }
+
+    /**
+     * @brief access_mode tells what mode must be used : pc or mobile
+     */
+    public function get_access_mode()
+    {
+        return $this->access_mode;
+    }
+
+    /**
+     * @brief access_mode tells what mode must be used : pc or mobile
+     */
+    public function set_access_mode($access_mode): object
+    {
+        $this->access_mode=$access_mode;
+        return $this;
+    }
 
     /**
      * @return int|mixed
@@ -106,7 +156,7 @@ class User
      */
     public function setId(int $id): void
     {
-        $this->id = $id;
+        $this->id=$id;
     }
 
     /**
@@ -122,7 +172,7 @@ class User
      */
     public function setPass($pass): void
     {
-        $this->pass = $pass;
+        $this->pass=$pass;
     }
 
     /**
@@ -138,7 +188,7 @@ class User
      */
     public function setDb($db): void
     {
-        $this->db = $db;
+        $this->db=$db;
     }
 
     /**
@@ -154,7 +204,7 @@ class User
      */
     public function setAdmin($admin): void
     {
-        $this->admin = $admin;
+        $this->admin=$admin;
     }
 
     /**
@@ -170,7 +220,7 @@ class User
      */
     public function setValid(int $valid): void
     {
-        $this->valid = $valid;
+        $this->valid=$valid;
     }
 
     /**
@@ -186,7 +236,7 @@ class User
      */
     public function setFirstName($first_name): void
     {
-        $this->first_name = $first_name;
+        $this->first_name=$first_name;
     }
 
     /**
@@ -202,7 +252,7 @@ class User
      */
     public function setName($name): void
     {
-        $this->name = $name;
+        $this->name=$name;
     }
 
     /**
@@ -218,7 +268,7 @@ class User
      */
     public function setActive($active): void
     {
-        $this->active = $active;
+        $this->active=$active;
     }
 
     /**
@@ -234,7 +284,7 @@ class User
      */
     public function setLogin(string $login): void
     {
-        $this->login = $login;
+        $this->login=$login;
     }
 
     /**
@@ -250,7 +300,7 @@ class User
      */
     public function setPassword($password): void
     {
-        $this->password = $password;
+        $this->password=$password;
     }
 
     /**
@@ -266,30 +316,30 @@ class User
      */
     public function setEmail($email): void
     {
-        $this->email = $email;
-    }
-
-       /**\brief load data from database.
-        * if this->id == -1, it is unknown so we have to retrieve it
-         from the database by the login
-        * return -1 if nothing is found
-        */
-
-       function load()
-       {
-               /* if this->id == -1, it is unknown so we have to retrieve it 
from
-                 the database thanks it login */
-               if ($this->id < 0)
-               {
-                       $sql_cond = "   where lower(use_login)=lower($1)";
-                       $sql_array = array($this->login);
-               }
-               else
-               {
-                       $sql_cond = "   where use_id=$1";
-                       $sql_array = array($this->id);
-               }
-               $sql = "select use_id,
+        $this->email=$email;
+    }
+
+    /*     * \brief load data from database.
+     * if this->id == -1, it is unknown so we have to retrieve it
+      from the database by the login
+     * return -1 if nothing is found
+     */
+
+    function load()
+    {
+        /* if this->id == -1, it is unknown so we have to retrieve it from
+          the database thanks it login */
+        if ($this->id<0)
+        {
+            $sql_cond="   where lower(use_login)=lower($1)";
+            $sql_array=array($this->login);
+        }
+        else
+        {
+            $sql_cond="   where use_id=$1";
+            $sql_array=array($this->id);
+        }
+        $sql="select use_id,
                             use_first_name,
                             use_name,
                             use_login,
@@ -298,281 +348,284 @@ class User
                             use_pass,
                             use_email
                         from ac_users ";
-               $cn = new Database();
-               $Res = $cn->exec_sql($sql . $sql_cond, $sql_array);
-               if (($Max = Database::num_row($Res)) == 0)
-                       return -1;
-               $row = Database::fetch_array($Res, 0);
-               $this->id = $row['use_id'];
-               $this->first_name = $row['use_first_name'];
-               $this->last_name = $row['use_name'];
-               $this->name = $row['use_name'];
-               $this->active = $row['use_active'];
-               $this->login =strtolower($row['use_login']);
-               $this->admin = $row['use_admin'];
-               $this->password = $row['use_pass'];
-               $this->email=$row['use_email'];
-       }
-
-       function save()
-       {
-
-               $Sql = "update ac_users set use_first_name=$1, use_name=$2
+        $cn=new Database();
+        $Res=$cn->exec_sql($sql.$sql_cond, $sql_array);
+        if (($Max=Database::num_row($Res))==0)
+            return -1;
+        $row=Database::fetch_array($Res, 0);
+        $this->id=$row['use_id'];
+        $this->first_name=$row['use_first_name'];
+        $this->last_name=$row['use_name'];
+        $this->name=$row['use_name'];
+        $this->active=$row['use_active'];
+        $this->login=strtolower($row['use_login']);
+        $this->admin=$row['use_admin'];
+        $this->password=$row['use_pass'];
+        $this->email=$row['use_email'];
+    }
+
+    function save()
+    {
+
+        $Sql="update ac_users set use_first_name=$1, use_name=$2
              ,use_active=$3,use_admin=$4,use_pass=$5 ,use_email = $7 where 
use_id=$6";
-               $cn = new Database();
-               $Res = $cn->exec_sql($Sql, array($this->first_name, 
$this->last_name, $this->active, $this->admin, $this->pass, 
$this->id,$this->email));
-       }
-        function insert()
-       {
+        $cn=new Database();
+        $Res=$cn->exec_sql($Sql,
+                array($this->first_name, $this->last_name, $this->active, 
$this->admin, $this->pass, $this->id, $this->email));
+    }
+
+    function insert()
+    {
 
-               $Sql = "INSERT INTO ac_users(
+        $Sql="INSERT INTO ac_users(
                         use_first_name, use_name, use_login, use_active,  
                         use_admin, use_pass, use_email)
                             VALUES ($1, $2, $3, $4, $5, $6, $7) returning 
use_id";
 
-               $cn = new Database();
-               $this->id= $cn->get_value($Sql, array($this->first_name, 
$this->last_name, $this->login,1,0, $this->pass,$this->email));
-       }
-
-       /**
-        * \brief Check if user is active and exists in therepository
-        * Automatically redirect, it doesn't check if a user can access a 
folder
-        * \param $silent false, echo an error message and exit, true : exit 
without warning
-        * default is false
-        *
-         ++ */
+        $cn=new Database();
+        $this->id=$cn->get_value($Sql,
+                array($this->first_name, $this->last_name, $this->login, 1, 0, 
$this->pass, $this->email));
+    }
 
-       function Check($silent = false, $from = '')
-       {
+    /**
+     * \brief Check if user is active and exists in therepository
+     * Automatically redirect, it doesn't check if a user can access a folder
+     * \param $silent false, echo an error message and exit, true : exit 
without warning
+     * default is false
+     *
+      ++ */
+    function Check($silent=false, $from='')
+    {
 
-               $res = 0;
-               $pass5 = md5($this->pass);
+        $res=0;
+        $pass5=md5($this->pass);
 
-               $cn = new Database();
-               $sql = "select ac_users.use_login,ac_users.use_active, 
ac_users.use_pass,
+        $cn=new Database();
+        $sql="select ac_users.use_login,ac_users.use_active, ac_users.use_pass,
              use_admin,use_first_name,use_name
              from ac_users
              where ac_users.use_id=$1 
              and ac_users.use_active=1
              and ac_users.use_pass=$2";
-               $ret = $cn->exec_sql($sql,array($this->id,$pass5));
-               $res = Database::num_row($ret);
-               if ($res > 0)
-               {
-                       $r = Database::fetch_array($ret, 0);
-                       $_SESSION[SESSION_KEY.'use_admin'] = $r['use_admin'];
-                       $_SESSION[SESSION_KEY.'use_name'] = $r['use_name'];
-                       $_SESSION[SESSION_KEY.'use_first_name'] = 
$r['use_first_name'];
-                       $_SESSION[SESSION_KEY.'isValid'] = 1;
-
-                       $this->admin = $_SESSION[SESSION_KEY.'use_admin'];
-                       $this->name = $_SESSION[SESSION_KEY.'use_name'];
-                       $this->first_name = 
$_SESSION[SESSION_KEY.'use_first_name'];
-                       $this->load_global_pref();
-               }
-               $sql = "insert into audit_connect 
(ac_user,ac_ip,ac_module,ac_url,ac_state) values ($1,$2,$3,$4,$5)";
-
-               if ($res == 0)
-               {
-                       $cn->exec_sql($sql, 
array($_SESSION[SESSION_KEY.'g_user'], $_SERVER["REMOTE_ADDR"], 
-                            $from, $_SERVER['REQUEST_URI'], 'FAIL'));
-                       if (!$silent)
-                       {
-                               echo '<script> alert(\''._('Utilisateur ou mot 
de passe incorrect').'\')</script>';
-                               redirect('index.html');
-                       }
-                       $this->valid = 0;
-                       session_unset();
-                       exit - 1;
-               }
-               else
-               {
-                       if ($from == 'LOGIN')
-                               $cn->exec_sql($sql, 
array($_SESSION[SESSION_KEY.'g_user'], $_SERVER["REMOTE_ADDR"], $from, 
-                                    $_SERVER['REQUEST_URI'], 'SUCCESS'));
-                       $this->valid = 1;
-               }
-
-               return $ret;
-       }
-
-       /**
-         * \brief return  the access to a folder,
-        * \param $p_dossier id if it is == 0 then we take the value from 
$_SESSION
-        * \return the priv_priv
-        *          - X no access
-        *          - R has access (normal user)
-        
-        *
-        */
-
-       function get_folder_access($p_dossier = 0)
-       {
-
-               if ($p_dossier == 0)
-                       $p_dossier = dossier::id();
-               if ($this->admin == 1)          return 'R';
-               $cn = new Database();
-
-               $sql = "select 'R' from jnt_use_dos where use_id=$1 and 
dos_id=$2";
-
-               $res = $cn->get_value($sql, array($this->id, $p_dossier));
-                
-               if ($cn->get_affected()== 0) return 'X';
-               return $res;
-       }
-
-       /**
-         * \brief save the access of a folder
-        * \param $db_id the dossier id
-        * \param $priv boolean, true then it is granted, false it is removed
-        */
-
-       function set_folder_access($db_id, $priv)
+        $ret=$cn->exec_sql($sql, array($this->id, $pass5));
+        $res=Database::num_row($ret);
+        if ($res>0)
         {
+            $r=Database::fetch_array($ret, 0);
+            $_SESSION[SESSION_KEY.'use_admin']=$r['use_admin'];
+            $_SESSION[SESSION_KEY.'use_name']=$r['use_name'];
+            $_SESSION[SESSION_KEY.'use_first_name']=$r['use_first_name'];
+            $_SESSION[SESSION_KEY.'isValid']=1;
+
+            $this->admin=$_SESSION[SESSION_KEY.'use_admin'];
+            $this->name=$_SESSION[SESSION_KEY.'use_name'];
+            $this->first_name=$_SESSION[SESSION_KEY.'use_first_name'];
+            $this->load_global_pref();
+        }
+        $sql="insert into audit_connect 
(ac_user,ac_ip,ac_module,ac_url,ac_state) values ($1,$2,$3,$4,$5)";
 
-            $cn=new Database();
-            if ($priv)
+        if ($res==0)
+        {
+            $cn->exec_sql($sql,
+                    array($_SESSION[SESSION_KEY.'g_user'], 
$_SERVER["REMOTE_ADDR"],
+                        $from, $_SERVER['REQUEST_URI'], 'FAIL'));
+            if (!$silent)
             {
-                // the access is granted
-                $jnt=$cn->get_value("select jnt_id from jnt_use_dos where 
dos_id=$1 and use_id=$2",
-                        array($db_id, $this->id));
+                echo '<script> alert(\''._('Utilisateur ou mot de passe 
incorrect').'\')</script>';
+                redirect('index.html');
+            }
+            $this->valid=0;
+            session_unset();
+            exit-1;
+        }
+        else
+        {
+            if ($from=='LOGIN')
+                $cn->exec_sql($sql,
+                        array($_SESSION[SESSION_KEY.'g_user'], 
$_SERVER["REMOTE_ADDR"], $from,
+                            $_SERVER['REQUEST_URI'], 'SUCCESS'));
+            $this->valid=1;
+        }
+
+        return $ret;
+    }
+
+    /**
+     * \brief return  the access to a folder,
+     * \param $p_dossier id if it is == 0 then we take the value from $_SESSION
+     * \return the priv_priv
+     *          - X no access
+     *          - R has access (normal user)
+
+     *
+     */
+    function get_folder_access($p_dossier=0)
+    {
+
+        if ($p_dossier==0)
+            $p_dossier=dossier::id();
+        if ($this->admin==1)
+            return 'R';
+        $cn=new Database();
+
+        $sql="select 'R' from jnt_use_dos where use_id=$1 and dos_id=$2";
+
+        $res=$cn->get_value($sql, array($this->id, $p_dossier));
+
+        if ($cn->get_affected()==0)
+            return 'X';
+        return $res;
+    }
+
+    /**
+     * \brief save the access of a folder
+     * \param $db_id the dossier id
+     * \param $priv boolean, true then it is granted, false it is removed
+     */
+    function set_folder_access($db_id, $priv)
+    {
 
-                if ($cn->size()==0)
-                {
+        $cn=new Database();
+        if ($priv)
+        {
+            // the access is granted
+            $jnt=$cn->get_value("select jnt_id from jnt_use_dos where 
dos_id=$1 and use_id=$2", array($db_id, $this->id));
 
-                    $Res=$cn->exec_sql("insert into jnt_use_dos(dos_id,use_id) 
values($1,$2)", array($db_id, $this->id));
-                }
-            } 
-            else 
+            if ($cn->size()==0)
             {
-                // Access is revoked
-                $cn->exec_sql('delete from jnt_use_dos where use_id  = $1 and 
dos_id = $2 ', array($this->id, $db_id));
+
+                $Res=$cn->exec_sql("insert into jnt_use_dos(dos_id,use_id) 
values($1,$2)", array($db_id, $this->id));
             }
         }
+        else
+        {
+            // Access is revoked
+            $cn->exec_sql('delete from jnt_use_dos where use_id  = $1 and 
dos_id = $2 ', array($this->id, $db_id));
+        }
+    }
 
     /**
-         * \brief check that a user is valid and the access to the folder
-        * \param $p_ledger the ledger to check
-        * \return the priv_priv
-        * - O only predefined operation
-        * - W write
-        * - R read only
-        * - X no access
-        *
-
-        *
-        */
-
-       function get_ledger_access($p_ledger)
-       {
-               if ($this->admin == 1 ||
-                               $this->is_local_admin(dossier::id()) == 1
-                        || $this->get_status_security_ledger()==0)
-                       return 'W';
-
-               $sql = "select uj_priv from user_sec_jrn where uj_login=$1 and 
uj_jrn_id=$2";
-               $res = $this->db->get_value($sql, array($this->login, 
$p_ledger));
-
-               if ($res == '')
-                       $res = 'X';
-               return $res;
-       }
-
-       /**
-        * \brief get all the available ledgers for the current user
-        * \param $p_type = ALL or the type of the ledger (ACH,VEN,FIN,ODS)
-        * \param $p_access =3 for Read or WRITE, 2  write, 1 for readonly
-         * \param (boolean) $all if true show also inactive
-        *  \return a double array of available ledgers
-         @verbatim
-         [0] => [jrn_def_id]
-         [jrn_def_type]
-         [jrn_def_name]
-         [jrn_def_class_deb]
-         [jrn_def_class_cred]
-         [jrn_type_id]
-         [jrn_desc]
-         [uj_priv]
-         @endverbatim
-        */
-
-       function get_ledger($p_type = 'ALL', $p_access = 3,$disable=TRUE)
-       {
-            $p_type=strtoupper($p_type);
-            if (! in_array($p_type, ["FIN","ALL","ODS","VEN",'ACH'])) {
-                record_log(sprintf("UGL1, p_type %s",$p_type));
-                throw new Exception("UGL1"._("Type incorrecte"));
-            }
-            if ($disable==TRUE) {
-                $sql_enable="";
-            } else {
-                $sql_enable="and jrn_enable=1";
+     * \brief check that a user is valid and the access to the folder
+     * \param $p_ledger the ledger to check
+     * \return the priv_priv
+     * - O only predefined operation
+     * - W write
+     * - R read only
+     * - X no access
+     *
+
+     *
+     */
+    function get_ledger_access($p_ledger)
+    {
+        if ($this->admin==1||
+                
$this->is_local_admin(dossier::id())==1||$this->get_status_security_ledger()==0)
+            return 'W';
+
+        $sql="select uj_priv from user_sec_jrn where uj_login=$1 and 
uj_jrn_id=$2";
+        $res=$this->db->get_value($sql, array($this->login, $p_ledger));
+
+        if ($res=='')
+            $res='X';
+        return $res;
+    }
+
+    /**
+     * \brief get all the available ledgers for the current user
+     * \param $p_type = ALL or the type of the ledger (ACH,VEN,FIN,ODS)
+     * \param $p_access =3 for Read or WRITE, 2  write, 1 for readonly
+     * \param (boolean) $all if true show also inactive
+     *  \return a double array of available ledgers
+      @verbatim
+      [0] => [jrn_def_id]
+      [jrn_def_type]
+      [jrn_def_name]
+      [jrn_def_class_deb]
+      [jrn_def_class_cred]
+      [jrn_type_id]
+      [jrn_desc]
+      [uj_priv]
+      @endverbatim
+     */
+    function get_ledger($p_type='ALL', $p_access=3, $disable=TRUE)
+    {
+        $p_type=strtoupper($p_type);
+        if (!in_array($p_type, ["FIN", "ALL", "ODS", "VEN", 'ACH']))
+        {
+            record_log(sprintf("UGL1, p_type %s", $p_type));
+            throw new Exception("UGL1"._("Type incorrecte"));
+        }
+        if ($disable==TRUE)
+        {
+            $sql_enable="";
+        }
+        else
+        {
+            $sql_enable="and jrn_enable=1";
+        }
+        if 
($this->admin!=1&&$this->is_local_admin()!=1&&$this->get_status_security_ledger()==1)
+        {
+            $sql_type=($p_type=='ALL')?'':"and 
jrn_def_type=upper('".sql_string($p_type)."')";
+            switch ($p_access)
+            {
+                case 3:
+                    $sql_access=" and uj_priv!= 'X' ";
+                    break;
+                case 2:
+                    $sql_access=" and uj_priv = 'W' and jrn_enable=1 ";
+                    break;
+
+                case 1:
+                    $sql_access=" and ( uj_priv = 'R' or uj_priv='W') ";
+                    break;
             }
-               if ($this->admin != 1 && $this->is_local_admin() != 1 && 
$this->get_status_security_ledger() == 1)
-               {
-                       $sql_type = ($p_type == 'ALL') ? '' : "and 
jrn_def_type=upper('" . sql_string($p_type) . "')";
-                       switch ($p_access)
-                       {
-                               case 3:
-                                       $sql_access = " and uj_priv!= 'X' ";
-                                       break;
-                               case 2:
-                                       $sql_access = " and uj_priv = 'W' and 
jrn_enable=1 ";
-                                       break;
-
-                               case 1:
-                                       $sql_access = " and ( uj_priv = 'R' or 
uj_priv='W') ";
-                                       break;
-                       }
-
-                       $sql = "select jrn_def_id,jrn_def_type,
+
+            $sql="select jrn_def_id,jrn_def_type,
                  
jrn_def_name,jrn_def_class_deb,jrn_def_class_cred,jrn_type_id,jrn_desc,uj_priv,
                  
jrn_deb_max_line,jrn_cred_max_line,jrn_def_description,jrn_enable
                  from jrn_def join jrn_type on jrn_def_type=jrn_type_id
                  join user_sec_jrn on uj_jrn_id=jrn_def_id
                  where
-                 uj_login='" . $this->login . "'" .
-                                       $sql_type . $sql_access .$sql_enable.
-                                       " order by jrn_Def_name";
-               }
-               else
-               {
-                       $sql_type = ($p_type == 'ALL') ? '  '.$sql_enable : 
"where jrn_def_type=upper('" . sql_string($p_type) . "')  ".$sql_enable;
-                       $sql = "select 
jrn_def_id,jrn_def_type,jrn_def_name,jrn_def_class_deb,jrn_def_class_cred,jrn_deb_max_line,jrn_cred_max_line,
+                 uj_login='".$this->login."'".
+                    $sql_type.$sql_access.$sql_enable.
+                    " order by jrn_Def_name";
+        }
+        else
+        {
+            $sql_type=($p_type=='ALL')?'  '.$sql_enable:"where 
jrn_def_type=upper('".sql_string($p_type)."')  ".$sql_enable;
+            $sql="select 
jrn_def_id,jrn_def_type,jrn_def_name,jrn_def_class_deb,jrn_def_class_cred,jrn_deb_max_line,jrn_cred_max_line,
                  jrn_type_id,jrn_desc,'W' as 
uj_priv,jrn_def_description,jrn_enable
                  from jrn_def join jrn_type on jrn_def_type=jrn_type_id
                  $sql_type
                  order by jrn_Def_name";
-               }
-               $res = $this->db->exec_sql($sql);
-               if (Database::num_row($res) == 0)
-                       return null;
-               $array = Database::fetch_all($res);
-               return $array;
-       }
-
-       /**
-         * \brief return an sql condition for filtering the permitted ledger
-        * \param $p_type = ALL or the type of the ledger (ACH,VEN,FIN,ODS)
-        * \param $p_access =3 for READ or WRITE, 2 READ and write, 1 for 
readonly
-        *
-        * \return sql condition like = jrn_def_id in (...)
-        */
-
-       function get_ledger_sql($p_type = 'ALL', $p_access = 3)
-       {
-               $aLedger = $this->get_ledger($p_type, $p_access);
-               if (empty($aLedger))
-                       return ' jrn_def_id < 0 ';
-               $sql = " jrn_def_id in (";
-               foreach ($aLedger as $row)
-               {
-                       $sql.=$row['jrn_def_id'] . ',';
-               }
-               $sql.='-1)';
-               return $sql;
-       }
+        }
+        $res=$this->db->exec_sql($sql);
+        if (Database::num_row($res)==0)
+            return null;
+        $array=Database::fetch_all($res);
+        return $array;
+    }
+
+    /**
+     * \brief return an sql condition for filtering the permitted ledger
+     * \param $p_type = ALL or the type of the ledger (ACH,VEN,FIN,ODS)
+     * \param $p_access =3 for READ or WRITE, 2 READ and write, 1 for readonly
+     *
+     * \return sql condition like = jrn_def_id in (...)
+     */
+    function get_ledger_sql($p_type='ALL', $p_access=3)
+    {
+        $aLedger=$this->get_ledger($p_type, $p_access);
+        if (empty($aLedger))
+            return ' jrn_def_id < 0 ';
+        $sql=" jrn_def_id in (";
+        foreach ($aLedger as $row)
+        {
+            $sql.=$row['jrn_def_id'].',';
+        }
+        $sql.='-1)';
+        return $sql;
+    }
 
     /**
      * synomym for isAdmin,
@@ -583,472 +636,480 @@ class User
         return $this->isAdmin();
     }
 
-       /**
-        * @brief  Check if an user is an admin
-        *
-        * @return 1 for yes 0 for no
-        */
-       function isAdmin()
-       {
-           $this->admin = 0;
-        $pass5 = md5($this->pass);
-        $sql = "select count(*) from ac_users where use_login=$1
+    /**
+     * @brief  Check if an user is an admin
+     *
+     * @return 1 for yes 0 for no
+     */
+    function isAdmin()
+    {
+        $this->admin=0;
+        $pass5=md5($this->pass);
+        $sql="select count(*) from ac_users where use_login=$1
              and use_active=1 and use_admin=1 ";
 
-        $cn = new Database();
-        $this->admin = $cn->get_value($sql, array($this->login));
-               return $this->admin;
-       }
-
-       /**
-        * \brief  Set the selected periode in the user's preferences
-        *
-        * \param $p_periode periode
-        * \param     - $p_user
-        *
-        */
-       function set_periode($p_periode)
-       {
-               $sql = "update user_local_pref set parameter_value=$1 where 
user_id=$2 and parameter_type='PERIODE'";
-               $Res = $this->db->exec_sql($sql,[$p_periode,$this->id]);
-       }
-
-       private function set_default_periode()
-       {
-
-               /* get the first periode */
-               $sql = 'select min(p_id) as pid '
-                        . ' from parm_periode '
-                        . ' where p_closed = false and p_start = (select 
min(p_start) from parm_periode)';
-               $Res = $this->db->exec_sql($sql);
-
-               $pid = Database::fetch_result($Res, 0, 0);
-               /* if all the periode are closed, then we use the last closed 
period */
-               if ($pid == null)
-               {
-                       $sql = 'select min(p_id) as pid '
-                                . 'from parm_periode '
-                                . 'where p_start = (select max(p_start) from 
parm_periode)';
-                       $Res2 = $this->db->exec_sql($sql);
-                       $pid = Database::fetch_result($Res2, 0, 0);
-                       if ($pid == null)
-                       {
-                               throw  new Exception( _("Aucune période 
trouvéee !!!"));
-                       }
-
-                       $pid = Database::fetch_result($Res2, 0, 0);
-               }
-
-               $sql = sprintf("insert into user_local_pref 
(user_id,parameter_value,parameter_type)
+        $cn=new Database();
+        $this->admin=$cn->get_value($sql, array($this->login));
+        return $this->admin;
+    }
+
+    /**
+     * \brief  Set the selected periode in the user's preferences
+     *
+     * \param $p_periode periode
+     * \param     - $p_user
+     *
+     */
+    function set_periode($p_periode)
+    {
+        $sql="update user_local_pref set parameter_value=$1 where user_id=$2 
and parameter_type='PERIODE'";
+        $Res=$this->db->exec_sql($sql, [$p_periode, $this->id]);
+    }
+
+    private function set_default_periode()
+    {
+
+        /* get the first periode */
+        $sql='select min(p_id) as pid '
+                .' from parm_periode '
+                .' where p_closed = false and p_start = (select min(p_start) 
from parm_periode)';
+        $Res=$this->db->exec_sql($sql);
+
+        $pid=Database::fetch_result($Res, 0, 0);
+        /* if all the periode are closed, then we use the last closed period */
+        if ($pid==null)
+        {
+            $sql='select min(p_id) as pid '
+                    .'from parm_periode '
+                    .'where p_start = (select max(p_start) from parm_periode)';
+            $Res2=$this->db->exec_sql($sql);
+            $pid=Database::fetch_result($Res2, 0, 0);
+            if ($pid==null)
+            {
+                throw new Exception(_("Aucune période trouvéee !!!"));
+            }
+
+            $pid=Database::fetch_result($Res2, 0, 0);
+        }
+
+        $sql=sprintf("insert into user_local_pref 
(user_id,parameter_value,parameter_type)
                      values ('%s','%d','PERIODE')", $this->id, $pid);
-               $Res = $this->db->exec_sql($sql);
-       }
-
-       /**
-        * \brief  Get the default periode from the user's preferences
-        *
-        * \return the default periode
-        *
-        *
-        */
-
-       function get_periode()
-       {
-
-               $array = $this->get_preference();
-               if (!isset($array['PERIODE']))
-               {
-                       $this->set_default_periode();
-                       $array = $this->get_preference();
-               }
-               return $array['PERIODE'];
-       }
-
-       /**
-         * 
-         * \brief return the mini rapport to display on the welcome page
-        * \return 0 if nothing if found or the report to display 
(form_definition.fr_id)
-        */
-
-       function get_mini_report()
-       {
-               $array = $this->get_preference();
-               $fr_id = (isset($array['MINIREPORT'])) ? $array['MINIREPORT'] : 
0;
-               return $fr_id;
-       }
-
-       /**
-         * \brief set the mini rapport to display on the welcome page
-        */
-       function set_mini_report($p_id)
-       {
-               $count = $this->db->get_value("select count(*) from 
user_local_pref where user_id=$1 and parameter_type=$2", array($this->id, 
'MINIREPORT'));
-               if ($count == 1)
-               {
-                       $sql = "update user_local_pref set parameter_value=$1 
where user_id=$2 and parameter_type='MINIREPORT'";
-                       $Res = $this->db->exec_sql($sql, array($p_id, 
$this->id));
-               }
-               else
-               {
-                       $sql = "insert into user_local_pref 
(user_id,parameter_type,parameter_value)" .
-                                       "values($1,'MINIREPORT',$2)";
-                       $Res = $this->db->exec_sql($sql, array($this->id, 
$p_id));
-               }
-       }
-        /**
-         * Save the preference , the scope is global, the settings are saved
-         * into account_repository
-         * @param $key THEME,  LANG , PAGESIZE
-         * @param $value value of the key
-         */
-
-       function save_global_preference($key, $value)
-       {
-               $repo = new Database();
-               $count = $repo->get_value("select count(*)
+        $Res=$this->db->exec_sql($sql);
+    }
+
+    /**
+     * \brief  Get the default periode from the user's preferences
+     *
+     * \return the default periode
+     *
+     *
+     */
+    function get_periode()
+    {
+
+        $array=$this->get_preference();
+        if (!isset($array['PERIODE']))
+        {
+            $this->set_default_periode();
+            $array=$this->get_preference();
+        }
+        return $array['PERIODE'];
+    }
+
+    /**
+     * 
+     * \brief return the mini rapport to display on the welcome page
+     * \return 0 if nothing if found or the report to display 
(form_definition.fr_id)
+     */
+    function get_mini_report()
+    {
+        $array=$this->get_preference();
+        $fr_id=(isset($array['MINIREPORT']))?$array['MINIREPORT']:0;
+        return $fr_id;
+    }
+
+    /**
+     * \brief set the mini rapport to display on the welcome page
+     */
+    function set_mini_report($p_id)
+    {
+        $count=$this->db->get_value("select count(*) from user_local_pref 
where user_id=$1 and parameter_type=$2",
+                array($this->id, 'MINIREPORT'));
+        if ($count==1)
+        {
+            $sql="update user_local_pref set parameter_value=$1 where 
user_id=$2 and parameter_type='MINIREPORT'";
+            $Res=$this->db->exec_sql($sql, array($p_id, $this->id));
+        }
+        else
+        {
+            $sql="insert into user_local_pref 
(user_id,parameter_type,parameter_value)".
+                    "values($1,'MINIREPORT',$2)";
+            $Res=$this->db->exec_sql($sql, array($this->id, $p_id));
+        }
+    }
+
+    /**
+     * Save the preference , the scope is global, the settings are saved
+     * into account_repository
+     * @param $key THEME,  LANG , PAGESIZE
+     * @param $value value of the key
+     */
+    function save_global_preference($key, $value)
+    {
+        $repo=new Database();
+        $count=$repo->get_value("select count(*)
            from
            user_global_pref
            where
            parameter_type=$1 and user_id=$2", array($key, $this->login));
-               if ($count == 1)
-               {
-                       $repo->exec_sql("update user_global_pref set 
parameter_value=$1
+        if ($count==1)
+        {
+            $repo->exec_sql("update user_global_pref set parameter_value=$1
                where parameter_type=$2 and user_id=$3", array($value, $key, 
$this->login));
-               }
-               elseif ($count == 0)
-               {
-                       $repo->exec_sql("insert into 
user_global_pref(user_id,parameter_type,parameter_value)
+        }
+        elseif ($count==0)
+        {
+            $repo->exec_sql("insert into 
user_global_pref(user_id,parameter_type,parameter_value)
                values($1,$2,$3)", array($this->login, $key, $value));
-               }
-       }
-
-       /**
-        * \brief  Get the default user's preferences
-        * \return array of (parameter_type => parameter_value)
-        */
-       function get_preference()
-       {
-               $sql = "select parameter_type,parameter_value from 
user_local_pref where user_id=$1";
-               $Res = $this->db->exec_sql($sql, array($this->id));
-               $l_array = array();
-               for ($i = 0; $i < Database::num_row($Res); $i++)
-               {
-                       $row = Database::fetch_array($Res, $i);
-                       $type = $row['parameter_type'];
-                       $l_array[$type] = $row['parameter_value'];
-               }
-               $repo=new Database();
-               $a_global_pref=$repo->get_array("select 
parameter_type,parameter_value from user_global_pref 
+        }
+    }
+
+    /**
+     * \brief  Get the default user's preferences
+     * \return array of (parameter_type => parameter_value)
+     */
+    function get_preference()
+    {
+        $sql="select parameter_type,parameter_value from user_local_pref where 
user_id=$1";
+        $Res=$this->db->exec_sql($sql, array($this->id));
+        $l_array=array();
+        for ($i=0; $i<Database::num_row($Res); $i++)
+        {
+            $row=Database::fetch_array($Res, $i);
+            $type=$row['parameter_type'];
+            $l_array[$type]=$row['parameter_value'];
+        }
+        $repo=new Database();
+        $a_global_pref=$repo->get_array("select parameter_type,parameter_value 
from user_global_pref 
                                                                        where 
-                                                                       
upper(user_id) = upper($1)",[$this->login]);
-               $nb_global=count($a_global_pref);
-               for ( $i = 0 ;$i< $nb_global ; $i++) {
-                       $idx=$a_global_pref[$i]['parameter_type'];
-                       $value=$a_global_pref[$i]['parameter_value'];
-                       $l_array[$idx]=$value;
-               }
-
-               return $l_array;
-       }
-
-       /**
-        * Check if an user can access a module, return 1 if yes, otherwise 0
-        * record in audit log
-         * This function works only if user is connected to a Folder
-        * @param string $p_module menu_ref.me_code
-         * @returns 0 for FORBIDDEN,  1 for GRANTED
-        */
-       function check_module($p_module)
-       {
-               $acc = $this->db->get_value("select count(*) from v_all_menu 
where p_id = $1
-                and me_code=$2", array($this->get_profile(), $p_module));
-               if ($acc == 0)
-               {
-                       $this->audit("FAIL", $p_module);
-                       return 0;
-               }
-               $this->audit("SUCCESS", $p_module);
-               return 1;
-       }
-
-       /**
-        * \brief  Check if an user is allowed to do an action
-        * \param p_action_id
-        * \return
-        *      - 0 no priv
-        *      - 1 priv granted
-        * @see constant.security.php
-        */
-
-       function check_action($p_action_id)
-       {
-               /*  save it into the log */
-               global $audit;
-               if ($this->Admin() == 1)
-                       return 1;
-               if ($this->is_local_admin(dossier::id()) == 1)
-                       return 1;
-                if ( $this->get_status_security_action() == 0)
-                    return 1;
-               $Res = $this->db->exec_sql(
-                               "select * from user_sec_act where ua_login=$1 
and ua_act_id=$2", array($this->login, $p_action_id));
-               $Count = Database::num_row($Res);
-               if ($Count == 0)
-               {
-                       if (isset($audit) && $audit == true)
-                       {
-                               $cn = new Database();
-                               $sql = "insert into audit_connect 
(ac_user,ac_ip,ac_module,ac_url,ac_state) values ($1,$2,$3,$4,$5)";
-                               $cn->exec_sql($sql, 
array($_SESSION[SESSION_KEY.'g_user'], $_SERVER["REMOTE_ADDR"], $p_action_id, 
$_SERVER['REQUEST_URI'], 'FAIL'));
-                       }
-                       return 0;
-               }
-               if ($Count == 1)                        return 1;
-                echo_error(_("Action invalide"));
-                record_log("User:check_action".sprintf("login %s ua_act_id 
%s",$this->login,$p_action_id));
-               exit();
-       }
-
-       /**
-        * \brief  Get the global preferences from user_global_pref
-        *        in the account_repository db
-        *
-        * \note set $SESSION[g_variable]
-        */
-
-       function load_global_pref()
-       {
-               $cn = new Database();
-               // Load everything in an array
-               $Res = $cn->exec_sql("select parameter_type,parameter_value from
+                                                                       
upper(user_id) = upper($1)", [$this->login]);
+        $nb_global=count($a_global_pref);
+        for ($i=0; $i<$nb_global; $i++)
+        {
+            $idx=$a_global_pref[$i]['parameter_type'];
+            $value=$a_global_pref[$i]['parameter_value'];
+            $l_array[$idx]=$value;
+        }
+
+        return $l_array;
+    }
+    /**
+     * @brief Check if an user can access a module, return 1 if yes, otherwise 0
+     * record in audit log
+     * This function works only if user is connected to a Folder
+     * @param string $p_module menu_ref.me_code
+     * @returns 0 for FORBIDDEN,  1 for GRANTED
+     */
+    function check_module($p_module)
+    {
+        if ( $this->access_mode == "PC") {
+
+            $acc=$this->db->get_value("select count(*) from v_all_menu where 
p_id = $1
+                    and me_code=$2", array($this->get_profile(), $p_module));
+        } elseif ($this->access_mode=="MOBILE") {
+            $acc=$this->db->get_value("select count(*) from profile_mobile 
where p_id=$1 and me_code=$2",
+                    array($this->get_profile(), $p_module));
+        } else {
+            throw new Exception("USER:823:ACCESS_MODE INCONNU");
+        }
+        if ($acc==0)
+        {
+            $this->audit("FAIL", $p_module);
+            return 0;
+        }
+        $this->audit("SUCCESS", $p_module);
+        return 1;
+    }
+
+    /**
+     * \brief  Check if an user is allowed to do an action
+     * \param p_action_id
+     * \return
+     *         - 0 no priv
+     *      - 1 priv granted
+     * @see constant.security.php
+     */
+    function check_action($p_action_id)
+    {
+        /*  save it into the log */
+        global $audit;
+        if ($this->Admin()==1)
+            return 1;
+        if ($this->is_local_admin(dossier::id())==1)
+            return 1;
+        if ($this->get_status_security_action()==0)
+            return 1;
+        $Res=$this->db->exec_sql(
+                "select * from user_sec_act where ua_login=$1 and 
ua_act_id=$2", array($this->login, $p_action_id));
+        $Count=Database::num_row($Res);
+        if ($Count==0)
+        {
+            if (isset($audit)&&$audit==true)
+            {
+                $cn=new Database();
+                $sql="insert into audit_connect 
(ac_user,ac_ip,ac_module,ac_url,ac_state) values ($1,$2,$3,$4,$5)";
+                $cn->exec_sql($sql,
+                        array($_SESSION[SESSION_KEY.'g_user'], 
$_SERVER["REMOTE_ADDR"], $p_action_id, $_SERVER['REQUEST_URI'],
+                            'FAIL'));
+            }
+            return 0;
+        }
+        if ($Count==1)
+            return 1;
+        echo_error(_("Action invalide"));
+        record_log("User:check_action".sprintf("login %s ua_act_id %s", 
$this->login, $p_action_id));
+        exit();
+    }
+
+    /**
+     * \brief  Get the global preferences from user_global_pref
+     *        in the account_repository db
+     *
+     * \note set $SESSION[g_variable]
+     */
+    function load_global_pref()
+    {
+        $cn=new Database();
+        // Load everything in an array
+        $Res=$cn->exec_sql("select parameter_type,parameter_value from
                             user_global_pref
-                            where user_id=$1",[$this->login]);
-               $Max = Database::num_row($Res);
-               if ($Max == 0)
-               {
-                       $this->insert_default_global_pref();
-                       $this->load_global_pref();
-                       return;
-               }
-               // Load value into array
-               $line = array();
-               for ($i = 0; $i < $Max; $i++)
-               {
-                       $row = Database::fetch_array($Res, $i);
-                       $type = $row['parameter_type'];
-                       $line[$type] = $row['parameter_value'];
-               }
-               // save array into g_ variable
-               $array_pref = array('g_theme' => 'THEME', 
-                    'g_pagesize' => 'PAGESIZE', 
-                    'g_topmenu' => 'TOPMENU', 
-                    'g_lang' => 'LANG',
-                    'csv_fieldsep'=>'csv_fieldsep',
-                    'csv_decimal'=>'csv_decimal' ,
-                    'csv_encoding'=>'csv_encoding',
-                                       'first_week_day'=>'first_week_day');
-                
-               foreach ($array_pref as $name => $parameter)
-               {
-                       if (!isset($line[$parameter]))
-                       {
-                               $this->insert_default_global_pref($parameter);
-                               $this->load_global_pref();
-                               return;
-                       }
-                       $_SESSION[SESSION_KEY.$name] = $line[$parameter];
-               }
-       }
-
-       /**
-        * \brief  insert default pref
-        *        if no parameter are given insert all the existing
-        *        parameter otherwise only the requested
-        * \param $p_type parameter's type or nothing
-        * \param $p_value parameter value
-        *
-        */
-
-       function insert_default_global_pref($p_type = "", $p_value = "")
-       {
-
-               $default_parameter = array("THEME" => "classic",
-                                               "PAGESIZE" => "50",
-                                               'TOPMENU' => 'TEXT',
-                                               'LANG' => 'fr_FR.utf8',
-                        'csv_fieldsep'=>'0',
-                        'csv_decimal'=>'0',
-                        'csv_encoding'=>'utf8',
-                                               'first_week_day'=>1
-                    );
-               $cn = new Database();
-               $sql = "insert into 
user_global_pref(user_id,parameter_type,parameter_value)
+                            where user_id=$1", [$this->login]);
+        $Max=Database::num_row($Res);
+        if ($Max==0)
+        {
+            $this->insert_default_global_pref();
+            $this->load_global_pref();
+            return;
+        }
+        // Load value into array
+        $line=array();
+        for ($i=0; $i<$Max; $i++)
+        {
+            $row=Database::fetch_array($Res, $i);
+            $type=$row['parameter_type'];
+            $line[$type]=$row['parameter_value'];
+        }
+        // save array into g_ variable
+        $array_pref=array('g_theme'=>'THEME',
+            'g_pagesize'=>'PAGESIZE',
+            'g_topmenu'=>'TOPMENU',
+            'g_lang'=>'LANG',
+            'csv_fieldsep'=>'csv_fieldsep',
+            'csv_decimal'=>'csv_decimal',
+            'csv_encoding'=>'csv_encoding',
+            'first_week_day'=>'first_week_day');
+
+        foreach ($array_pref as $name=> $parameter)
+        {
+            if (!isset($line[$parameter]))
+            {
+                $this->insert_default_global_pref($parameter);
+                $this->load_global_pref();
+                return;
+            }
+            $_SESSION[SESSION_KEY.$name]=$line[$parameter];
+        }
+    }
+
+    /**
+     * \brief  insert default pref
+     *        if no parameter are given insert all the existing
+     *        parameter otherwise only the requested
+     * \param $p_type parameter's type or nothing
+     * \param $p_value parameter value
+     *
+     */
+    function insert_default_global_pref($p_type="", $p_value="")
+    {
+
+        $default_parameter=array("THEME"=>"classic",
+            "PAGESIZE"=>"50",
+            'TOPMENU'=>'TEXT',
+            'LANG'=>'fr_FR.utf8',
+            'csv_fieldsep'=>'0',
+            'csv_decimal'=>'0',
+            'csv_encoding'=>'utf8',
+            'first_week_day'=>1
+        );
+        $cn=new Database();
+        $sql="insert into 
user_global_pref(user_id,parameter_type,parameter_value)
              values ($1,$2,$3)";
-               if ($p_type == "")
-               {
-                       foreach ($default_parameter as $name => $value)
-                       {
-                               
$cn->exec_sql($sql,array($this->login,$name,$value));
-                       }
-               }
-               else
-               {
-                       $value = ($p_value == "") ? $default_parameter[$p_type] 
: $p_value;
-                       $cn->exec_sql($sql,array($this->login,$p_type,$value));
-               }
-       }
-
-       /**
-        * \brief  update default pref
-        *           if value is not given then use the default value
-        *
-        * \param $p_type parameter's type
-        * \param $p_value parameter's value value of the type
-        */
-
-       function update_global_pref($p_type, $p_value = "")
-       {
-               $default_parameter = array("THEME" => "classic",
-                                               "PAGESIZE" => "50",
-                                               "LANG" => 'fr_FR.utf8',
-                                               'TOPMENU' => 'SELECT',
-                        'csv_fieldsep'=>'0',
-                        'csv_decimal'=>'0',
-                        'csv_encoding'=>'utf8',
-                                               'first_week_day'=>1
-                    );
-               $cn = new Database();
-               $Sql = "update user_global_pref set parameter_value=$1
+        if ($p_type=="")
+        {
+            foreach ($default_parameter as $name=> $value)
+            {
+                $cn->exec_sql($sql, array($this->login, $name, $value));
+            }
+        }
+        else
+        {
+            $value=($p_value=="")?$default_parameter[$p_type]:$p_value;
+            $cn->exec_sql($sql, array($this->login, $p_type, $value));
+        }
+    }
+
+    /**
+     * \brief  update default pref
+     *           if value is not given then use the default value
+     *
+     * \param $p_type parameter's type
+     * \param $p_value parameter's value value of the type
+     */
+    function update_global_pref($p_type, $p_value="")
+    {
+        $default_parameter=array("THEME"=>"classic",
+            "PAGESIZE"=>"50",
+            "LANG"=>'fr_FR.utf8',
+            'TOPMENU'=>'SELECT',
+            'csv_fieldsep'=>'0',
+            'csv_decimal'=>'0',
+            'csv_encoding'=>'utf8',
+            'first_week_day'=>1
+        );
+        $cn=new Database();
+        $Sql="update user_global_pref set parameter_value=$1
              where parameter_type=$2 and
              user_id=$3";
-               $value = ($p_value == "") ? $default_parameter[$p_type] : 
$p_value;
-               $cn->exec_sql($Sql, array($value, $p_type, $this->login));
-       }
+        $value=($p_value=="")?$default_parameter[$p_type]:$p_value;
+        $cn->exec_sql($Sql, array($value, $p_type, $this->login));
+    }
 
 //end function
-       /**\brief Return the year of current Periode
-        *        it is the parm_periode.p_exercice col
-        *        if an error occurs return 0
-        */
-
-       function get_exercice()
-       {
-               $sql = "select p_exercice from parm_periode where p_id=" . 
$this->get_periode();
-               $Ret = $this->db->exec_sql($sql);
-               if (Database::num_row($Ret) == 1)
-               {
-                       $r = Database::fetch_array($Ret, 0);
-                       return $r['p_exercice'];
-               }
-               else
-                       return 0;
-       }
-
-       /**\brief Check if the user can access
-        * otherwise warn and exit
-        * \param $p_action requested action
-        * \param $p_js = 1 javascript, or 0 just a text or 2 to log it silently
-        * \return nothing the program exits automatically
-        */
-
-       function can_request($p_action, $p_js = 0)
-       {
-               if ($this->check_action($p_action) == 0)
-               {
-                       $this->audit('FAIL');
-                       if ($p_js == 1)
-                       {
-                            echo create_script("alert_box(content[59])");
-                       }
-                       elseif ($p_js == 2) {
-                               record_log(_("Access invalid").$p_action);
-                       }
-                       else
-                       {
-                            echo '<h2 class="error">',
-                            htmlspecialchars(_("Cette action ne vous est pas 
autorisée Contactez votre responsable")),
-                                    '</h2>';
-                            echo '</div>';
-                       }
-                       exit(-1);
-               }
-       }
-
-       /**
-        *@brief Check if the user can print (in menu_ref p_type_display=p)
-        *      otherwise warn and exit
-        * @param $p_action requested action
-        * @return nothing the program exits automatically
-        */
-       function check_print($p_action)
-       {
-               global $audit, $cn;
-               $this->audit('AUDIT', $p_action);
-               if ($this->Admin() == 1)
-                       return 1;
-               
-               $res = $cn->get_value("select count(*) from profile_menu
+    /*     * \brief Return the year of current Periode
+     *        it is the parm_periode.p_exercice col
+     *        if an error occurs return 0
+     */
+
+    function get_exercice()
+    {
+        $sql="select p_exercice from parm_periode where 
p_id=".$this->get_periode();
+        $Ret=$this->db->exec_sql($sql);
+        if (Database::num_row($Ret)==1)
+        {
+            $r=Database::fetch_array($Ret, 0);
+            return $r['p_exercice'];
+        }
+        else
+            return 0;
+    }
+
+    /*     * \brief Check if the user can access
+     * otherwise warn and exit
+     * \param $p_action requested action
+     * \param $p_js = 1 javascript, or 0 just a text or 2 to log it silently
+     * \return nothing the program exits automatically
+     */
+
+    function can_request($p_action, $p_js=0)
+    {
+        if ($this->check_action($p_action)==0)
+        {
+            $this->audit('FAIL');
+            if ($p_js==1)
+            {
+                echo create_script("alert_box(content[59])");
+            }
+            elseif ($p_js==2)
+            {
+                record_log(_("Access invalid").$p_action);
+            }
+            else
+            {
+                echo '<h2 class="error">',
+                htmlspecialchars(_("Cette action ne vous est pas autorisée 
Contactez votre responsable")),
+                '</h2>';
+                echo '</div>';
+            }
+            exit(-1);
+        }
+    }
+
+    /**
+     * @brief Check if the user can print (in menu_ref p_type_display=p)
+     *         otherwise warn and exit
+     * @param $p_action requested action
+     * @return nothing the program exits automatically
+     */
+    function check_print($p_action)
+    {
+        global $audit, $cn;
+        $this->audit('AUDIT', $p_action);
+        if ($this->Admin()==1)
+            return 1;
+
+        $res=$cn->get_value("select count(*) from profile_menu
                        join profile_user using (p_id)
                        where user_name=$1 and me_code=$2 ", 
array($this->login, $p_action));
-               return $res;
-       }
-
-       /**\brief Check if the user can print (in menu_ref p_type_display=p)
-        * otherwise warn and exit
-        * \param $p_action requested action
-        * \return nothing the program exits automatically
-        */
-       function can_print($p_action, $p_js = 0)
-       {
-               if ($this->check_print($p_action) == 0)
-               {
-                       $this->audit('FAIL');
-                       if ($p_js == 1)
-                       {
-                            echo create_script("alert_box(content[59])");
-                       }
-                       else
-                       {
-                            echo '<div class="redcontent">';
-                            echo '<h2 class="error">',
-                            htmlspecialchars(_("Cette action ne vous est pas 
autorisée Contactez votre responsable")),
-                                    '</h2>';
-                            echo '</div>';
-                       }
-                       exit(-1);
-               }
-       }
-
-       /**
-        * \brief  Check if an user is an local administrator
-         * @deprecated since version 6.7
-        *
-        *
-        * \param $p_dossier : dossier_id
-        *
-        * \return
-        *      - 0 if no
-        *      - 1 if yes
-        *
-        */
-
-       function is_local_admin($p_dossier = -1)
-       {
-            return 0;
+        return $res;
+    }
+
+    /*     * \brief Check if the user can print (in menu_ref p_type_display=p)
+     * otherwise warn and exit
+     * \param $p_action requested action
+     * \return nothing the program exits automatically
+     */
+
+    function can_print($p_action, $p_js=0)
+    {
+        if ($this->check_print($p_action)==0)
+        {
+            $this->audit('FAIL');
+            if ($p_js==1)
+            {
+                echo create_script("alert_box(content[59])");
+            }
+            else
+            {
+                echo '<div class="redcontent">';
+                echo '<h2 class="error">',
+                htmlspecialchars(_("Cette action ne vous est pas autorisée 
Contactez votre responsable")),
+                '</h2>';
+                echo '</div>';
+            }
+            exit(-1);
         }
-       /**
-        *@brief return array of available repository
-        *
-        * @param $p_access  R for read W for write
-        * @return an array
-        */
-       function get_available_repository($p_access='R')
-       {
-                $profile=$this->get_profile();
-                $r=array();
-               if ($p_access=='R')
-               {
-                       $r=$this->db->get_array("select distinct u.r_id,r_name
+    }
+
+    /**
+     * \brief  Check if an user is an local administrator
+     * @deprecated since version 6.7
+     *
+     *
+     * \param $p_dossier : dossier_id
+     *
+     * \return
+     *         - 0 if no
+     *      - 1 if yes
+     *
+     */
+    function is_local_admin($p_dossier=-1)
+    {
+        return 0;
+    }
+
+    /**
+     * @brief return array of available repository
+     *
+     * @param $p_access  R for read W for write
+     * @return an array
+     */
+    function get_available_repository($p_access='R')
+    {
+        $profile=$this->get_profile();
+        $r=array();
+        if ($p_access=='R')
+        {
+            $r=$this->db->get_array("select distinct u.r_id,r_name
                 from
                                        profile_sec_repository as u
                                        join stock_repository as s 
on(u.r_id=s.r_id)
@@ -1056,204 +1117,201 @@ class User
                 p_id =$1
                 and ur_right='W'
                                order by 2
-                               ",array($profile));
-               }
-               if ($p_access == 'W')
-               {
-                        $r=$this->db->get_array("select distinct u.r_id,r_name
+                               ", array($profile));
+        }
+        if ($p_access=='W')
+        {
+            $r=$this->db->get_array("select distinct u.r_id,r_name
                 from
                                        profile_sec_repository as u
                                        join stock_repository as s 
on(u.r_id=s.r_id)
                 where
                 p_id =$1 order by 2
-               ",array($profile));
-               }
-               return $r;
-       }
-       /**
-        * \brief return an array with all the active users who can access 
-         *  $p_dossier including the global admin. 
-         *  The user must be activated
-        *
-        * \param $p_dossier dossier
-        * \return an array of user's  object
-        *  array indices
-        *    - use_id (id )
-        *    - use_login (login of the user)
-        *    - use_name
-        *    - use_first_name
-        *
-        * \exception throw an exception if nobody can access
-        */
-
-       static function get_list($p_dossier)
-       {
-               $sql = "select distinct 
use_id,use_login,use_first_name,use_name from ac_users
+               ", array($profile));
+        }
+        return $r;
+    }
+
+    /**
+     * \brief return an array with all the active users who can access 
+     *  $p_dossier including the global admin. 
+     *  The user must be activated
+     *
+     * \param $p_dossier dossier
+     * \return an array of user's  object
+     *  array indices
+     *    - use_id (id )
+     *    - use_login (login of the user)
+     *    - use_name
+     *    - use_first_name
+     *
+     * \exception throw an exception if nobody can access
+     */
+    static function get_list($p_dossier)
+    {
+        $sql="select distinct use_id,use_login,use_first_name,use_name from 
ac_users
              left outer join  jnt_use_dos using (use_id)
              where
               (dos_id=$1 and use_active=1) or (use_active=1 and use_admin=1)
               order by use_login,use_name";
 
+        $repo=new Database();
+        $array=$repo->get_array($sql, array($p_dossier));
+        if ($repo->size()==0)
+            throw new Exception('Error inaccessible folder');
+        return $array;
+    }
 
-               $repo = new Database();
-               $array = $repo->get_array($sql, array($p_dossier));
-               if ($repo->size() == 0)
-                       throw new Exception('Error inaccessible folder');
-               return $array;
-       }
-
-       /**
-        * \brief check the access of an user on a ledger
-        *
-        * \param $p_jrn the ledger id
-        * \return
-        * - O only predefined operation
-        * - W write
-        * - R read only
-        * - X no access
-        *
-        */
-
-       function check_jrn($p_jrn)
-       {
-               return $this->get_ledger_access($p_jrn);
-       }
-
-       /**
-         * \brief check if an user can access a folder, if he cannot display a 
dialog box
-        * and exit
-        * \param the folder if
-        * \param $silent false, echo an error message and exit, true : exit 
without warning
-        * default is false
-        * \return
-        *  - L for administrator (local and global)
-        *  - X no access
-        *  - R regular user
-        */
-
-       function check_dossier($p_dossier_id, $silent = false)
-       {
-               $this->Admin();
-               if ($this->admin == 1 || $this->is_local_admin($p_dossier_id) 
== 1)
-                       return 'L';
-               $cn = new Database();
-
-               $dossier = $cn->get_value("select 'R' from jnt_use_dos where 
dos_id=$1 and use_id=$2", array($p_dossier_id, $this->id));
-               $dossier = ($dossier == '') ? 'X' : $dossier;
-               if ($dossier == 'X')
-               {
-                       $this->audit('FAIL', "Access folder ");
-                       if (!$silent)
-                       {
-                               alert(_('Dossier non accessible'));
-                                exit();
-                       }
-               }
-               return $dossier;
-       }
-
-       /**
-        * @brief return the first date and the last date of the current 
exercice for the current user
-        * @return and array ([0] => start_date,[1] => end_date)
-        */
-       function get_limit_current_exercice()
-       {
-               $current_exercice = $this->get_exercice();
-               $periode = new Periode($this->db);
-               list($per_start, $per_end) = 
$periode->get_limit($current_exercice);
-               $start = $per_start->first_day();
-               $end = $per_end->last_day();
-               return array($start, $end);
-       }
-
-       /**
-        * \brief   Show all the available folder  for the users
-        *          at the login page. For the special case 'E'
-        *          go directly to extension and bypasse the dashboard
-        * \param $p_filtre user
-        *
-        * \return table in HTML
-        *
-        */
-
-       function show_dossier($p_filtre = "")
-       {
-               $p_array = $this->get_available_folder($p_filtre);
-
-               $result = "";
-               
-               $result.="<TABLE id=\"folder\" class=\"result\">";
-                $result.="<tr>";
-                $result.="<th>";
-                $result.=_("Id");
-                $result.="</th>";
-                $result.="<th>";
-                $result.=_("Nom");
-                $result.="</th>";
-                $result.="<th>";
-                $result.=_("Description");
-                $result.="</th>";
-                $result.="</tr>";
-                if ($p_array == 0) {
-                    $result.="<tr>";
-                    $result.='<td style="width:auto" colspan=3>';
-                    $result.=_("Aucun dossier disponible");
-                    $result.='</td>';
-                    $result.="</tr>";
-                    return $result;
-                }
-                
-               for ($i = 0; $i < sizeof($p_array); $i++)
-               {
-
-                       $id = $p_array[$i]['dos_id'];
-                       $name = $p_array[$i]['dos_name'];
-                       $desc = $p_array[$i]['dos_description'];
-                       if ($i % 2 == 0)
-                               $tr = "odd";
-                       else
-                               $tr = "even";
-                       $target = "do.php?gDossier=$id";
-
-                       $result.="<TR class=\"$tr\">";
-
-                       $result.=td($id, ' class="num" ');
-                       $result.="<TD class=\"$tr\">";
-                       $result.="<A class=\"dossier\" HREF=\"$target\">";
-                       $result.= "  <B>" . h($name) . "</B>";
-                       $result.="</A>";
-                       $result.="</TD>";
-                       $desc = ($desc == "") ? "<i>Aucune description</i>" : 
h($desc);
-                       $desc = "<A class=\"dossier\" 
HREF=\"$target\">$desc</A>";
-                       $result.="<TD class=\"$tr\" >" . $desc;
-                       $result.="</TD>";
-                       $result.="</TR>";
-               }
-               $result.="</TABLE>";
-               return $result;
-       }
-
-       /**
-        * \brief   Get all the available folders
-        *          for the users, checked with the security
-        *
-        * \param  $p_filter
-        * \return array containing
-        *       - ac_dossier.dos_id
-        *       - ac_dossier.dos_name
-        *       - ac_dossier.dos_description
-        *
-        */
-
-       function get_available_folder($p_filter = "")
-       {
-               $cn = new Database();
-               $filter = "";
-               if ($this->admin == 0)
-               {
-                       // show only available folders
-                       // if user is not an admin
-                       $Res = $cn->exec_sql("select 
+    /**
+     * \brief check the access of an user on a ledger
+     *
+     * \param $p_jrn the ledger id
+     * \return
+     * - O only predefined operation
+     * - W write
+     * - R read only
+     * - X no access
+     *
+     */
+    function check_jrn($p_jrn)
+    {
+        return $this->get_ledger_access($p_jrn);
+    }
+
+    /**
+     * \brief check if an user can access a folder, if he cannot display a 
dialog box
+     * and exit
+     * \param the folder if
+     * \param $silent false, echo an error message and exit, true : exit 
without warning
+     * default is false
+     * \return
+     *  - L for administrator (local and global)
+     *  - X no access
+     *  - R regular user
+     */
+    function check_dossier($p_dossier_id, $silent=false)
+    {
+        $this->Admin();
+        if ($this->admin==1||$this->is_local_admin($p_dossier_id)==1)
+            return 'L';
+        $cn=new Database();
+
+        $dossier=$cn->get_value("select 'R' from jnt_use_dos where dos_id=$1 
and use_id=$2",
+                array($p_dossier_id, $this->id));
+        $dossier=($dossier=='')?'X':$dossier;
+        if ($dossier=='X')
+        {
+            $this->audit('FAIL', "Access folder ");
+            if (!$silent)
+            {
+                alert(_('Dossier non accessible'));
+                exit();
+            }
+        }
+        return $dossier;
+    }
+
+    /**
+     * @brief return the first date and the last date of the current exercice 
for the current user
+     * @return and array ([0] => start_date,[1] => end_date)
+     */
+    function get_limit_current_exercice()
+    {
+        $current_exercice=$this->get_exercice();
+        $periode=new Periode($this->db);
+        list($per_start, $per_end)=$periode->get_limit($current_exercice);
+        $start=$per_start->first_day();
+        $end=$per_end->last_day();
+        return array($start, $end);
+    }
+
+    /**
+     * \brief   Show all the available folder  for the users
+     *          at the login page. For the special case 'E'
+     *          go directly to extension and bypasse the dashboard
+     * \param $p_filtre user
+     *
+     * \return table in HTML
+     *
+     */
+    function show_dossier($p_filtre="")
+    {
+        $p_array=$this->get_available_folder($p_filtre);
+
+        $result="";
+
+        $result.="<TABLE id=\"folder\" class=\"result\">";
+        $result.="<tr>";
+        $result.="<th>";
+        $result.=_("Id");
+        $result.="</th>";
+        $result.="<th>";
+        $result.=_("Nom");
+        $result.="</th>";
+        $result.="<th>";
+        $result.=_("Description");
+        $result.="</th>";
+        $result.="</tr>";
+        if ($p_array==0)
+        {
+            $result.="<tr>";
+            $result.='<td style="width:auto" colspan=3>';
+            $result.=_("Aucun dossier disponible");
+            $result.='</td>';
+            $result.="</tr>";
+            return $result;
+        }
+
+        for ($i=0; $i<sizeof($p_array); $i++)
+        {
+
+            $id=$p_array[$i]['dos_id'];
+            $name=$p_array[$i]['dos_name'];
+            $desc=$p_array[$i]['dos_description'];
+            if ($i%2==0)
+                $tr="odd";
+            else
+                $tr="even";
+            $target="do.php?gDossier=$id";
+
+            $result.="<TR class=\"$tr\">";
+
+            $result.=td($id, ' class="num" ');
+            $result.="<TD class=\"$tr\">";
+            $result.="<A class=\"dossier\" HREF=\"$target\">";
+            $result.="  <B>".h($name)."</B>";
+            $result.="</A>";
+            $result.="</TD>";
+            $desc=($desc=="")?"<i>Aucune description</i>":h($desc);
+            $desc="<A class=\"dossier\" HREF=\"$target\">$desc</A>";
+            $result.="<TD class=\"$tr\" >".$desc;
+            $result.="</TD>";
+            $result.="</TR>";
+        }
+        $result.="</TABLE>";
+        return $result;
+    }
+
+    /**
+     * \brief   Get all the available folders
+     *          for the users, checked with the security
+     *
+     * \param  $p_filter
+     * \return array containing
+     *       - ac_dossier.dos_id
+     *       - ac_dossier.dos_name
+     *       - ac_dossier.dos_description
+     *
+     */
+    function get_available_folder($p_filter="")
+    {
+        $cn=new Database();
+        $filter="";
+        if ($this->admin==0)
+        {
+            // show only available folders
+            // if user is not an admin
+            $Res=$cn->exec_sql("select 
                                                distinct 
dos_id,dos_name,dos_description 
                             from ac_users
                                                                natural join 
jnt_use_dos
@@ -1263,241 +1321,271 @@ class User
                                                                and use_active 
= 1
                                                                and ( dos_name 
ilike '%' || $2 || '%' or dos_description ilike '%' || $2 || '%' )
                             order by dos_name", array($this->login, 
$p_filter));
-               }
-               else
-               {
-                       $Res = $cn->exec_sql("select 
+        }
+        else
+        {
+            $Res=$cn->exec_sql("select 
                        distinct dos_id,dos_name,dos_description from ac_dossier
              where   
                    dos_name  ilike '%' || $1|| '%' or dos_description ilike 
'%' || $1 || '%' 
                          order by dos_name", array($p_filter));
-               }
-
-               $max = Database::num_row($Res);
-               if ($max == 0)
-                       return 0;
-
-               for ($i = 0; $i < $max; $i++)
-               {
-                       $array[] = Database::fetch_array($Res, $i);
-               }
-               return $array;
-       }
-
-       /**
-        * Audit action from the administration menu
-        * @param $p_module description of the action
-        */
-       static function audit_admin($p_module) {
-               $cn = new Database();
-               $sql = "insert into audit_connect 
(ac_user,ac_ip,ac_module,ac_url,ac_state) values ($1,$2,$3,$4,$5)";
-
-               $cn->exec_sql($sql, array(
-                       $_SESSION[SESSION_KEY.'g_user'],
-                       $_SERVER["REMOTE_ADDR"],
-                       $p_module,
-                       $_SERVER['REQUEST_URI'],
-                       'ADMIN'));
-       }
-       function audit($action = 'AUDIT', $p_module = "")
-       {
-               global $audit;
-               if ($audit)
-               {
-                       if ($p_module == "" && isset($_REQUEST['ac']))
-                       {
-                               $p_module = $_REQUEST['ac'];
-                       }
-                       $cn = new Database();
-                       if (isset($_REQUEST['gDossier']))
-                               $p_module.= " dossier : " . 
$_REQUEST['gDossier'];
-                       $sql = "insert into audit_connect 
(ac_user,ac_ip,ac_module,ac_url,ac_state) values ($1,$2,$3,$4,$5)";
-
-                       $cn->exec_sql($sql, array(
-                               $_SESSION[SESSION_KEY.'g_user'],
-                               $_SERVER["REMOTE_ADDR"],
-                               $p_module,
-                               $_SERVER['REQUEST_URI'],
-                               $action));
-               }
-       }
-
-       function save_profile($p_id)
-       {
-               $count = $this->db->get_value("select count(*) from 
profile_user where user_name=$1", array($this->login));
-               if ($count == 0)
-               {
-                       $this->db->exec_sql("insert into 
profile_user(p_id,user_name)
+        }
+
+        $max=Database::num_row($Res);
+        if ($max==0)
+            return 0;
+
+        for ($i=0; $i<$max; $i++)
+        {
+            $array[]=Database::fetch_array($Res, $i);
+        }
+        return $array;
+    }
+
+    /**
+     * Audit action from the administration menu
+     * @param $p_module description of the action
+     */
+    static function audit_admin($p_module)
+    {
+        $cn=new Database();
+        $sql="insert into audit_connect 
(ac_user,ac_ip,ac_module,ac_url,ac_state) values ($1,$2,$3,$4,$5)";
+
+        $cn->exec_sql($sql,
+                array(
+                    $_SESSION[SESSION_KEY.'g_user'],
+                    $_SERVER["REMOTE_ADDR"],
+                    $p_module,
+                    $_SERVER['REQUEST_URI'],
+                    'ADMIN'));
+    }
+
+    function audit($action='AUDIT', $p_module="")
+    {
+        global $audit;
+        if ($audit)
+        {
+            if ($p_module==""&&isset($_REQUEST['ac']))
+            {
+                $p_module=$_REQUEST['ac'];
+            }
+            $cn=new Database();
+            if (isset($_REQUEST['gDossier']))
+                $p_module.=" dossier : ".$_REQUEST['gDossier'];
+            $sql="insert into audit_connect 
(ac_user,ac_ip,ac_module,ac_url,ac_state) values ($1,$2,$3,$4,$5)";
+
+            $cn->exec_sql($sql,
+                    array(
+                        $_SESSION[SESSION_KEY.'g_user'],
+                        $_SERVER["REMOTE_ADDR"],
+                        $p_module,
+                        $_SERVER['REQUEST_URI'],
+                        $action));
+        }
+    }
+
+    function save_profile($p_id)
+    {
+        $count=$this->db->get_value("select count(*) from profile_user where 
user_name=$1", array($this->login));
+        if ($count==0)
+        {
+            $this->db->exec_sql("insert into profile_user(p_id,user_name)
                                                                values 
($1,$2)", array($p_id, $this->login));
-               }
-               else
-               {
-                       $this->db->exec_sql("update profile_user set p_id=$1 
where user_name=$2", array($p_id, $this->login));
-               }
-       }
-        /**
-         *return the profile (p_id)
-         * @return profile.p_id
-         */
-       function get_profile()
-       {
-               $profile = $this->db->get_value("select p_id from profile_user 
where
+        }
+        else
+        {
+            $this->db->exec_sql("update profile_user set p_id=$1 where 
user_name=$2", array($p_id, $this->login));
+        }
+    }
+
+    /**
+     * return the profile (p_id)
+     * @return profile.p_id
+     */
+    function get_profile()
+    {
+        $profile=$this->db->get_value("select p_id from profile_user where
                                lower(user_name)=lower($1)", 
array($this->login));
-               return $profile;
-       }
-        /**
-        * Compute the SQL string for the writable profile, 
-         * the subselect for p_id , example
-        * p_id in $g_user->get_writable_profile.
-        * The administrator can access all the profiles
-        * @return SQL string with the subselect for p_id 
-        */
-       function get_writable_profile() 
-       {
-           if ( $this->admin != 1)
-           {
-               $sql = " (select p_granted "
-                   . "     from user_sec_action_profile "
-                   . "     where ua_right='W' and 
p_id=".$this->get_profile().") ";
-           } else {
-               $sql = "(select p_id from profile)";
-           }
-           return $sql;
-       }
-        /**
-        * Compute the SQL string for the readable profile, 
-         * the subselect for p_id , example
-        * p_id in $g_user->get_readable_profile.
-        * The administrator can read all the profiles
-        * @return SQL string with the subselect for p_id 
-        */
-       function get_readable_profile() 
-       {
-           if ( $this->admin != 1)
-           {
-               $sql = " (select p_granted "
-                   . "     from user_sec_action_profile "
-                   . "     where ua_right in ('W','R') and 
p_id=".$this->get_profile().") ";
-           } else {
-               $sql = "(select p_id from profile)";
-           }
-           return $sql;
-       }
-        /**
-         * Check if the current user can add an action in the profile given
-         * in parameter
-         * @param type $p_profile profile.p_id = action_gestion.ag_dest
-         * @return boolean
-         */
-        function can_add_action($p_profile)
+        return $profile;
+    }
+
+    /**
+     * Compute the SQL string for the writable profile, 
+     * the subselect for p_id , example
+     * p_id in $g_user->get_writable_profile.
+     * The administrator can access all the profiles
+     * @return SQL string with the subselect for p_id 
+     */
+    function get_writable_profile()
+    {
+        if ($this->admin!=1)
+        {
+            $sql=" (select p_granted "
+                    ."     from user_sec_action_profile "
+                    ."     where ua_right='W' and 
p_id=".$this->get_profile().") ";
+        }
+        else
+        {
+            $sql="(select p_id from profile)";
+        }
+        return $sql;
+    }
+
+    /**
+     * Compute the SQL string for the readable profile, 
+     * the subselect for p_id , example
+     * p_id in $g_user->get_readable_profile.
+     * The administrator can read all the profiles
+     * @return SQL string with the subselect for p_id 
+     */
+    function get_readable_profile()
+    {
+        if ($this->admin!=1)
+        {
+            $sql=" (select p_granted "
+                    ."     from user_sec_action_profile "
+                    ."     where ua_right in ('W','R') and 
p_id=".$this->get_profile().") ";
+        }
+        else
         {
-            $r=$this->db->get_value (' select count(*) 
+            $sql="(select p_id from profile)";
+        }
+        return $sql;
+    }
+
+    /**
+     * Check if the current user can add an action in the profile given
+     * in parameter
+     * @param type $p_profile profile.p_id = action_gestion.ag_dest
+     * @return boolean
+     */
+    function can_add_action($p_profile)
+    {
+        $r=$this->db->get_value(' select count(*) 
                 from user_sec_action_profile
                 where p_granted=$2
-                and p_id=$1',
-                    array($this->get_profile(),$p_profile));
-            if ($r == 0 ) 
-            {
-                return false;
-            } 
-            return true;
+                and p_id=$1', array($this->get_profile(), $p_profile));
+        if ($r==0)
+        {
+            return false;
         }
-        /**
-         *Check if the profile of the user can write for this profile
-         * @param  $dtoc action_gestion.ag_id
-         * @return true if he can write otherwise false
-         */
-       function can_write_action($dtoc)
-       {
-            if ( $this->Admin() == 1 ) return TRUE;
-            if ( $this->get_status_security_action()==0)                return 
TRUE;
-            $profile = $this->get_profile();
-                    $r = $this->db->get_value(" select count(*) from 
action_gestion where ag_id=$1 and ag_dest in
+        return true;
+    }
+
+    /**
+     * Check if the profile of the user can write for this profile
+     * @param  $dtoc action_gestion.ag_id
+     * @return true if he can write otherwise false
+     */
+    function can_write_action($dtoc)
+    {
+        if ($this->Admin()==1)
+            return TRUE;
+        if ($this->get_status_security_action()==0)
+            return TRUE;
+        $profile=$this->get_profile();
+        $r=$this->db->get_value(" select count(*) from action_gestion where 
ag_id=$1 and ag_dest in
                                (select p_granted from user_sec_action_profile 
where ua_right in ('W','O') and p_id=$2) ", array($dtoc, $profile));
-               if ($r == 0)
-                       return FALSE;
-               return true;
-       }
-         /**
-         *Check if the profile of the user can write AND delete for this 
profile
-         * @param  $dtoc action_gestion.ag_id
-         * @return true if he can write otherwise false
-         */
-       function can_delete_action($dtoc)
-       {
-            if ( $this->Admin() == 1 ) return TRUE;
-            if ( $this->get_status_security_action()==0)                return 
TRUE;
-            $profile = $this->get_profile();
-                    $r = $this->db->get_value(" select count(*) from 
action_gestion where ag_id=$1 and ag_dest in
+        if ($r==0)
+            return FALSE;
+        return true;
+    }
+
+    /**
+     * Check if the profile of the user can write AND delete for this profile
+     * @param  $dtoc action_gestion.ag_id
+     * @return true if he can write otherwise false
+     */
+    function can_delete_action($dtoc)
+    {
+        if ($this->Admin()==1)
+            return TRUE;
+        if ($this->get_status_security_action()==0)
+            return TRUE;
+        $profile=$this->get_profile();
+        $r=$this->db->get_value(" select count(*) from action_gestion where 
ag_id=$1 and ag_dest in
                                (select p_granted from user_sec_action_profile 
where ua_right='W' and p_id=$2) ", array($dtoc, $profile));
-               if ($r == 0)
-                       return FALSE;
-               return true;
-       }
-
-        /**
-         *Check if the profile of the user can write for this profile
-         * @param  $dtoc action_gestion.ag_id
-         * @return true if he can write otherwise false
-         */
-       function can_read_action($dtoc)
-       {
-                if ( $this->Admin() == 1 ) return true;
-               $profile = $this->get_profile();
-               $r = $this->db->get_value(" select count(*) from action_gestion 
where ag_id=$1 and (ag_dest in
-                               (select p_granted from user_sec_action_profile 
where p_id=$2) or ag_owner=$3)", array($dtoc, $profile, $this->login));
-               if ($r == 0)
-                       return false;
-               return true;
-       }
-        /**
-         *Check if the profile of the user can write for this repository
-         * @param  $p_repo stock_repository.r_id
-         * @return true if he can write otherwise false
-         */
-        function can_write_repo($p_repo)
-        {
-            if ( $this->Admin() == 1 ) return true;
-            $profile=$this->get_profile();
-            $r=$this->db->get_value("select count(*)
+        if ($r==0)
+            return FALSE;
+        return true;
+    }
+
+    /**
+     * Check if the profile of the user can write for this profile
+     * @param  $dtoc action_gestion.ag_id
+     * @return true if he can write otherwise false
+     */
+    function can_read_action($dtoc)
+    {
+        if ($this->Admin()==1)
+            return true;
+        $profile=$this->get_profile();
+        $r=$this->db->get_value(" select count(*) from action_gestion where 
ag_id=$1 and (ag_dest in
+                               (select p_granted from user_sec_action_profile 
where p_id=$2) or ag_owner=$3)",
+                array($dtoc, $profile, $this->login));
+        if ($r==0)
+            return false;
+        return true;
+    }
+
+    /**
+     * Check if the profile of the user can write for this repository
+     * @param  $p_repo stock_repository.r_id
+     * @return true if he can write otherwise false
+     */
+    function can_write_repo($p_repo)
+    {
+        if ($this->Admin()==1)
+            return true;
+        $profile=$this->get_profile();
+        $r=$this->db->get_value("select count(*)
                 from profile_sec_repository
                 where
                 r_id=$1
                 and p_id =$2
-                and ur_right='W'",array($p_repo,$profile));
-            if ( $r==0)
-                return false;
+                and ur_right='W'", array($p_repo, $profile));
+        if ($r==0)
+            return false;
+        return true;
+    }
+
+    /**
+     * Check if the profile of the user can read for this repository
+     * @param  $p_repo stock_repository.r_id
+     * @return true if he read write otherwise false
+     */
+    function can_read_repo($p_repo)
+    {
+        if ($this->Admin()==1)
             return true;
-        }
-       /**
-         *Check if the profile of the user can read for this repository
-         * @param  $p_repo stock_repository.r_id
-         * @return true if he read write otherwise false
-         */
-        function can_read_repo($p_repo)
-        {
-            if ( $this->Admin() == 1 ) return true;
-            $profile=$this->get_profile();
-            $r=$this->db->get_value("select count(*)
+        $profile=$this->get_profile();
+        $r=$this->db->get_value("select count(*)
                 from profile_sec_repository
                 where
                 r_id=$1
                 and p_id =$2
-               ",array($p_repo,$profile));
-            if ( $r==0)
-                return false;
-            return true;
+               ", array($p_repo, $profile));
+        if ($r==0)
+            return false;
+        return true;
+    }
+
+    function save_password($p_pass1, $p_pass2)
+    {
+        if ($p_pass1==$p_pass2)
+        {
+            $repo=new Database();
+            $l_pass=md5($_POST['pass_1']);
+            $repo->exec_sql("update ac_users set use_pass=$1 where 
use_login=$2",
+                    array($l_pass, $_SESSION[SESSION_KEY.'g_user']));
+            $_SESSION[SESSION_KEY.'g_pass']=$_POST['pass_1'];
         }
-   function save_password($p_pass1, $p_pass2) {
-        if ($p_pass1 == $p_pass2) {
-            $repo = new Database();
-            $l_pass = md5($_POST['pass_1']);
-            $repo->exec_sql("update ac_users set use_pass=$1 where 
use_login=$2", array($l_pass, $_SESSION[SESSION_KEY.'g_user']));
-            $_SESSION[SESSION_KEY.'g_pass'] = $_POST['pass_1'];
-        } else {
+        else
+        {
             alert(_("Les mots de passe ne correspondent pas. Mot de passe 
inchangé"));
         }
     }
+
     /**
      * Save the password from PREFERENCE MODULE
      * @param type $p_email
@@ -1505,104 +1593,108 @@ class User
     function save_email($p_email)
     {
         $repo=new Database();
-        $repo->exec_sql("update ac_users set use_email=$1 where use_login=$2", 
array($p_email, $_SESSION[SESSION_KEY.'g_user']));
+        $repo->exec_sql("update ac_users set use_email=$1 where use_login=$2",
+                array($p_email, $_SESSION[SESSION_KEY.'g_user']));
     }
+
     /**
      * Remove a user and all his privileges
      * So it cannot connect anymore and all his privileges are removed from
      * the dossier
      * 
      */
-    static function revoke_access($p_login,$p_dossier) {
+    static function revoke_access($p_login, $p_dossier)
+    {
         // connect to the repository
         $repo_cnx=new Database();
-        
+
         // Retrieve the user
-        $user=$repo_cnx->get_array('select use_id,use_login from ac_users 
where use_login=$1',
-                array($p_login));
-        if ( ! $user ) return false;
-        
+        $user=$repo_cnx->get_array('select use_id,use_login from ac_users 
where use_login=$1', array($p_login));
+        if (!$user)
+            return false;
+
         // remove him from jnt_use_dos
         $repo_cnx->exec_sql("delete from jnt_use_dos WHERE use_id=$1 and 
dos_id=$2",
-            array($user[0]['use_id'],$p_dossier));
+                array($user[0]['use_id'], $p_dossier));
 
         // Remove user from user's dossier
         $cn_dossier=new Database($p_dossier);
-        $cn_dossier->exec_sql("delete from profile_user where 
user_name=$1",array($p_login));
-        $cn_dossier->exec_sql("delete from user_sec_act where 
ua_login=$1",array($p_login));
-            
+        $cn_dossier->exec_sql("delete from profile_user where user_name=$1", 
array($p_login));
+        $cn_dossier->exec_sql("delete from user_sec_act where ua_login=$1", 
array($p_login));
     }
-    
+
     /**
      * Grant access to folder, grant administrator profile , all the ledgers 
and all the action
      * 
      */
-    static function grant_admin_access($p_login,$p_dossier) 
+    static function grant_admin_access($p_login, $p_dossier)
     {
-         $repo_cnx=new Database();
+        $repo_cnx=new Database();
         $user=$repo_cnx->get_array("select use_id,use_login
                                 from ac_users
                                 where use_login=$1", array($p_login));
 
-        if ( ! $user ) return false;
+        if (!$user)
+            return false;
         $cn_dossier=new Database($p_dossier);
         // if not access to DB
-        if ( 
+        if (
                 $repo_cnx->get_value("select count(*) from jnt_use_dos where 
use_id=$1 and dos_id=$2",
-                        array($user[0]['use_id'],$p_dossier)) == 0
-                )
+                        array($user[0]['use_id'], $p_dossier))==0
+        )
         {
             $repo_cnx->exec_sql("insert into jnt_use_dos(use_id,dos_id) values 
($1,$2)",
-                array($user[0]['use_id'], $p_dossier));
+                    array($user[0]['use_id'], $p_dossier));
         }
         //------  Give him the admin menu
-        if ( $cn_dossier->get_value("select count(*) from profile_user where 
user_name=$1",
-                array($user[0]['use_login'])) == 0)
+        if ($cn_dossier->get_value("select count(*) from profile_user where 
user_name=$1", array($user[0]['use_login']))==0)
         {
-            $cn_dossier->exec_sql('insert into profile_user(user_name,p_id) 
values($1,1)',
-                    array($user[0]['use_login']));
+            $cn_dossier->exec_sql('insert into profile_user(user_name,p_id) 
values($1,1)', array($user[0]['use_login']));
         }
         // Grant all action + ledger to him
-        $cn_dossier->exec_sql("delete from user_sec_act where 
ua_login=$1",array($p_login));
+        $cn_dossier->exec_sql("delete from user_sec_act where ua_login=$1", 
array($p_login));
 
         $cn_dossier->exec_sql("insert into user_sec_act (ua_login,ua_act_id)"
-                ." select $1 ,ac_id from action ",array($p_login));
+                ." select $1 ,ac_id from action ", array($p_login));
 
-        $cn_dossier->exec_sql("delete from user_sec_jrn where 
uj_login=$1",array($p_login));
+        $cn_dossier->exec_sql("delete from user_sec_jrn where uj_login=$1", 
array($p_login));
         $cn_dossier->exec_sql("insert into 
user_sec_jrn(uj_login,uj_jrn_id,uj_priv)"
-                ." select $1,jrn_def_id,'W' from jrn_def",
-                        array($p_login));
-
-
+                ." select $1,jrn_def_id,'W' from jrn_def", array($p_login));
     }
+
     static function remove_inexistant_user($p_dossier)
     {
         $cnx_repo=new Database();
-        $name=$cnx_repo->format_name($p_dossier,'dos');
-        if ($cnx_repo->exist_database($name) == 0 )return;
+        $name=$cnx_repo->format_name($p_dossier, 'dos');
+        if ($cnx_repo->exist_database($name)==0)
+            return;
         $cnx_dossier=new Database($p_dossier);
-               if ($cnx_dossier->exist_table('profile_user'))
-         $a_user=$cnx_dossier->get_array('select user_name from profile_user');
-               else
-                       return;
+        if ($cnx_dossier->exist_table('profile_user'))
+            $a_user=$cnx_dossier->get_array('select user_name from 
profile_user');
+        else
+            return;
 
-        if ( ! $a_user ) return;
+        if (!$a_user)
+            return;
         $nb=count($a_user);
-        for ($i=0;$i < $nb;$i++) {
-            if ( $cnx_repo->get_value('select count(*) from ac_users where 
use_login=$1',
-                    array($a_user[$i]['user_name'])) == 0) {
-               if ($cnx_dossier->exist_table('user_sec_jrn'))
-                       $cnx_dossier->exec_sql("delete from user_sec_jrn where 
uj_login=$1",array($a_user[$i]['user_name']));
-               $cnx_dossier->exec_sql("delete from profile_user where 
user_name=$1",array($a_user[$i]['user_name']));
-                               if ($cnx_dossier->exist_table('user_sec_act'))
-                           $cnx_dossier->exec_sql("delete from user_sec_act 
where ua_login=$1",array($a_user[$i]['user_name']));
-                               if ($cnx_dossier->exist_table('user_sec_jrn'))
-                 $cnx_dossier->exec_sql("delete from user_sec_jrn where 
uj_login=$1",array($a_user[$i]['user_name']));
-                               if 
($cnx_dossier->exist_table('user_active_security'))
-                  $cnx_dossier->exec_sql("delete from user_active_security 
where us_login=$1",array($a_user[$i]['user_name']));
+        for ($i=0; $i<$nb; $i++)
+        {
+            if ($cnx_repo->get_value('select count(*) from ac_users where 
use_login=$1', array($a_user[$i]['user_name']))==0)
+            {
+                if ($cnx_dossier->exist_table('user_sec_jrn'))
+                    $cnx_dossier->exec_sql("delete from user_sec_jrn where 
uj_login=$1", array($a_user[$i]['user_name']));
+                $cnx_dossier->exec_sql("delete from profile_user where 
user_name=$1", array($a_user[$i]['user_name']));
+                if ($cnx_dossier->exist_table('user_sec_act'))
+                    $cnx_dossier->exec_sql("delete from user_sec_act where 
ua_login=$1", array($a_user[$i]['user_name']));
+                if ($cnx_dossier->exist_table('user_sec_jrn'))
+                    $cnx_dossier->exec_sql("delete from user_sec_jrn where 
uj_login=$1", array($a_user[$i]['user_name']));
+                if ($cnx_dossier->exist_table('user_active_security'))
+                    $cnx_dossier->exec_sql("delete from user_active_security 
where us_login=$1",
+                            array($a_user[$i]['user_name']));
             }
         }
     }
+
     /**
      * Check the security on ledger for the user , it returns 1 if the 
security 
      * on ledgers is enabled, otherwise 0 
@@ -1611,10 +1703,11 @@ class User
     {
         $security=$this->db->get_value("select us_ledger from 
user_active_security 
                 where 
-                us_login=$1",[$this->login]);
-        $n_security =($security=="Y")?1:0;
+                us_login=$1", [$this->login]);
+        $n_security=($security=="Y")?1:0;
         return $n_security;
     }
+
     /**
      * Set the flag in the table user_active_security
      * @param int $p_value 1==enable  , 0 = disable
@@ -1622,16 +1715,22 @@ class User
      */
     function set_status_security_ledger($p_value)
     {
-        if ($p_value != 0 && $p_value != 1) throw new Exception (_("Valeur 
invalide"));
-        $exist=$this->db->get_value("select count(*) from user_active_security 
where us_login=$1",
-                [$this->login]);
+        if ($p_value!=0&&$p_value!=1)
+            throw new Exception(_("Valeur invalide"));
+        $exist=$this->db->get_value("select count(*) from user_active_security 
where us_login=$1", [$this->login]);
         $flag=($p_value==1)?"Y":"N";
-        if ( $exist == 0) {
-            $this->db->exec_sql("insert into user_active_security 
(us_login,us_ledger,us_action) values ($1,$2,$3)",[$this->login,$flag,'Y']);
-        } else {
-            $this->db->exec_sql("update user_active_security set us_ledger=$1 
where us_login = $2",[$flag,$this->login]);
+        if ($exist==0)
+        {
+            $this->db->exec_sql("insert into user_active_security 
(us_login,us_ledger,us_action) values ($1,$2,$3)",
+                    [$this->login, $flag, 'Y']);
+        }
+        else
+        {
+            $this->db->exec_sql("update user_active_security set us_ledger=$1 
where us_login = $2",
+                    [$flag, $this->login]);
         }
     }
+
     /**
      * Check the security on ledger for the user , it returns 1 if the 
security 
      * on ledgers is enabled, otherwise 0 
@@ -1640,10 +1739,11 @@ class User
     {
         $security=$this->db->get_value("select us_action from 
user_active_security 
                 where 
-                us_login=$1",[$this->login]);
-        $n_security =($security=="Y")?1:0;
+                us_login=$1", [$this->login]);
+        $n_security=($security=="Y")?1:0;
         return $n_security;
     }
+
     /**
      * Set the flag in the table user_active_security
      * @param int $p_value 1==enable  , 0 = disable
@@ -1651,31 +1751,38 @@ class User
      */
     function set_status_security_action($p_value)
     {
-        if ($p_value != 0 && $p_value != 1) throw new Exception (_("Valeur 
invalide"));
-        $exist=$this->db->get_value("select count(*) from user_active_security 
where us_login=$1",
-                [$this->login]);
+        if ($p_value!=0&&$p_value!=1)
+            throw new Exception(_("Valeur invalide"));
+        $exist=$this->db->get_value("select count(*) from user_active_security 
where us_login=$1", [$this->login]);
         $flag=($p_value==1)?"Y":"N";
-        if ( $exist == 0) {
-            $this->db->exec_sql("insert into user_active_security 
(us_login,us_action,us_ledger) values ($1,$2,$3)",[$this->login,$flag,'Y']);
-        } else {
-            $this->db->exec_sql("update user_active_security set us_action=$1 
where us_login = $2",[$flag,$this->login]);
+        if ($exist==0)
+        {
+            $this->db->exec_sql("insert into user_active_security 
(us_login,us_action,us_ledger) values ($1,$2,$3)",
+                    [$this->login, $flag, 'Y']);
+        }
+        else
+        {
+            $this->db->exec_sql("update user_active_security set us_action=$1 
where us_login = $2",
+                    [$flag, $this->login]);
         }
     }
 
-       /**
-        *
-        */
+    /**
+     *
+     */
     function get_first_week_day()
-       {
-               $repocn=new Database();
-               $result=$repocn->get_value("select parameter_value from 
user_global_pref where parameter_type=$1 and user_id=$2 ",
-                               array("first_week_day",$this->login));
-               if ($repocn->count() == 0 ) {
-                       $this->save_global_preference("first_week_day",1);
-                       return 1;
-               }
-               return $result;
-       }
+    {
+        $repocn=new Database();
+        $result=$repocn->get_value("select parameter_value from 
user_global_pref where parameter_type=$1 and user_id=$2 ",
+                array("first_week_day", $this->login));
+        if ($repocn->count()==0)
+        {
+            $this->save_global_preference("first_week_day", 1);
+            return 1;
+        }
+        return $result;
+    }
+
 }
 
 ?>
\ No newline at end of file
diff --git a/include/constant.php b/include/constant.php
index 0e44686..8a5449d 100644
--- a/include/constant.php
+++ b/include/constant.php
@@ -116,7 +116,7 @@ if ( !defined ("NOALYSS_PACKAGE_REPOSITORY")) {
 if ( ! defined ("SYSINFO_DISPLAY")) {
     define ("SYSINFO_DISPLAY",TRUE);
 }
-define ("DBVERSION",163);
+define ("DBVERSION",164);
 define ("MONO_DATABASE",25);
 define ("DBVERSIONREPO",20);
 define ('NOTFOUND','--not found--');
@@ -596,8 +596,10 @@ function noalyss_class_autoloader($class) {
         "sort_table" => "lib/sort_table.class.php",
         "table_data_sql" => "lib/table_data_sql.class.php",
         "zip_extended" => "lib/zip_extended.class.php",
-        "document_state_mtable"=>"class/document_state_mtable.class.php"
-
+        "document_state_mtable"=>"class/document_state_mtable.class.php",
+        "noalyss\mobile"=>"class/mobile.class.php",
+        "profile_mobile_sql"=>"database/profile_mobile_sql.class.php",
+        "mobile_device_mtable"=>"class/mobile_device_mtable.class.php"
     );
     if ( isset ($aClass[$class]) ) {
         require_once NOALYSS_INCLUDE."/".$aClass[$class];
diff --git a/include/database/profile_menu_sql.class.php 
b/include/database/profile_menu_sql.class.php
index e11ddb5..6950144 100644
--- a/include/database/profile_menu_sql.class.php
+++ b/include/database/profile_menu_sql.class.php
@@ -36,7 +36,7 @@ require_once NOALYSS_INCLUDE.'/lib/ac_common.php';
 class Profile_Menu_sql extends Table_Data_SQL
 {
 
-    function __construct(&$p_cn,$p_id=-1)
+    function __construct(&$p_cn, $p_id=-1)
     {
         $this->table="public.profile_menu";
         $this->primary_key="pm_id";
@@ -48,7 +48,7 @@ class Profile_Menu_sql extends Table_Data_SQL
             , "p_order"=>"p_order"
             , "p_type_display"=>"p_type_display"
             , "pm_default"=>"pm_default"
-            ,"pm_id_dep"=>"pm_id_dep"
+            , "pm_id_dep"=>"pm_id_dep"
         );
 
         $this->type=array(
diff --git a/include/database/profile_menu_sql.class.php 
b/include/database/profile_mobile_sql.class.php
similarity index 50%
copy from include/database/profile_menu_sql.class.php
copy to include/database/profile_mobile_sql.class.php
index e11ddb5..d52ae92 100644
--- a/include/database/profile_menu_sql.class.php
+++ b/include/database/profile_mobile_sql.class.php
@@ -1,6 +1,7 @@
 <?php
 
-/*
+/**
+ * Autogenerated file 
  *   This file is part of NOALYSS.
  *
  *   NOALYSS is free software; you can redistribute it and/or modify
@@ -17,58 +18,54 @@
  *   along with NOALYSS; if not, write to the Free Software
  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
-// Copyright Author Dany De Bontridder danydb@aevalys.eu
+require_once NOALYSS_INCLUDE.'/lib/data_sql.class.php';
+require_once NOALYSS_INCLUDE.'/class/database.class.php';
+
 /**
- * @file
- * @brief Manage the table public.profile_menu
+ * class_profile_mobile_sql.php
  *
- *
-  Example
-  @code
-
-  @endcode
- */
-require_once NOALYSS_INCLUDE.'/lib/ac_common.php';
+ * @file
+ * @brief abstract of the table public.profile_mobile */
 
 /**
- * @brief Manage the table public.profile_menu
+ * @class Profile_Mobile_SQL
+ * @brief ORM abstract of the table public.profile_mobile 
  */
-class Profile_Menu_sql extends Table_Data_SQL
+
+class Profile_Mobile_SQL extends \Table_Data_SQL
 {
 
-    function __construct(&$p_cn,$p_id=-1)
+    function __construct(DatabaseCore $p_cn, $p_id=-1)
     {
-        $this->table="public.profile_menu";
-        $this->primary_key="pm_id";
-
+        $this->table="public.profile_mobile";
+        $this->primary_key="pmo_id";
+        /*
+         * List of columns
+         */
         $this->name=array(
-            "pm_id"=>"pm_id", "me_code"=>"me_code"
-            , "me_code_dep"=>"me_code_dep"
+            "pmo_id"=>"pmo_id"
+            , "me_code"=>"me_code"
+            , "pmo_order"=>"pmo_order"
             , "p_id"=>"p_id"
-            , "p_order"=>"p_order"
-            , "p_type_display"=>"p_type_display"
-            , "pm_default"=>"pm_default"
-            ,"pm_id_dep"=>"pm_id_dep"
+            , "pmo_default"=>"pmo_default"
         );
-
+        /*
+         * Type of columns
+         */
         $this->type=array(
-            "pm_id"=>"number",
-            "me_code"=>"text"
-            , "me_code_dep"=>"text"
-            , "p_id"=>"number"
-            , "p_order"=>"number"
-            , "p_type_display"=>"text"
-            , "pm_default"=>"text"
-            , "pm_id_dep"=>"number"
+            "pmo_id"=>"numeric"
+            , "me_code"=>"text"
+            , "pmo_order"=>"numeric"
+            , "p_id"=>"numeric"
+            , "pmo_default"=>"text"
         );
 
         $this->default=array(
-            "pm_id"=>"auto"
+            "pmo_id"=>"auto"
         );
 
+        $this->date_format="DD.MM.YYYY";
         parent::__construct($p_cn, $p_id);
     }
 
 }
-
-?>
diff --git a/include/lib/message_javascript.php 
b/include/lib/message_javascript.php
index 68e6241..792b7d7 100644
--- a/include/lib/message_javascript.php
+++ b/include/lib/message_javascript.php
@@ -113,5 +113,5 @@ content[77]="<?php echo htmlspecialchars(_("Permet de 
chercher dans le suivi pou
 content[78]="<?php echo htmlspecialchars($file_too_large,ENT_QUOTES)?>";
 
 content[79]="<?php echo htmlspecialchars(_("Les postes comptables sont entre 
[] , les fiches entre {} et les postes analytiques entre {{ }}"))?>";
-    
+content[80]="<?php echo htmlspecialchars(_("Oui pour charger les fichiers 
javascripts et CSS standards"),ENT_QUOTES)?>";    
 </script>
diff --git a/include/profile.inc.php b/include/profile.inc.php
index d48cd6a..41d0bc8 100644
--- a/include/profile.inc.php
+++ b/include/profile.inc.php
@@ -387,7 +387,7 @@ for ($i=0; $i<Database::num_row($ret); $i++)
             $gDossier, $row->p_id);
     echo '<tr>';
     echo "<td>".$js.$row->p_name.'</a>'.'</td>';
-    echo td($row->p_desc);
+    echo td($row->p_desc); 
     echo td($row->with_calc);
     echo td($row->with_direct_form);
     echo '</tr>';
@@ -399,7 +399,8 @@ echo "<td>".$js._("Ajouter un profil")." </td>";
 echo '</tr>';
 echo '</table>';
 echo '</div>';
-
+$profile_mobile=Mobile_Device_MTable::build(0,90);
+$profile_mobile->create_js_script();
 
 //*******************************************************
 // Show details of the selected profile
diff --git a/include/sql/patch/upgrade163.sql b/include/sql/patch/upgrade163.sql
new file mode 100644
index 0000000..5bc3fdf
--- /dev/null
+++ b/include/sql/patch/upgrade163.sql
@@ -0,0 +1,22 @@
+begin;
+
+drop table if exists profile_mobile;
+create table profile_mobile (pmo_id serial primary key , me_code text not null 
, pmo_order int not null, p_id int not null,pmo_default char default '1');
+
+alter table profile_mobile add constraint profile_mobile_profile_fk  foreign 
key (p_id) references profile (p_id);
+alter table profile_mobile add constraint profile_mobile_menu_ref_fk  foreign 
key (me_code) references menu_ref (me_code);
+alter table profile_mobile add constraint profile_mobile_code_uq unique 
(p_id,me_code);
+
+comment on table profile_mobile is 'Menu for mobile device';
+comment on column profile_mobile.pmo_id is 'primary key';
+comment on column profile_mobile.me_code is 'Code of menu_ref to execute';
+comment on column profile_mobile.pmo_order is 'item order in menu';
+comment on column profile_mobile.p_id is 'Profile id ';
+comment on column profile_mobile.pmo_default is 'possible values are 1 , the 
default HTML header (javascript,CSS,...) is loaded ,  0  nothing is loaded from 
noalyss ';
+
+insert into profile_mobile (p_id,me_code,pmo_order) select p_id , 'AGENDA',10 
from profile;
+insert into profile_mobile (p_id,me_code,pmo_order) select p_id , 'LOGOUT',20 
from profile;
+
+
+insert into version (val,v_description) values (164,'Menu for small device : 
mobile');
+commit ;
diff --git a/include/template/calendar.php b/include/template/calendar.php
index 88effb6..e402e4e 100644
--- a/include/template/calendar.php
+++ b/include/template/calendar.php
@@ -23,7 +23,8 @@ $nDay=$nFirstDay;
 for ($i=0;$i<=6;$i++){
        echo "<th>";
        $nDay=($nDay>6)?0:$nDay;
-       echo $week[$nDay];
+       echo '<span class="d-none d-sm-block ">'.$week[$nDay].'</span>';
+        echo '<span class=" d-block 
d-sm-none">'.substr($week[$nDay],0,2).'</span>';
        $nDay++;
        echo "</th>";
 }
@@ -36,18 +37,27 @@ $nCol=0;
 $today_month=date('m');
 $today_day=date('j');
 while ($ind <= $this->day) {
-    if ( $nCol == 0 ) echo "<tr>";
+     if ($nCol==0)
+    {
+        echo "<tr>";
+    }
     $class="workday";
-    if ( $week == 0 || $week == 6) $class="weekend";
+    if ($week==0||$week==6)
+    {
+        $class="weekend";
+    }
     // compute the date
     $timestamp_date=mktime(0,0,0,$this->month,$ind,$this->year);
     $date_calendar=date('w',$timestamp_date);
     $st="";
-    if ( $today_month==$this->month && $today_day==$ind)
-      $st='  style="border:1px solid red" ';
+    if ($today_month==$this->month&&$today_day==$ind)
+    {
+        $st='  style="border:1px solid red" ';
+    }
     if ( $date_calendar == $week ) {
         echo '<td class="'.$class.'" '.$st.'>'.'<span 
class="day">'.$ind."</span>";
-        echo $cell[$ind];
+        echo '<span class="d-none d-sm-block ">'.$cell[$ind].'<span>';
+        echo '<span class="d-block d-sm-none">'.$cell[$ind].'<span>';
         echo '</td>';
         $ind++;$week++;$nCol++;
     } else {
diff --git a/include/template/mobile-display_menu.php 
b/include/template/mobile-display_menu.php
new file mode 100644
index 0000000..1017c06
--- /dev/null
+++ b/include/template/mobile-display_menu.php
@@ -0,0 +1,69 @@
+<?php
+/*
+ *   This file is part of NOALYSS.
+ *
+ *   PhpCompta is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   PhpCompta is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with PhpCompta; if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+// Copyright (2002-2021) Author Dany De Bontridder <danydb@noalyss.eu>
+
+if (!defined('ALLOWED'))
+    die('Appel direct ne sont pas permis');
+
+/**
+ * @file
+ * @brief  show the mobile menu
+ */
+if (DEBUGNOALYSS>1)
+{
+    echo __FILE__;
+};
+?>
+<img src="<?=NOALYSS_URL?>/image/logo9000.png" width="100%" 
style="position:absolute;top:0px;left:0px;z-index:-1;opacity: 11%">
+<div id="mobile_module"  >
+<h1>NOALYSS</h1>
+    <ul class="nav nav-pills nav-fill  flex-column  " >
+        <?php
+        foreach ($aModule as $row):
+            $js="";
+            $style="";
+
+            $style="nav-item-module";
+            if ($row['me_code']=='new_line')
+            {
+                continue;
+            }
+            if ($row['me_url']!='')
+            {
+                $url=$row['me_url'];
+            }
+            elseif ($row['me_javascript']!='')
+            {
+                $url="javascript:void(0)";
+                $js_dossier=str_replace('<DOSSIER>', Dossier::id(), 
$row['me_javascript']);
+                $js=sprintf(' onclick="%s"', $js_dossier);
+            }
+            else
+            {
+                
$url="mobile.php?gDossier=".Dossier::id()."&ac=".$row['me_code'];
+            }
+            ?>
+            <li class="<?php echo $style ?>">
+                <a class="nav-link border-1 border-dark rounded-2" href="<?php 
echo $url ?>" title="<?php echo _($row['me_description']) ?>" <?php echo $js ?> 
><?php echo gettext($row['me_menu']) ?></a>
+            </li>
+            <?php
+        endforeach;
+        ?>
+    </ul>
+</div>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]