<?php
/***************************************/
/**  TABLE DES MATIERES
 *   CLASSE                        LIGNE
 *   ***************
 *   Chapo                      40
 *   Barmen                     80
 *   Info                       100  
 *	 LesSubmits   				120
 *   Membres (abstract)			160
 *   Login                     	280  extends Membres 
 *   NouvMdp   					480  extends Membres  
 *   class NouvMbr 				600	 extends Membres
 *   class ModiMbr 				780	 extends Membres
 *   class TableauBd 			730
 *   class MenuVisit			800
 *   class MenuPage 			850
 *   class MdpPerdu ext Membres 890
 *   class Associes             1040
 *   
 *   
 *   
 *      
 *      NouvMdp                   934
 *      ModifLogin               1045
 *      NouvAbo                  1148
 *      PerteMdp                 1273
 *
 *
 ***************************************/










class Chapo
 {
/*********************************************
 * Entête du site avec d'une part une image  *
 * et d'autre part deux lgnes                *
 ********************************************/
   function __construct ()
    {
        $oTpl = new Template(SRC_TEMPLATE);
        $oTpl->set_filenames(array('chap' => 'hautpage.tpl' ));
		$ban = 'logoAjam.jpg';
		$alt = "Logo AJAM"; $larg = "152px"; $haut = "119px";
        /* $alt = "Logo AJAM"; $larg = "16.45%"; $haut = "150";
		$alt = "Logo AJAM"; $larg = "400"; $haut = "300"; */
        // 2 lignes suivantes OK
        $fortout = 'https://ajam.ovh/fortout/images/';
        $img = $fortout.$ban;


        $Titre1 = 'AJAM';
        $Titre2 = 'Association de la Jeunesse Avenir du Monde';
	// pour le gabarit hautpage
        $oTpl->assign_vars(array(
            'IMG'     => $img,
            'ALT'     => $alt,
            'LARGEUR' => $larg,
            'HAUTEUR' => $haut,
            'T1'      => $Titre1,
            'T2'      => $Titre2
        ));
        $oTpl -> pparse('chap');
    }
}







class Barmen {
/******************************************************
 * Menu, tous les liens sur une ligne sans conditions *
 *****************************************************/
    function __construct () {
        $oTpl = new Template(SRC_TEMPLATE);
        $oTpl->set_filenames(array('menu' => 'barremenu.tpl'));
        $oBd = new Badedo();
        $rq = "SELECT * FROM as_menu ORDER BY rang";
        $m  = $oBd->lit_rq($rq);
        foreach($m as $row)
          $oTpl->assign_block_vars('items',array(
           'LIEN'       => $row['page'].'.php',
           'BULLE'      => $row['bulle'],
           'NOM'        => $row['nom']
          ));
        $oTpl->pparse('menu');
    }
}

/*********************************************
*   Info
*********************************************/
class Info
{
 function __construct($baratin)
 {
   ?>
   <p class="messN">
   <?php print($baratin); ?>
   </p>
   <?php
 }	 
}

 
 
 
 
 
/******************************************************
* class LesSubmits instanciée dans AbstractMembres 
* utilisée dans tous les doc affichant des boutons
*****************************************************/
class LesSubmits
{
// *************************************************/
// * Commandes de soumission disponibles applicables
// * dans les zones ad-hoc des formulaires, dont les paramètres sont
// * 'classe' : OK, modif, ou annul
// * 'name' et 'vlue' : à l'initiative du demandeur
// * 'type': submit
// * S'initialise avec les identifiants des boutons/commande
// * souhaités et la vleur du submit, soit, dans l ordre :
// * la 'classe' et les 'naame' et les  'value' correspondants.
// * Renvoie un tableau utilisable pâr le gabarit
// *****************************************************/
/* PROPRIETES  */
	private $result;
/* CONSTRUCTEUR  */
	function __construct($inp){
/* Le tableau en entrée contient une ou plusieurs séquences
de trois valeurs (caractères) dans l ordre classe, name et value
corrspondant aux boutons/commande souhaités.
Ce  tableau est ensuite scindé par array_chunh
A chaque tableau de triplets on ajoute la valeur 'submit' (array_pad)
puis on associe ces valeurs aux clefs correspondantes (array_combine */
	$chk = array_chunk($inp, 3); // tableau de triplets
	$this->result = array();
	foreach ($chk as $I)
		{
			$t = array_pad($I, 4, "SUBMIT");
			$u = array_combine(array('CLASS','NAME','VALUE','TYPE'),$t);  //tableau cle=>value
			$this->result[] = $u;
		}
								} /* de function __construct($inp)*/
/* METHODES*/
	public function getSubmit() {return $this->result;}
}

/******************************************************
* class Membres 
* utilisée dans tous les 
*****************************************************/
abstract class Membres // AbstractMembres plus judicieux pour une classe abstraite
{
	public
	$_mmb = array(); //tableau des infos d'un membre : identifiant, nom, prenom, lettres code d'acces, mdp
	protected
	$_idmembre = NULL , 
	$code = NULL, $mdp=NULL, //pourlogin
	$cod_acc, $mdp_actu, $mdp_nouv, $mdp_conf,   // pour nouvMdp
    $nm, $prn, $cr,   // pour ModifLogin
    $nom, $prenom, $courriel,   // pour ModifLogin ...
	$aside_head ,
	$aside_param = array(),
	$aside_footer = NULL,
	$content_head, // = array(),
	$content_form_legend, //= array(),
	$content_form_saisie = array(),
	$boutons = array(),
	$messano;
	
/* 	CONSTRUCTEUR il n'y en a pas */
	
	/* METHODES */
	abstract protected function setAside();  // initialise les parametres de la colonne aside
	abstract protected function  setForm(); //initialise les parametres du corps du formulaires
	abstract protected function  setSubmit(); // initialise les boutons submit
	abstract protected function  validOK(); // traitement du formulaire validé 
	
	// ces fonctions sont utilisées
	final function motpasse() // renvoie un nombre aléatoire de 8 chiffres
	{
			srand();
			return (string) rand(10000000, 99999999);
	}
			
	final  function initiales ($n, $p) // écrit les initiales en majuscules
	{
		$t=$n[0].$p[0];
		return strtoupper($t);
	}
	
	final protected function  _setMembre($i)
	{
		$oBd=new Badedo();
		$rq="SELECT * FROM as_membres WHERE id_membre=$i";
		$mmb = $oBd->lit_rq($rq);		
		$this->_mmb = $mmb[0]; //rangé dans cette propriété protégée
	}
	
	final protected function traiteAband() // traite post abandon
	{
		$mess=" Annulé ! Vous pouvez recommencer... ou passer à autre chose";
		$oInfo = new Info($mess);
	}
	
	final  function init() // traite post abandon
	{
		$oTpl= new Template(SRC_TEMPLATE) ;
		$oTpl->set_filenames(array( 'deuxcol'=>'deuxcol.tpl',
									'formulaire'=>'form.tpl'
								   )
							 );
	/* COLONNE ASIDE (gauche) */
		$oTpl->assign_vars	(array	('SUJET'=>$this->aside_head,
								   	'FOOTER' => $this->aside_footer //null si non initialisé
									)
							);
	foreach($this->aside_param as $v) // tableau
		$oTpl->assign_block_vars('para',array('INVITE'=>$v));
		
	/* COLONNE CONTENT	 */
	foreach($this->content_form_saisie as $ligne)
	  $oTpl->assign_block_vars('frm',array(	'NOM'    =>$ligne['nom'],
											'TEXTE'    =>$ligne['texte'],
											'TYPE'    =>$ligne['type'],
											'LONG'    =>$ligne['long'],
											'MAX'    =>$ligne['max'],
											'VALUE'    =>$ligne['value'],
											'AIDE'    =>$ligne['aide'],
											'I_SRC'    =>$ligne['i_src'],
											'I_HAUT'    =>$ligne['i_haut'],
											'I_LONG'    =>$ligne['i_long'],
											'I_ALT'    =>$ligne['i_alt'],
											'LEGENDE'  =>$ligne['legende']
										   )
							  );
							  
    // variables hors block :
		$oTpl->assign_vars  (array(
								// parametres de la ligne d'erreurs
								'AFFICHE' => $this->messano?"block":"none",
								'TEXTEAFFICHE' => $this->messano,
								// paramètres généraux du formulaire
								'OBJET' => $this->content_form_legend,
								'FORM_ACTION' => "#self",
								'FORM_NAME' => "login",
								'FORM_METHODE' => "post",
								'TIT' => $this->content_head
								)
							);
	
		/* LIGNE DES BOUTONS SUBMIT */
		$oSubmits = new LesSubmits ($this->boutons);
		foreach($oSubmits->getSubmit() as $l)  $oTpl->assign_block_vars('submit',$l); 
				
		/* FUSION DES GABARITS */
		$oTpl->assign_var_from_handle('CONTENU','formulaire');
		$oTpl->pparse('deuxcol'); // affichage des données
	}
} // fin de abstract class Membres








// Class Login (extension de Membres)
// MEMBRES détient les lieux  de stockage, les accessoires,
// les outils, les procédures tandis que LOGIN les utilise.
class Login extends Membres //plutot AbstractMembres pour moi
{
	// LOGIN : Identification du membre en plusieurs étapes
	
	/* CONSTRUCTEUR */
	function __construct()
	{
		/* if($_SESSION['id_perso']>0) */  if ($_SESSION['id_perso'])
		{
			$m = "Vous êtes déjà identifié et pouvez accéder à toutes les données qui vous concernent !";
			$oInfo = new Info($m);
			exit;
		}
		$this->setAside();
		$this->setForm();
		$this->setSubmit();
		if (empty($_POST)) $this->init();
			elseif (isset($_POST['valid'])) $this->traiteValid();
				elseif (isset($_POST['aband'])) $this->traiteAband();
	}
	
	/* METHODES */
	
	//fonction qui retourne le id_membre du conjoint du id_membre donné en entrée
	function Duo($i)
	{
		
		$oBd = new Badedo();
        $rq  = 'SELECT id_duo, id_membre1, id_membre2 FROM as_duos WHERE actuel=1';
        $rep = $oBd->lit_rq($rq);
		$result=0;
		foreach($rep as $row)
			 {
			 if ($_SESSION['id_perso']==$row['id_membre1']) ($result=$row['id_membre2']);
			 if ($_SESSION['id_perso']==$row['id_membre2']) ($result=$row['id_membre1']);
			 };
		return $result;
		
		
		
		/* $obdpourconjoints = newPDO ('mysql:host=ajamovhphfo.mysql.db;dbname=ajamovhphfo' , 'ajamovhphfo' ,'MdpBdAjam9'); 
		$sql='SELECT id_duo, id_membre1, id_membre2 FROM as_duos WHERE actuel=1';
		$sth= $obdpourconjoints->prepare($sql);
		$rep=$sth->execute(); */
		/* $sql='SELECT id_duo, id_membre1, id_membre2 FROM as_duos WHERE actuel=1';
		$rep=$this->lit_rq ($ql);
		$result=0;
		while ($row= $rep->fetch(PDO::FETCH_ASSOC))
			{
			if ($i==$row['id_membre1']) $result=$row['id_membre2'];
			if ($i==$row['id_membre2']) $result=$row['id_membre1'];
			};		
		$req->closeCursor();
		return $result; */
	}
	
	// 1 Affichage du formulaire
	// 1.1 Parite aside (côté gauche)
	function setAside()
	{
		$this->aside_head = "Identification";
		$this->aside_param=array(
						'Identifiez-vous : code d\'accès composé de 2 caractères en majuscules et 3 chiffres + un mot de passe.',
						'Blabla2',
						'Blabla3',
						'Blabla'
								);
	}
	
	// ****************************************
	// 1.2 formulaire de saisie (partie droite)
	// ****************************************
	function setForm()
	{
			// information haut de colonne content 
			$this->content_head = "Votre connexion est indispensable pour vous donner l'accès aux données vous concernant";
			$this->content_form_legend = "Informations de reconnaissance";
			
			// tableau des paramètres de saisie et affectation dans le gabarit
			$this->content_form_saisie = array
				(
				  array(
						  'nom'=>"code",
						  'texte'=>"* Veuillez saisir votre code d'identification :",
						  'type' => 'text',
						  'long'=>"5",'max'=>"5",
						  'value'=>"$this->code",
						  'aide'=>"2 lettres et 3 chiffres : fournis lors de l'inscription",
						  'i_source'=>'https://www.ajam.ovh/fortout/images/quoi.ico',
						  'i_haut'=>"15", 'i_long'=>"15",'i_alt'=>'note sur le code d accès', // corriger d\'accès
						  'legende'=>"... de la forme AB123"					  
						),
				   array(
				           'nom'=>"mdp",
						   'texte'=>"* Veuillez saisir votre mot de passe :",
						   'type'=>'password',
						   'long'=>"8", 'max'=>"8", 'value'=>"$this->mdp",
						   'aide'=>"Fourni lors de votre inscription ou modifié ultérieurement par vos soins",
						   'i_source'=>'https://www.ajam.ovh/fortout/images/quoi.ico',
						   'i_haut'=>"15", 'i_long'=>"15",'i_alt'=>'note sur le courriel', // corriger d\'accès
						   'legende'=>NULL
				         )
				);
	}
	
	// ********************************************
	// 1.3 Boutons de commande
	// *********************************************
	function setSubmit()
	{
		$this->boutons = array('OK', 'valid', 'CONNEXION !', 'annul', 'aband', 'ABANDON !'); 
	}
	
	// ********************************************
	 // 2 traitement des saisies
	// *********************************************/
	function traiteValid()
	{
		try 
		{
			
			// 2.1 bouton CONNEXION sans saisie préalable
			if(empty($_POST['code']) || empty($_POST['mdp']) )
				throw new Exception("Tous les champs doivent être remplis ! Veuillez compléter...");
			
			// 2.2 analyse du code d'identification saisi
			$modele='#^([A-Z]{2})([0-9]{3})#';  // 2 lettres majuscules suivies de 3 chiffres
			$p = preg_match($modele, $_POST['code'], $matches);
			if(!$p) throw new Exception("Saisie non conforme");
			$initiales = $matches[1]; $rang = intval($matches[2]);
			$rang=$rang-111; /* echo('ligne 399 -  $rang= '.$rang. ' var_dump($_SESSION) donne : ');var_dump($_SESSION);// Partie chiffrée du code d'accès : id_membre + 111 */
			$rg= filter_var($rang, FILTER_VALIDATE_INT);  // vérif de sécurité
			
			// 2.3 fonction _setMembre rangement dans valeur locale _mmb  (tableau)
			$this->_setMembre($rg);
			$this->_idmembre=$rg;      
			// 2.4 analyse du mot de passe saisi
			$mdp = $_POST['mdp'];
			$res = ($initiales == $this->_mmb['code_acces']) && ($mdp == $this->_mmb['mdp']);
			// 3. c'est bon ou pas bon
			if(!($res))
				throw new Exception("Couple code / mot de passe incorrect ! Veuillez corriger ou devenir membre !");
			// pas d'erreru donc....
			$_SESSION['id_perso'] = $rg;echo('<br/> ligne '.__LINE__.' de class Login : $rg='.$rg); die();
			$this->validOK();
		} 
		// paramètres d'exception
		catch (Exception $e)
		       {
				$this->messano = $e->getMessage();
				$this->code = $_POST['code'];
				$this->mdp = $_POST['mdp'];
				echo "L'exception a été créée depuis la ligne : ".$e->getLine()." - ".$e->getMessage(); 
				$this->init();
		       }                                                                                                                            
	}
	
	// function validOK()
	  // en faisant les lectures correctes dans la BDD,
	  // pour le membre identifié par $_SESSION['id_perso']
	  // initialiser des variables de session  à valeur booléenne pour
	  // renseigner  si le membre est membre du bureau, parrain, 
	  // donnateur, appartient à un binôme.....
	  // puis renvoyer vers la page d'accueuil  [index.php direct semble pas fonctoiponner]
	          
				  // $i=$_SESSION['id_perso'];
				  // $_SESSION['connecte'] = true ;
				  // $_SESSION['id_bin'] = max(0,$this->Duo($i));
									  
		// Initialisations suite à connexion réussie
// =========================================
   function validOK () 
   {
	  $i=$_SESSION['id_perso'];
      //$_SESSION['id_perso'] = $this->id_membre ;
      $oAs =  new Associes();
      $_SESSION['id_duo']  = $oAs->duos($_SESSION['id_perso']);     // id du conjoint
      $oAs =  new Associes();
      $_SESSION['parrain'] = $oAs->parrain($_SESSION['id_perso']);  // booléen
      $oAs =  new Associes();
      $_SESSION['bureau']  = $oAs->buro($_SESSION['id_perso']);    // booléen ligne 1044
      $oAs =  new Associes();
      $_SESSION['gestion'] = $oAs->gestion($_SESSION['id_perso']);  // booléen
	  $oAs =  new Associes();
      $_SESSION['comptabilite'] = $oAs->comptabilite($_SESSION['id_perso']); echo('ligne467 $_SESSION[comptabilite] = '.$_SESSION['comptabilite'] );// booléen

      // RENVOI vers la page ACCUEIL
      direct("index.php");
   }
   
	
} // de class Login







/*************************************/
class NouvMdp extends Membres {
// Modification du mot de passe
// ============================
// Procédure :
// Lire la table des membres pour celui qui est enregistré dans $SESSION(id_perso)
// Vérifier si le Mot de passe saisi correspondent à la table des membres
// Saisir le nouveau mot de passe
// Modfier la table du membre concern avec le nouveau mot de passe

   function __construct () {
     // initialise les champs du demandeur
     $this->_setMembre($_SESSION['id_perso']); 
     $cd = strval(111 + $_SESSION['id_perso']);
     $this->cod_acc = $this->_mmb['code_acces'].$cd; // code accès complet
     $this->setAside();
     $this->setForm();
     $this->setSubmit();
     if (empty($_POST)) $this->init();  // L 208, Objet Membres
     elseif (isset($_POST['valid'])) $this->traiteValid ();   // ci dessous
     elseif (isset($_POST['aband'])) $this->traiteAband ();  // id l 204
   }

   function setAside() {
      $this->aside_head  = "Changement mot de passe";   // parent 178
      $this->aside_param = array(
        'Bonjour ! Vous pouvez remplacer votre mot de passe par un autre à votre choix.');
   }

    function setForm () {
       // information haut de colonne content
       $this->content_head = "Votre nouveau mot de passe doit contenir au moins 6' et au plus 8 lettres ou chiffres.
                              Il est sensible à la casse (fait la différence entre majuscules et minuscules).";
       $this->content_form_legend = "Ancien et nouveau mot de passe";

       // tableau des paramètres de saisie et affectation dans le gabarit
       $this->content_form_saisie = array(
       array('nom'  => "cod_acc",'texte' => "Votre code d'identification :",
             'type' => 'text','long' => "5",'max' => "5",'value' => $this->cod_acc,   
             'aide' => "2 lettres et 3 chiffres : fourni lors de votre inscription",
             'i_source' => "https://ajam.ovh/fortout/images/quoi.ico",
             'i_haut' => "15",'i_long' => "15",'i_alt' => 'note sur le code accès',
             'read' => 'readonly="readonly"',
             'legende' => "... de la forme JR123"),
       array('nom'  => "mdp_actu",'texte' => "* Votre mot de passe actuel :",
             'type' => 'password','long' => "15",'max' => "15",'value' => "{$this->mdp_actu}", 
             'aide' => "Fourni lors de votre inscription ou modifié ultérieurement par vos soins",
             'i_source' => "https://ajam.ovh/fortout/images/quoi.ico",
             'i_haut' => "15",'i_long' => "15",'i_alt' => "note sur le mdp",
             'read' => NULL,
             'legende' => "si perdu, utiliser mot de passe perdu"),
       array('nom'  => "mdp_nouv",'texte' => "* Votre nouveau mot de passe :",
             'type' => 'password','long' => "15",'max' => "15",'value' => "{$this->mdp_nouv}",  
             'aide' => "au minimum 6 caractères au plus 8",
             'i_source' => "https://ajam.ovh/fortout/images/quoi.ico",
             'i_haut' => "15",'i_long' => "15",'i_alt' => "note sur le mdp",
             'read' => NULL,
             'legende' => "au minimum 6 caractères alphanumériques"),
       array('nom'  => "mdp_conf",'texte' => "* Confirmer le nouveau mot de passe :",
             'type' => 'password','long' => "15",'max' => "15",'value' => "{$this->mdp_conf}",  
             'aide' => "Pour vérification",
             'i_source' => "https://ajam.ovh/fortout/images/quoi.ico",
             'i_haut' => "15",'i_long' => "15",'i_alt' => "note sur le mdp",
             'read' => NULL,
             'legende' => "pour vérification de l'identité des saisies")
              );
    }

    function setSubmit() {
       $this->boutons = array( 'OK','valid','NOUVEAU MDP OK !',
                               'annul','aband','PAS de CHANGEMENTS !');
    }

    function traiteValid () {    //  ************ A COMPLETER
      try  {
         //  Controle validité saisie code accès (readonly, donc non modifiable !)
         // $modele='#^[A-Z]{2}[0-9]{3}$#';     // Bon regex !
         $modele='#^([A-Z]{2})([0-9]{3})$#';   // Bon regex !
         $p = preg_match($modele,$this->cod_acc,$matches);
         if(!$p) throw new Exception("Saisie non conforme");

         // Contrôle validité du mdp saisi
         $mdpcrypt = md5($_POST['mdp_actu']);  // mdp saisi
         $mdpk     = $this->_mmb['krypt'];     // mdp crypté dans la table as_membres
         if (!($mdpcrypt == $mdpk))
           throw new Exception ("Erreur de saisie du mot de passe actuel");

         //  Controle champ vide
         if(empty($_POST['cod_acc']) || empty($_POST['mdp_actu']) || empty($_POST['mdp_nouv']) || empty($_POST['mdp_conf']))
           throw new Exception ("Tous les champs doivent être remplis !\n Veuillez compléter !");

      // Vérification conformité  mot de passe nouveau
         if ($_POST['mdp_nouv']<>$_POST['mdp_conf'] || strlen($_POST['mdp_nouv'])<6)
           throw new Exception ("Nouveau mot de passe non conforme \n trop court ou non identiques \n Veuillez recommencer !");
          echo('TraitValid li549 ');// pas d'erreur donc ...
         $this->validOK();   echo('TraitValid li549 ');
      }
      catch (Exception $e){
        $this->messano = $e->getMessage();
      echo "L'exception a été créée depuis la ligne : ".$e->getLine()." - ".$e->getMessage();
        $this->init();
      }
    }

    function validOK () {
      $mdpcrypt = md5($_POST['mdp_nouv']);
      $id  = $_SESSION['id_perso'];
      $mdp = $_POST['mdp_nouv']; // = $this->mdp_nouv;

      $oBd = new Badedo();
      $rq  = "UPDATE as_membres SET mdp='$mdp', krypt='$mdpcrypt' WHERE id_membre='$id' ";
      $oBd->lit_rq($rq);

      $f=new info("Nouveau mot de passe enregistré !");
    }
}




/***************************************/
class NouvMbr extends Membres {
// Constructeur0
// =============
   function __construct () {
     if (!isset($_SESSION['id_perso'])) {
       $m     = "===  AJAM   === Nouveau membre // Pas de connection ! ";
       $oInfo = new Info($m);
       exit;
     }
     $this->setAside();
     $this->setForm();
     $this->setSubmit();
     if (empty($_POST)) $this->init();
     elseif (isset($_POST['valid'])) $this->traiteValid ();
     elseif (isset($_POST['aband'])) $this->traiteAband ();
   }
// Methodes
// ========

   function setAside() {
      $this->aside_head  = "Nouveau membre";
      $this->aside_param = array(
        'Nouveau membre !',
        'Génération du mot de passe : un texte comportant huit chiffres',
        'Génération de ce mot de passe chiffré'  );
   }

   function setForm () {
       // information haut de colonne content
       $this->content_head = "Enregistrement.";
       $this->content_form_legend = "Informations personnelles";

       // tableau des paramètres de saisie et affectation dans le gabarit
       $this->content_form_saisie = array(
	   array('nom'=>"sexe",'texte'=>"* Genre :",
             'type'=>'text','long'=>"4",'max'=>"4",'value'=>"{$this->sexe}",
             'oblig'=>'oblig',
             'aide'=>'Que 3 choix possibles',
             'i_source'=>"https://ajam.ovh/fortout/images/quoi.ico",
             'i_haut'=>"15",'i_long'=>"15",'i_alt'=>'note sur le code Genre',
             'legende'=>"saisir M. ou Mme ou Fp",
			 'value'=>"M."),
       array('nom'=>"nom",'texte'=>" * Nom :",
             'type'=>'text','long'=>"40",'max'=>"40",'value'=>"{$this->nom}",
             'oblig'=>'oblig',
             'aide'=>'En majuscules',
             'i_source'=>"https://ajam.ovh/fortout/images/quoi.ico",
             'i_haut'=>"15",'i_long'=>"15",'i_alt'=>'note sur le code nom',
             'legende'=>"Ex : Martin"),
		array('nom'=>"prenom",'texte'=>" * Prénom :",
             'type'=>'text','long'=>"40",'max'=>"40",'value'=>"{$this->nom}",
             'oblig'=>'NULL',//'oblig'=>'oblig',
             'aide'=>'',
             'i_source'=>"https://ajam.ovh/fortout/images/quoi.ico",
             'i_haut'=>"15",'i_long'=>"15",'i_alt'=>'note sur le code prénom',
             'legende'=>"Ex : Pierre"),	 
       array('nom'=>"telmobile",'texte'=>"Saisir éventuellement le numéro de portable :",
             'type'=>'text','long'=>"15",'max'=>"15",'value'=>"{$this->telmobile}",
             'oblig'=>'oblig',
             'aide'=>'Que des chiffres et espaces !',
             'i_source'=>"https://ajam.ovh/fortout/images/quoi.ico",
             'i_haut'=>"15",'i_long'=>"15",'i_alt'=>'que le numéro de téléphone portable',
             'legende'=>"Ex : 06 12 34 56 78"),

       array('nom'=>"courriel",'texte'=>"* Saisir adresse courriel :",
             'type'=>'email','long'=>"30",'max'=>"30",'value'=>"{$this->courriel}",
             'oblig'=>'oblig',
             'aide'=>"adresse protégée qui ne sera pas communiquée",
             'i_source'=>"https://ajam.ovh/fortout/images/quoi.ico",
             'i_haut'=>"15",'i_long'=>"15",'i_alt'=>'utilisable pour joindre le membre',
            'legende'=>NULL),
		array('nom'=>"debutdate",'texte'=>"date (aaaamm) d'entrée à l'AJAM :",
             'type'=>'text','long'=>"6",'max'=>"6",'value'=>"{$this->debutdate}",
             'oblig'=>'oblig',
             'aide'=>'En majuscules',
             'i_source'=>"https://ajam.ovh/fortout/images/quoi.ico",
             'i_haut'=>"15",'i_long'=>"15",'i_alt'=>"Saisir 6 chiffres : 4 pour l'année suivis de 2 pour le mois",
             'legende'=>"Ex : 201909 pour septembre 2019")	

             );
    }

   function setSubmit() {
       $this->boutons = array('OK','valid','CONFIRMER l\' INSCRIPTION',
                             'annul','aband','ABANDONNER !' );  }
// Saisie et vérification des données
// ==================================
   function traiteValid () {
      try  {
		  
		//$sexe=trim ($_POST['sexe']);		 
        //$sexe = htmlentities(trim($_POST['sexe']));
		$sexe  = trim($_POST['sexe']);
        if (($sexe==`M.`) || ($sexe==`Mme`) || ($sexe== `Fp`))
           throw new Exception ("Saisir uniquement M. ou Mme ou Fp  $sexe");
	   
	   $nom  = trim($_POST['nom']);
        $pattern = '#[/w+^<>0-9@\/]#';   
        if (preg_match($pattern,$nom))
           throw new Exception ("Le nom saisi ne doit contenir que des lettres");

        $prenom  = trim($_POST['prenom']);
        $pattern = '#[/w+^<>0-9@\/]#';   
        if (preg_match($pattern,$prenom))
           throw new Exception ("Le prénom saisi ne doit contenir que des lettres");
		$courriel=$_POST['courriel']; 
		if (!filter_input(INPUT_POST,"courriel",FILTER_VALIDATE_EMAIL))
           throw new Exception ("Adresse courriel non valide $courriel ");
	   
               
	   
	   	$modele1="#^20[1-3][0-9]0[1-9]$#";
		$modele2="#^20[1-3][0-9]1[0-2]$#";
	   $debutdate=strval($_POST[`debutdate`]);
	   //if( preg_match($modele1,$debutdate) OR preg_match($modele2,$debutdate))
		if (preg_match($modele1,$debutdate) || preg_match($modele2,$debutdatet) || ($debutdate=='000000'))
		   throw new Exception ("La date entrée est non valide  *-$debutdate-*");
	   
	   /* if ((trim($_POST['findate'])==``) OR (trim($_POST['findate'])=='000000')) 
	   { throw new Exception ("La date de fin est non valide"); $findate='000000';}
		else
		{ $modele1="#^20[1-3][0-9]0[1-9]$#";$modele2="#^20[1-3][0-9]1[0-2]$#";
	   if( preg_match($modele1,$_POST['findate']) OR preg_match($modele2,$_POST['findate'])){throw new Exception ("La date de fin est non valide"); $findate=$_POST['findate'];}
	    } */
		
		if (empty($_POST['nom']) || empty($_POST['prenom']) || empty($_POST['courriel'])|| empty($_POST['sexe']) )
           throw new Exception ("Tous les champs doivent être remplis ! Veuillez compléter ! 1- $sexe  2- $nom 3- $prenom 4- $courriel 5- $debutdate 6- $findate");

 		
		
		
// Pas de fautes, on valide
// ========================
        $this->validOK();
      }
// Données saisie valides
// ======================
      catch (Exception $e){
        $this->messano  = $e->getMessage();
        $this->nom      = $_POST['nom'];
        $this->prenom   = $_POST['prenom'];
        $this->courriel = $_POST['courriel']; 
		echo "L'exception a été créée depuis la ligne : ".$e->getLine()." - ".$e->getMessage();
        $this->init();    // ligne 195, objet parent =  afiche le formulaire
      }
   }

   function validOK () {
     // Récupération et traitement des données postées //
     $nom   = strtoupper(trim($_POST['nom'])); //nom (2  dans as_membres)
     $prnm  = trim($_POST['prenom']); //prenom (3)
     $cour  = trim($_POST['courriel']);  //melperso (6)
     $cod   = $this->initiales($nom, $prnm); // code_acces de as_membres (9)
     $mdp   = $this->motpasse();  // série de 8 chiffres //  Ligne 174  (7)

	 $sexe  = trim($_POST['sexe']);
	 $debutdate=$_POST['debutdate'];
	 $findate='000000';
	 

// Insertion des données saisie validéesdans la BDD
// ================================================
     $oBd = new Badedo();
     $rq = "INSERT as_membres VALUES('','$nom','$prnm','$sexe','','$cour','$mdp',md5('$mdp'),'$cod','$debutdate','$findate' )";
     $id = $oBd->lit_rq($rq);
// Information echec de la MAJ de la BDD
// =====================================
       return $result != FALSE; // 0 lines or FALSE

     $lognum = strval(111 + $_idmembre); // nouveau code accès
     $login  = $cod.$lognum;

   }
} //fin class NouvMbr
class Modi1Mbr extends Membres {function affiche() {echo('$idmembre = '.$idmembre.'<br/>$_SESSION  =');  var_dump($_SESSION['id_membreamodifier']);echo('<br/>');var_dump($_POST['selection']);}function setAside() {   }function setForm () {   }function setSubmit() { }function validOK () { }       }
/***************************************/
class ModiMbr extends Membres {
	public $_idmembreamodi;
// Constructeur1
// =============
/********************************************************************************/
 /*   function __construct () {// de nouveau mot de passe
     // initialise les champs du demandeur
     $this->_setMembre($_SESSION['id_perso']); 
     $cd = strval(111 + $_SESSION['id_perso']);
     $this->cod_acc = $this->_mmb['code_acces'].$cd; // code accès complet
     $this->setAside();
     $this->setForm();
     $this->setSubmit();
     if (empty($_POST)) $this->init();  // L 208, Objet Membres
     elseif (isset($_POST['valid'])) $this->traiteValid ();   // ci dessous
     elseif (isset($_POST['aband'])) $this->traiteAband ();  // id l 204
   } */

/**********************************************************************************/





   function __construct () {

	// if(!isset($_POST['selection']))//le membre à modifier n'est pas choisi 
	 //{
	//$oMembreAjamManager = new MembreAjamManager;
	//$idmembre=$oMembreAjamManager->listeDeroulante($oMembreAjamManager->chaineOptions()
	//,'choixMembrePourModi.php' );// on relance la page qui a appelé
	//     }
	//else //le membre à modifier a été choisi 
	
	if ( (empty($_POST['valid'])) AND (empty($_POST['aband'])) )
			{ echo('<br/>ligne816 $this->$id_membreamodifier='.$this->$id_membreamodifier.'<br/>$this->$idmembreamodifier='.$this->$idmembreamodifier.'<br/> $_POST[selection]='.$_POST['selection'].'<br/>');
	 
	$this->$_idmembreamodi=$_POST['selection'];$this->$_idmembre=$_POST['selection'];$this->_setMembre($_POST['selection']);var_dump($this->$_mmb);
			echo('<br/>ligne819 $this->$id_membreamodifier='.$this->$id_membreamodifier.'<br/>$this->$idmembreamodifier='.$this->$idmembreamodifier.'<br/> $_POST[selection]='.$_POST['selection'].'<br/>');   };
var_dump($this->$_mmb);
	//echo('<br/>ligne 823 sexe= '.$this->$_mmb->sexe().'<br/>'.$oMembreAjamManager->get($idmembre)->sexe().'<br/>');
	//echo('<br/>ligne 801');var_dump($_POST);

	
	 
     //if ( (empty($_POST['valid'])) AND (empty($_POST['aband'])) )  $this->init();   //       if (empty($_POST))  if (!($idmembre=='')) $this->init();} 
     ///* else */if (isset($_POST['valid'])) $oModiMbr->traiteAband ();// $this->traiteValid ();
     ///* else */if (isset($_POST['aband'])) {echo('ligne 804 appel traiteAband'); /* parent::traiteAband (); */ };
	 
						} // fin  constructeur 805


// Methodes
// ========
	function action()
	{
	 $this->setAside();
     $this->setForm();
	 $this->affiche();
	 $this->setSubmit();
	$this->affiche();	 
	$this->affichage();
	if ( (empty($_POST['valid'])) AND (empty($_POST['aband'])) ) $this->init();//if (empty($_POST)) $this->init();
     elseif (isset($_POST['valid'])) $this->traiteValid ();
     elseif (isset($_POST['aband'])) $this->traiteAband ();
	 $this->affiche();
	 $this->affichage();
	}
	
	function affiche() 
	{
		$vd=$this->_mmb['nom'];$blabla='<br/>on a : '.$v.'<br/>$this->$_idmembreamodi='.$this->$_idmembreamodi.'<br/>$this->$_idmembre='.$this->$_idmembre.'';
		$oTpl = new Template(SRC_TEMPLATE); $oTpl->set_filenames(array('toto' => 'unblabla_7.tpl'));$oTpl->assign_vars(array('BLABLA'=> $blabla));$oTpl -> pparse('toto');
	}

   function setAside() {
	   $this->affiche();
      $this->aside_head  = "Nouveau membre";
      $this->aside_param = array(
        'Nouveau membre !',
        'Génération du mot de passe : un texte comportant huit chiffres',
        'Génération de ce mot de passe chiffré'  );
   }

   function setForm () {
       // information haut de colonne content
       $this->content_head = "Enregistrement.";
       $this->content_form_legend = "Informations personnelles";

       // tableau des paramètres de saisie et affectation dans le gabarit
       $this->content_form_saisie = array(
	   array('nom'=>"identifiant",'texte'=>"* Identifiant",
             'type'=>'text','long'=>"5",'max'=>"5",// 'value'=>$this->_mmb['id_membre'],   /* "{$this->_mmb['id_membre']}", */
             'oblig'=>'oblig',
             'aide'=>'Ne peut pas être modifié',
             'i_source'=>"https://ajam.ovh/fortout/images/quoi.ico",
             'i_haut'=>"15",'i_long'=>"15",'i_alt'=>'ne peut pas être modifié',
             'legende'=>"",
			 //'value'=>$oMembreAjamManager->get($idmembre)->sexe()),
			 'value'=>$this->_mmb['id_membre']),
	   array('nom'=>"sexe",'texte'=>"* Genre :",
             'type'=>'text','long'=>"4",'max'=>"4",'value'=>"{$this->sexe}",
             'oblig'=>'oblig',
             'aide'=>'Que 3 choix possibles',
             'i_source'=>"https://ajam.ovh/fortout/images/quoi.ico",
             'i_haut'=>"15",'i_long'=>"15",'i_alt'=>'note sur le code Genre',
             'legende'=>"saisir M. ou Mme ou Fp",
			 //'value'=>$oMembreAjamManager->get($idmembre)->sexe()),
			 'value'=>$this->_mmb['sexe']),
       array('nom'=>"nom",'texte'=>" * Nom :",
             'type'=>'text','long'=>"40",'max'=>"40",'value'=>"{$this->_mmb['nom']}",
             'oblig'=>'oblig',
             'aide'=>'En majuscules',
             'i_source'=>"https://ajam.ovh/fortout/images/quoi.ico",
             'i_haut'=>"15",'i_long'=>"15",'i_alt'=>'note sur le code nom',
             'legende'=>"Ex : Martin",
			 'value'=>$this->_mmb['nom']
			 ),
		array('nom'=>"prenom",'texte'=>" * Prénom :",
             'type'=>'text','long'=>"40",'max'=>"40",/* 'value'=>"{$this->nom}", */
             'oblig'=>'oblig',//'oblig'=>'NULL',//'oblig'=>'oblig',
             'aide'=>'',
             'i_source'=>"https://ajam.ovh/fortout/images/quoi.ico",
             'i_haut'=>"15",'i_long'=>"15",'i_alt'=>'note sur le code prénom',
             'legende'=>"Ex : Pierre",
			 'value'=>$this->_mmb['prenom']
			 ),	 
       array('nom'=>"telmobile",'texte'=>"Saisir éventuellement le numéro de portable :",
             'type'=>'text','long'=>"15",'max'=>"15",'value'=>"{$this->telmobile}",
             'oblig'=>'oblig',
             'aide'=>'Que des chiffres et espaces !',
             'i_source'=>"https://ajam.ovh/fortout/images/quoi.ico",
             'i_haut'=>"15",'i_long'=>"15",'i_alt'=>'que le numéro de téléphone portable',
             'legende'=>"Ex : 06 12 34 56 78",
			 'value'=>$this->_mmb['telmobile']
			 ),

       array('nom'=>"courriel",'texte'=>"* Saisir adresse courriel :",
             'type'=>'email','long'=>"30",'max'=>"30",'value'=>"{$this->courriel}",
             'oblig'=>'oblig',
             'aide'=>"adresse protégée qui ne sera pas communiquée",
             'i_source'=>"https://ajam.ovh/fortout/images/quoi.ico",
             'i_haut'=>"15",'i_long'=>"15",'i_alt'=>'utilisable pour joindre le membre',
            'legende'=>NULL,
			'value'=>$this->_mmb['melperso']
			),
		array('nom'=>"debutdate",'texte'=>"date (aaaamm) d'entrée à l'AJAM :",
             'type'=>'text','long'=>"6",'max'=>"6",'value'=>"{$this->debutdate}",
             'oblig'=>'oblig',
             'aide'=>'En majuscules',
             'i_source'=>"https://ajam.ovh/fortout/images/quoi.ico",
             'i_haut'=>"15",'i_long'=>"15",'i_alt'=>"Saisir 6 chiffres : 4 pour l'année suivis de 2 pour le mois",
             'legende'=>"Ex : 201909 pour septembre 2019",	
			 'value'=>$this->_mmb['debutdate']
			 )
             );
    }

   function setSubmit() {
       $this->boutons = array('OK','valid','CONFIRMER l\' INSCRIPTION',
                             'annul','aband','ABANDONNER !' );  }
// Saisie et vérification des données
// ==================================
   function traiteValid () {
      try  {
		  
		//$sexe=trim ($_POST['sexe']);		 
        //$sexe = htmlentities(trim($_POST['sexe']));
		$sexe  = trim($_POST['sexe']);
        if (($sexe==`M.`) || ($sexe==`Mme`) || ($sexe== `Fp`))
           throw new Exception ("Saisir uniquement M. ou Mme ou Fp  $sexe");
	   
	   $nom  = trim($_POST['nom']);
        $pattern = '#[/w+^<>0-9@\/]#';   
        if (preg_match($pattern,$nom))
           throw new Exception ("Le nom saisi ne doit contenir que des lettres");

        $prenom  = trim($_POST['prenom']);
        $pattern = '#[/w+^<>0-9@\/]#';   
        if (preg_match($pattern,$prenom))
           throw new Exception ("Le prénom saisi ne doit contenir que des lettres");
		$courriel=$_POST['courriel']; 
		if (!filter_input(INPUT_POST,"courriel",FILTER_VALIDATE_EMAIL))
           throw new Exception ("Adresse courriel non valide $courriel ");
	   
               
	   
	   	$modele1="#^20[1-3][0-9]0[1-9]$#";
		$modele2="#^20[1-3][0-9]1[0-2]$#";
	   $debutdate=strval($_POST[`debutdate`]);
	   //if( preg_match($modele1,$debutdate) OR preg_match($modele2,$debutdate))
		if (preg_match($modele1,$debutdate) || preg_match($modele2,$debutdatet) || ($debutdate=='000000'))
		   throw new Exception ("La date entrée est non valide  *-$debutdate-*");
	   
	   /* if ((trim($_POST['findate'])==``) OR (trim($_POST['findate'])=='000000')) 
	   { throw new Exception ("La date de fin est non valide"); $findate='000000';}
		else
		{ $modele1="#^20[1-3][0-9]0[1-9]$#";$modele2="#^20[1-3][0-9]1[0-2]$#";
	   if( preg_match($modele1,$_POST['findate']) OR preg_match($modele2,$_POST['findate'])){throw new Exception ("La date de fin est non valide"); $findate=$_POST['findate'];}
	    } */
		
		if (empty($_POST['nom']) || empty($_POST['prenom']) || empty($_POST['courriel'])|| empty($_POST['sexe']) )
           throw new Exception ("Tous les champs doivent être remplis ! Veuillez compléter ! 1- $sexe  2- $nom 3- $prenom 4- $courriel 5- $debutdate 6- $findate");

 		echo('<br/><br/><br/>ligne966 hors constructeur dans traiteValid var_dump($this->$_mmb)=');var_dump($this->$_mmb);echo('<br/>ligne966 var_dump($_POST[selection])=');var_dump($_POST['selection']);
		
		
// Pas de fautes, on valide
// ========================
        $this->validOK();
      }
// Données saisie valides
// ======================
      catch (Exception $e){ echo('ligne 945 exception');
        $this->messano  = $e->getMessage();
        $this->nom      = $_POST['nom'];
        $this->prenom   = $_POST['prenom'];
        $this->courriel = $_POST['courriel']; 
		echo "L'exception a été créée depuis la ligne : ".$e->getLine()." - ".$e->getMessage();
        $this->init();    // ligne 195, objet parent =  afiche le formulaire
      }
   }

   function validOK () {
	 $this->affichage();
     // Récupération et traitement des données postées //
	 $idmembrecourant = $_POST['identifiant'];
     $nom   = /* strtoupper( */trim($_POST['nom'])/* ) */; //nom (2  dans as_membres)
     $prnm  = trim($_POST['prenom']); //prenom (3)
     $cour  = trim($_POST['courriel']);  //melperso (6)
     $cod   = $this->initiales($nom, $prnm); // code_acces de as_membres (9)
     $mdp   = $this->motpasse();  // série de 8 chiffres //  Ligne 174  (7)

	 $sexe  = trim($_POST['sexe']);
	 $debutdate=$_POST['debutdate'];
	 $findate='000000';
	  $identifiant=intval($this->$_mmb['id_membre']);
	echo ('<br/>ligne 1018 '.$idmembrecourant. $sexe.' '.$prnm.' '. $nom.' '.$cour.' '.$cod.' '.$mdpm.' '.$debutdate.' '.$findate.'<br/>');
	echo('ligne 1019 $idmembre = '.$idmembre.'<br/>ligne 1019  $identifiant='.$this->$identifiant.'<br/>ligne 1019  $_POST[prenom]=');var_dump($_POST['prenom']);
// Insertion des données saisie validéesdans la BDD
// ================================================
     $oBd = new Badedo();
     ////$rq = "UPDATE as_membres SET `prenom`=$prn WHERE as_membres.id_membre=$this->$_mmb->id_membre()";

	 $rq = "UPDATE as_membres SET prenom='$prnm' WHERE /* as_membres. */id_membre=$idmembrecourant";//$rq = "UPDATE as_membres SET `prenom`=$prnm WHERE /* as_membres. */id_membre=1";
     $id = $oBd->lit_rq($rq);if($id){echo('ligne 1011 UPDATE a fonctionné');} else {echo('ligne 1011 UPDATE a pas fonctionné');};
	// $oBd = new PDO ('mysql:host=ajamovhphfo.mysql.db;dbname=ajamovhphfo' , 'ajamovhphfo' ,'MdpBdAjam9'); 
	 //$q=$oBd->prepare("UPDATE as_membres SET prenom=$prnm WHERE id_membre=1");
	// $q->execute();
	/* $pren='chouchou2'; */echo('<br/>ligne 1015 $prnm ='.$prnm.'<br/>var_dump($prnm)=');var_dump($prnm);echo('<br/>ligne 1015 $idmembre = '.$idmembre.'<br/>ligne 1015 $_POST[selection]=');var_dump($_POST['selection']);echo('<br/>ligne 1015 $this->_mmb=');var_dump($this->_mmb);
	 //$req=$oBd->prepare("UPDATE as_membres SET prenom='$prnm' WHERE id_membre=1");echo('<br/>ligne 1005'.$pren);var_dump($pren);
	//	$req->execute();
		echo('<br/>ligne 1007 $idmembre = '.$idmembre.'<br/>');
	 
// Information echec de la MAJ de la BDD
// =====================================
       return $result != FALSE; // 0 lines or FALSE

     $lognum = strval(111 + $_idmembre); // nouveau code accès
     $login  = $cod.$lognum;

   }

function affichage() 
	{
		echo('<br/>*****depuis affichage()*****');
		echo('<br/>$this->$idmembre = '.$this->$idmembre.'<br/>$_SESSION[id_membreamodifier]  =');  var_dump($_SESSION['id_membreamodifier']);
		echo('<br/>$_POST[selection]=');var_dump($_POST['selection']);
		echo('<br/> var_dump ($_mmb)= ');var_dump($this->$_mmb);
		echo('<br/> var_dump (_mmb)= ');var_dump($this->_mmb);
		echo('<br/> $this->$idmembrecourant= '.$this->$idmembrecourant);
		echo('<br/>*****fin de  affichage()*****');echo('<br/>');
	}




} //fin class ModiMbr






/***********************************/
/*  class TableauBd                */
/***********************************/
class TableauBd extends /* PDO */ mysqli//($unNom)
{
private const _desTables = array('as_membres','as_eleves');
 const DB_SERV =  'ajamovhphfo.mysql.db';
 const DB_USER =  'ajamovhphfo';
 const DB_PASS =  'MdpBdAjam9';
 const DB_BASE =  'ajamovhphfo';
public $nomTable ;
public $oTableauBd;

function __construct($unNom)
 {
	 parent::__construct(self::DB_SERV, self::DB_USER, self::DB_PASS, self::DB_BASE);
	//parent::__construct($this->'mysql:host=ajamovhphfo.mysql.db;dbname=ajamovhphfo', $this->'ajamovhphfo', $this->'MdpBdAjam9');
	try
	{
	return /*$this-> $oTableauBd= */new PDO ('mysql:host=ajamovhphfo.mysql.db;dbname=ajamovhphfo' , 'ajamovhphfo' ,'MdpBdAjam9'); 
	}
	catch (Exception $e)
	{
	die('Erreur : ' . $e->getMessage());
	};
	$this->$nomTable = $unNom ;
 }// de __construct

public function getNom() 
 {
	return $this->$nomTable;  // ou bien $nomTable ?
 }
 
 public function nbrcoletligne()
/******************************************************/
/*  $choixtable => nom de la table                    */
/*  $choixchamps => liste de champs séparés par ,     */
/*  $choix tri => 'ORDER BY nom_un_champ' ou ''       */
/******************************************************/
{
	
	$sql = "SELECT * FROM $nomTable ";
//	$req = /* $this-> */parent::query($sql);
	$req = parent::prepare('SELECT * FROM as_membres');
	$req->execute();
//	var_dump($req);echo('<br/>suite<br/>');
//	2  lignes précédentes remplacables par : $req = $obdd->query($sql);
	$nbrcol = $req->/* parent::columnCount */field_count;
	//return $nbrcol;
//	$nbrlignes = $req->rowCount();
 $nbrlignes=123;
	//return $nbrlignes;
	return array($nbrcol, $nbrlignes);
	$req->closeCursor(); 
}

	
} // de class TableauBd







class MenuVisit {
/******************************
 * Menu, les liens sur une ligne
 ******************************/
    protected
       $_idp,$_page,
       $_groupes = array() ;
    function __construct ($i,$p)  // Variable globale 'id_perso'
	{       
       $this->_idp  = $i;                         // id du membre ou zero si pas d'identification préalable
       $this->_page = substr(substr($p,1),0,-4);      // nom du fichier appelant ex : index
       $this->_groupes[] = 'visiteur'; //$this->_groupes[] = 'commun';
       $this->Affiche();
    }
    protected function Affiche() {
 /********************
 *  Dans tous les cas la barre de menu affiche le groupe 'commun'.
 *  Elle n'affiche les autres liens que si le visiteur
 *  -  est identifié
 *  -  et est concerné.
 * les groupes sont : commun, gest, bural,tuteur
 * Problème à résoudre : reste en mémoire !
 *
 * Je n'ai pas rédigé les méthodes (elles sont simples à faire)
 *     pour ne conserver que les pages de le comppétence du visiteur
 *
*********************/
        if ($this->_idp > 0) //  visiteur identifié
		{                                      
           $this->_groupes[] = 'dekon';
                                                                              // si gestionnaire :
           if ($_SESSION['gestion']>0) $this->_groupes[] = 'gestionaire';
                                                                               // si membre du bureau :
           if ($_SESSION['bureau']>0) $this->_groupes[]  = 'bureau';
                                                                             // si parrain :
           if ($_SESSION['parrain']>0) $this->_groupes[] = 'parrain';
                                                                             // si dans comptabilite :
           if ($_SESSION['comptabilite']>0) $this->_groupes[] = 'comptables';
		   
        }
        $suite =  implode("','",$this->_groupes); // echo(' ligne836 $suite =');echo($suite);echo(' ligne836  $_SESSION[comptabilite]= '.$_SESSION['comptabilite']);echo(' ligne836   $_SESSION[bureau]= '.$_SESSION['bureau']); // texte conforme à la syntaxe de la requête qui suit
		// soit la requète :
        $oBd = new Badedo();
        $rq = "SELECT  page, bulle, nom FROM `as_menus` WHERE groupe IN('$suite') ORDER BY `rang`";  // OK
        $m  = $oBd->lit_rq($rq);
                                                                               // Affichage :
        $oTpl = new Template(SRC_TEMPLATE);
        $oTpl->set_filenames(array('menu' => 'barremenu.tpl'));
        foreach($m as $row)
         $oTpl->assign_block_vars('items',array(
            'LIEN'       => $row['page'].'.php',
            'BULLE'      =>  $this->_page==$row['page']?'Vous y êtes !':$row['bulle'], 
            'NOM'        => $row['nom']
         ));
       $oTpl->pparse('menu');
    }
} // de class MenuVisit






class MenuPage {     // vérifié, correct
/**************************************************
 * Affichage des liens ves les sous-menus éventuels
 ***************************************************/
    protected
       $_page;
    function __construct ($p) {
       $this->_page = substr(substr($p,1),0,-4); // nom du fichier appelant ex : index
       $this->Affiche();
    }
    protected function Affiche() {
        $oTpl = new Template(SRC_TEMPLATE);
        $oTpl->set_filenames(array('menu' => 'barremenu.tpl'));
        $oBd = new Badedo();
        $rq = "SELECT `page`,`bulle`,`nom` FROM `as_sousmenus` WHERE `parent`='$this->_page' ORDER BY 'rang'" ;
        $res = $oBd->lit_rq($rq);
        if ($res>0) {
            foreach($res as $row)
               $oTpl->assign_block_vars('items',array(
                  'LIEN'       => $row['page'].'.php',
                  'BULLE'      => $this->_page==$row['page']?'courant':$row['bulle'],
                  'NOM'        => $row['nom']
            ));
        }
        $oTpl->pparse('menu');
    }
}







class MdpPerdu extends Membres {
// Propriétés
// ==========

// Constructeur
// ============
   function __construct () {
     if ($_SESSION['id_perso']) { // si positif ... déjà connecté !
       $m     = "Vous vous êtes identifié avec votre mot de passe !";
       $oInfo = new Info($m);
       exit;
     }
     $this->setAside();
     $this->setForm();
     $this->setSubmit();
     if (empty($_POST)) $this->init();  //  Template 'deuxcol' et 'formulaire'
     elseif (isset($_POST['valid'])) $this->traiteValid ();
     elseif (isset($_POST['aband'])) $this->traiteAband ();
   }
// Méthodes
// ============
   function setAside() {
      $this->aside_head  = "Mot de passe perdu";
      $this->aside_param = array(
        'Bonjour ! Vous allez recevoir un nouveau mot de passe....',
        ' ... que pourrez ensuite personnaliser.'  );
   }
   function setForm () {
       // information haut de colonne content
       $this->content_head = "Les techniques de cryptage utilisées ne permettent pas de décrypter votre mot de passe.
               Il est donc impossible de vous le donner !
               Un nouveau mot de passe sera généré et vous sera envoyé à l'adresse courriel que vous avez fournie lors de votre inscription.
               Si vous ne vous souvenez plus de cette adresse veuillez nous joindre par courriel.";
       $this->content_form_legend = "Demande d'information personnelle";
       // tableau des paramètres de saisie et affectation dans le gabarit
       $this->content_form_saisie = array(
       array('nom'=>"code",'texte'=>"* Veuillez saisir votre code d'identification :",
             'type'=>'text','long'=>"5",'max'=>"5",'value'=>"$this->cod_acc",
             'oblig'=>'oblig',
             'aide'=>"2 lettres et 3 chiffres : fournis lors de votre inscription",
             'i_source'=>"https://www.ajam.ovh/fortout/images/quoi.ico",
             'i_haut'=>"15",'i_long'=>"15",'i_alt'=>'note sur le code accès',
             'legende'=>"... de la forme AB123"),
       array('nom'=>"courriel",'texte'=>" * Veuillez saisir votre adresse e-mail :",
             'type'=>'email','long'=>"30",'max'=>"30",'value'=>"$this->courriel",
             'oblig'=>'oblig',
             'aide'=>"adresse protégée qui ne sera pas communiquée",
             'i_source'=>"https://www.ajam.ovh/fortout/images/quoi.ico",
             'i_haut'=>"15",'i_long'=>"15",'i_alt'=>"note sur le courriel",
             'legende'=>NULL)
             );
    }
   function setSubmit() {
       $this->boutons = array('OK','valid','ENVOYER LA DEMANDE',
                             'annul','aband','ABANDONNER !');  }
   function traiteValid () {
      try  {
        // Vérification champs vides
        if( empty($_POST['code']) || empty($_POST['courriel']) )
          throw new Exception("ERREUR DE SAISIE : tous les champs doivent être remplis ! Veuillez compléter ...");

        // Vérification validité saisie code accès
        $modele = '#^([A-Z]{2})([0-9]{3})$#';
        $p      = preg_match($modele,$_POST['code'],$matches);
        if(!$p) throw new Exception("Saisie code accès non conforme");

        // identifiant du membre dans la table as_membres
        $this->id_membre = intval($matches[2]) - 111;

        // Vérification adresse courriel
        $cour = trim($_POST['courriel']); // supprime espaces avant et après
        $vld  = filter_var($cour,FILTER_VALIDATE_EMAIL);
        if (!$vld)  throw new Exception ("Adresse courriel non valide !");
        $this->courriel = $cour;

        // on ne vérifie pas les initiales, le contrôle courriel suffit
        $i   =  $this->id_membre;
        $oBd = new Badedo();
        $rq  = "SELECT * FROM as_membres WHERE id_membre='$i' AND melperso = '$cour'";
        $res = $oBd->lit_rq($rq);
        if (empty($res))
           throw new Exception("Saisies incompatibles avec les données précédemment communiquées !  Si indispensable, mail à AJAM !");

        // pas d'erreur donc ...
        $this->validOK();
      }

      catch (Exception $e){
        $this->messano = $e->getMessage();
        $this->init();
      }
   }
   function validOK () {
      $mdp_nouv = $this->motpasse();
      $i    = $this->id_membre;
      $cour = $this->courriel;
      $oBd  = new Badedo();
      $rq   ="UPDATE as_membres SET  mdp=($mdp_nouv), krypt=md5('$mdp_nouv') WHERE id_membre={$i}";
      $oBd->lit_rq($rq);
      // Mail au demandeur
      $mes = "MOT de PASSE perdu"."\n";
      $mes .="=============="."\n";
      $mes .="Bonjour !"."\n";
      $mes .="La méthode de cryptage utilisée rend impossible"."\n";
      $mes .="la lecture de votre mot de passe perdu."."\n";
      $mes .="Un nouveau mot de passe a été généré"."\n";
      $mes .="soit ... :  $mdp_nouv"."\n";
      $mes .="Utilisez ce mot de passe pour vous identifier,"."\n";
      $mes .="vous pourrez ensuite le personnaliser."."\n";
      $mes .="en utilisant la page spécifique"."\n";
      $mes .="=============="."\n";
      $mes  = utf8_decode($mes);
      $mes  = wordwrap($mes,70);
      // envoi au membre
      $obj = "Mot de passe perdu";
      mail($cour, $obj, $mes);
      // message d'information
      $m="MERCI !  Vous allez recevoir un courriel avec votre nouveau mot de passe";
      $oInfo = new Info($m);
   }
}







class Associes 
{
/******************
 * Ensemble de méthodes de consultation des données
 * des tables concernant les membres de l'association
 *******************/

/******************
* METHODES
********************/

    public function duos($i) {  // Renvoie l'identifiant du second membre du DUO, s'il existe
       $rq = "SELECT (id_membre1 + id_membre2 - $i) AS bin FROM as_duos WHERE (id_membre1=$i OR id_membre2=$i) AND actuel";
       $oBd = new Badedo();
       $_rs = $oBd->lit_rq($rq);
       return $_rs[0]['bin'];
    }

    public function parrain($i) { // Renvoie 1 ou 0 si parrain ou non
       $rq  = "SELECT `id_parrainage` FROM as_parrainages WHERE `idparrain`=$i";
       $oBd = new Badedo();
       $_rs = $oBd->lit_rq($rq);
       $res = 0; if ($_rs) $res = 1;
       return $res;
    }

    public function buro($i) {
       //attention aux cotes et pas de parenthèses
       $rq  = "SELECT `id_bureau` FROM as_bureau WHERE`idpresid`=$i OR `idvicepresid`=$i OR `idtresor`=$i OR `idsecret`=$i OR `idautre1`=$i OR `idautre2`=$i OR `idautre3`=$i OR `idautre4`=$i OR `idautre5`=$i  AND `findate`='000000'   ";
       $oBd = new Badedo();
       $_rs = $oBd->lit_rq($rq);/* var_dump($_rs);*/
       $res = 0; if ($_rs) $res = 1;
       return $res;
    }

    public function gestion($i) {
       $rq  = "SELECT `id_gestion` FROM as_gestion WHERE`id_gest`=$i";
       $oBd = new Badedo();
       $_rs = $oBd->lit_rq($rq);/* var_dump($_res);*/
       $res = 0; if ($_rs) $res = 1;
       return $res;
    }
	
	public function comptabilite($i) {
       //attention aux cotes dans $rq :  ` pas '
	   $rq  = "SELECT `id_comptabilite` FROM as_comptabilites WHERE`idordonateur`=$i OR `idtresorier`=$i AND `findate`='000000' ";
	   //$rq  = "SELECT `id_comptabilite` FROM as_comptabilites WHERE((`idordonateur`=$i) OR (`idtresorier`=$i))"; 
       $oBd = new Badedo();
       $_rs = $oBd->lit_rq($rq);
       $res = 0; if ($_rs) $res = 1;
       return $res;
    }
} // de class Associes



?>