Index: /tags/bug-1_3_2-50/include/vtemplate.class.php
===================================================================
--- /tags/bug-1_3_2-50/include/vtemplate.class.php	(revision 547)
+++ /tags/bug-1_3_2-50/include/vtemplate.class.php	(revision 547)
@@ -0,0 +1,592 @@
+<?php
+/*****************************************************************
+ *			VIRTUAL-TEMPLATE
+ *
+ * Version : 1.3.2 Base Edition ( Decembre 2003 ) build 1
+ *
+ * Address : http://vtemplate.sourceforge.net
+ * 
+ * Authors: 
+ *   + THIEBAUT Jean-Baptiste(J.Baptiste@leweby.com)  -  http://www.leweby.com .
+ *   + CAMPANA François (fc@netouaibe.com).
+ * Licence: GPL.
+ * 
+ * 
+ *
+ *			  
+ *****************************************************************/ 
+// to make it work on nexen.net
+set_magic_quotes_runtime(0);
+
+if ( !isset( $DEFINE_VTEMPLATE ) )
+{
+  define("ALL",1);
+  // Tag d'ouverture des variables : vous pouvez changer ce paramètre.
+  define("VARTAG","{#");
+  define("VTEMPLATE_VERSION","1.3.1");
+  define("VTEMPLATE_TYPE","BA");
+  define("VTEMPLATE_BUILD","6");
+  
+  class Err {
+    var $msg;
+    var $titre;
+
+    function error( $errno, $arg = "", $code = 0, $disp = 0 ) {
+      // Gestion des erreurs
+      switch ( $errno )
+      {
+      case 1:
+        $this->titre="Erreur de session n° $code";
+        $this->msg = "La zone $arg est déjà ouverte.Avant d'ajouter une session sur cette zone, vous devez la fermer à l'aide de la fonction closeSession().<br>"	;
+        break;
+      case 2:
+        $this->titre="Erreur de session n° $code";
+        $this->msg = "Vous tentez de fermer une session de la zone $arg alors qu'aucune session pour cette zone n'existe.Pour ouvrir une session, utilisez la fonction addSession().<br>";
+        break;
+      case 3:
+        $this->titre="Erreur de session n° $code";
+	$var = $arg[1];
+	$zone = $arg[0];
+        $this->msg = "Vous essayez de valoriser la variable $var sans avoir créer de session de la zone $zone.Utilisez la fonction addSession() pour créer une session, puis setVar pour valoriser une variable.<br>";
+        break;
+      case 4:
+        $this->titre="Erreur de session n° $code";
+	$var = $arg[1];
+	$zone = $arg[0];
+        $this->msg = "La variable $var que vous souhaitez valoriser n'existe pas dans la zone $zone.<br>";
+        break;
+      case 5:
+        $this->titre="Erreur de parsing n° $code";
+        $this->msg = "Vous utilisez des caractère non autorisés pour déclarer vos zones.Vous pouvez utiliser tous les caractères à l'exception de \'{\' , \'#\' \'}\' et \'|\'.<br>";
+        break;
+      case 6:
+        $this->titre="Erreur de parsing n° $code";
+        $this->msg = "Vous ne pouvez pas utiliser le même nom ($arg)de zone plusieurs fois.<br>";
+        break;
+      case 7:
+        $this->titre="Erreur de parsing n° $code";
+        $this->msg = "Vous avez oublié de fermer la zone $arg.<br>";
+        break;
+      case 8:
+        $this->titre="Erreur de traitement n° $code";
+        $this->msg = "Le fichier template $arg est introuvable.<br>";
+        break;
+      case 9:
+        $this->titre="Erreur de traitement n° $code";
+        $this->msg = "Impossible d'ouvrir le fichier $arg.Vérifiez les droits de ce fichier.<br>";
+        break;
+      case 10:
+        $this->titre="Erreur de traitement n° $code";
+        $this->msg = "Impossible de lire le fichier template $arg.<br>";
+        break;
+      case 11:
+        $this->titre="Erreur de traitement n° $code";
+        $this->msg = "La zone $arg est introuvable.Vérifiez la syntaxe de cette zone.<br>"; 
+        break;
+      case 12:  
+        $this->titre="Erreur de traitement n° $code";
+        $this->msg = "La variable $arg est introuvable .Vérifiez la syntaxe de la variable.<br>";	
+        break;
+      case 13:
+        $this->titre="Erreur de traitement n° $code";
+        $this->msg = "L'identifiant de fichier spécifié n'existe pas.Vérifiez les fonctions Open() de votre script.<br>";
+        break;  
+      case 14:
+        $this->titre="Erreur de traitement n° $code";
+	$var = $arg[1];
+	$file = $arg[0];
+        $this->msg = "La variable $var dans le fichier $file est introuvable.Vérifiez la syntaxe de la variable.<br>";	
+        break;  
+      case 15:
+        $this->titre="Erreur de traitement n° $code";
+	$var = $arg[2];
+	$zone = $arg[1];
+	$fichier = $arg[0];
+        $this->msg = "La variable $var dans la zone $zone du fichier $fichier est introuvable.Vérifiez la syntaxe de la variable et du nom de la zone.<br>";
+        break; 
+      default:
+        $this->titre = "Erreur inconnue $code";	 
+        $this->msg = "Veuillez le rapporter aux auteurs de la classe.";
+      }
+      $this->titre .= ": <br>";
+      if ( $disp )
+      {
+	$web = "Pour plus d'informations, consultez la <a href=\"http://www.virtual-solution.net/vtemplate/docs/debug-mod.php?version=".VTEMPLATE_VERSION."&build=".VTEMPLATE_BUILD."&type=".VTEMPLATE_TYPE."&error=$code\" target=\"_blank\">doc en ligne</a>";
+	echo "<font face=verdana size=2 color=red><u>$this->titre</u><i>$this->msg</i>$web<br><br></font>";
+      }
+      return -1;
+    }
+  } // Fin classe
+
+  class Session extends err {
+    var $name;		// Name of the session
+    var $globalvar = array();  // List of global variable of the session
+    var $varlist = array();  // List of var in this session
+    var $subzone = array(); // list of sub-zone
+    var $temp; // Generated code for the current session
+    var $generated = NULL; // The final code
+    var $source; // Source code
+    var $used=0; // Indicates if the session contain used variable
+    var $stored; // Give the filename were is stored the session
+
+    function Session( $name, $source, $stored ) {
+      $this->name = $name;
+      $this->source = $source;
+      $this->stored = $stored;
+      $this->parseVar();
+    }
+
+    function parseVar(){
+      // Récupération des noms des variables
+      $regle = "|".VARTAG."(.*)}|sU"; 
+      preg_match_all ($regle,$this->source,$var1);
+      // Création du tableau de variable  à partir de la liste parsée.
+      $this->varlist=@array_merge((array)$var[1],(array)$var1[1]);
+      return 1;
+    }
+
+    function init(){
+      if ( $this->used )
+        return $this->error(1,array($this->stored,$this->name),"SESSION1",1);
+      // Reset generated code
+      $this->temp = $this->source;
+      $this->used = 1;
+    }
+
+    function closeSession(){
+      // Check if the zone has been used.    
+      if ( !$this->used )
+        return $this->error(2,array($this->stored,$this->name),"SESSION2",1);
+      // Set Globals vars.
+      $this->generateCode();
+      $this->used=0;
+      return 1;
+    }
+
+    function reset(){
+      $this->used = 0;
+      $this->generated = NULL;
+      return 1;
+    }
+
+    function addSubZone( &$subzone ) {
+      $this->subzone[$subzone->name] = &$subzone;
+      return 1;
+    }
+
+    function setVar($varname,$value){
+      if ( !$this->used )
+        return $this->error(3,array($this->stored,$this->name,$varname),
+                            "SESSION3",1);
+      if (!in_array($varname,$this->varlist))
+        return $this->error(4,array($this->name,$varname),"SESSION4",1);
+      $regle = "(\\".VARTAG."$varname\})";
+      $this->temp = preg_replace($regle,$value,$this->temp);
+      return 1;
+    }
+
+    function dispVar(){
+      echo "Liste variables de $this->name:<br>";
+      foreach ( $this->varlist as $vars ) echo "$vars <br>";
+    }
+
+    function setGlobalVar($varname,$value){
+      $set = 0;
+      if (in_array($varname,$this->varlist ) )
+      {
+        // Replace the var into this session 
+        $this->globalvar[$varname]=$value;   
+        $set = 1;
+      }
+      // Replace the var into sub zones
+      foreach(array_keys($this->subzone) as $subzone){
+        $set = $this->subzone[$subzone]->setGlobalVar($varname,$value) || $set;
+      }
+      return $set;
+    }
+
+    function replaceGlobalVar(){
+      if ( count($this->globalvar) )
+      {
+        foreach($this->globalvar as $varname => $value) {
+          $regle = "(\\".VARTAG."$varname\})";
+          $this->temp = preg_replace($regle,$value,$this->temp);
+        }
+      }
+    }
+
+
+    function generateCode(){
+      if ($this->used == 0) return $this->generated;
+      // Replace global var.
+      if ( count($this->globalvar) ) $this->replaceGlobalVar();
+      // Replace all unused variable by ""
+      $regle = "|\\".VARTAG."([^}]*)\}|";
+      $this->temp = preg_replace($regle,"",$this->temp);
+      // Generate the subzone(s) code
+      if(count($this->subzone)){
+        foreach(array_keys($this->subzone) as $subzone){
+          $text = ($this->subzone[$subzone]->used) ? $this->subzone[$subzone]->generateCode() : $this->subzone[$subzone]->generated;
+          $this->temp = preg_replace("(\|$subzone\|)",$text,$this->temp); 	
+          $this->subzone[$subzone]->reset();
+        }
+      }
+      $this->generated .= $this->temp;
+      return $this->generated;
+    }
+
+    function inVarList($varname){
+      return in_array($varname,$this->varlist);
+    }
+  } // Fin classe
+
+  class VTemplate_Private extends Err{
+    /**************************************** 
+     *	        Private Class.              *
+     ****************************************/
+
+    var $sources=array(); // Sources des zones issues
+                          // de la premiere partie du parsing.
+    var $sessions=array(); // Tableau de sessions
+    var $v_global=array(); // Globla var array.
+
+/****************************************************************
+	    Parsing Functions for Template files.  ( PF 1.0 )
+ ****************************************************************/
+
+    function getNom($code){
+      // Retourne le premier nom de zone qu'il trouve dans le code
+      preg_match("(<!--VTP_([^()]+)-->)sU",$code,$reg);   
+      // Tester la présence des caratère invalides dans le nom ( | et {});
+      if ( @count( explode("|",$reg[1]))>1
+           || @count(explode("{",$reg[1]))>1
+           || @count(explode("}",$reg[1]))>1 )
+        exit($this->error(5,$reg[1],"PARSE1",1));
+      return @$reg[1];
+    }
+
+    function endTag($code,$nom){
+      // Renvoie TRUE(1) si le tag de fermeture est présent.
+      preg_match("(<!--/VTP_$nom-->)sU",$code,$reg);
+      return ($reg[0]!="<!--/VTP_$nom-->") ? 0 : 1;
+    }
+
+    function getSource($code,$nom,$type=0){
+      // Retourne le source de la zone de nom $nom
+      preg_match_all ("(<!--VTP_$nom-->(.*)<!--/VTP_$nom-->)sU",$code,$reg);
+      return $reg[$type][0];
+    }
+
+    function parseZone($code_source,$nom_zone="|root|"){
+      // Fonction récursive de parsing du fichier template
+      // Vérification que la zone n'existe pas
+      if (isset($this->sources[$nom_zone]))
+        exit($this->error(6,$nom_zone,"PARSE2",1));
+      // Enregistrement du code source
+      $this->sources[$nom_zone]["source"]=$code_source;
+      // Rappel de la fonction pour chaque fils.
+      while ($nom_fils=$this->getNom($this->sources[$nom_zone]["source"]) ) {
+        // Vérification que le tag de fin est présent.
+        if (!$this->endTag($code_source,$nom_fils))
+          exit($this->error(7,$nom_fils,"PARSE3",1));
+        // Parse le fils
+        $this->parseZone($this->getSource($this->sources[$nom_zone]["source"],$nom_fils,1),$nom_fils);
+        // Enregistre le nom du fils dans la liste des fils
+        $this->sources[$nom_zone]["fils"][]=$nom_fils;
+        // Remplace le code du fils dans le source du père
+        $this->sources[$nom_zone]["source"]=str_replace(
+          $this->getSource($this->sources[$nom_zone]["source"],$nom_fils,0),
+          "|$nom_fils|",
+          $this->sources[$nom_zone]["source"]);
+        // Teste si la zone $nom_fils n'existe pas plusieurs fois
+        // dans la zone $nom_zone
+        if (count(explode("|$nom_fils|",$this->sources[$nom_zone]["source"]))>2)
+          exit($this->error(6,$nom_fils,"PARSE4",1));
+      } // fin While
+      return 1;
+    }
+
+/****************************************************************
+	    Session Management functions ( SMF 1.0 )
+ ****************************************************************/
+
+    function createSession($handle,$zone = "|root|"){
+      // Create a new session of the zone
+      $this->sessions[$handle][$zone] = new Session($zone,$this->sources[$zone]["source"],$this->file_name[$handle]);
+      // Create sub-zone
+      if (@count($this->sources[$zone]["fils"])){
+        foreach($this->sources[$zone]["fils"] as $subzone){	  
+          $this->createSession($handle,$subzone);
+          $this->sessions[$handle][$zone]->addSubZone($this->sessions[$handle][$subzone]);
+        }
+      }
+      //end createSession
+    }
+
+
+/****************************************************************
+	    Global Variable Management Functions ( GVMF 1.0 )
+ ****************************************************************/
+
+    function setGZone($handle,$zone,$var,$value){
+      // Define Global var for $zone and its sub-zone.
+      // Set global value to $zone vars.
+      return $this->sessions[$handle][$zone]->setGlobalVar($var,$value);
+    }
+
+    function setGFile($handle,$var,$value) {
+      return $this->sessions[$handle]["|root|"]->setGlobalVar($var,$value);
+    }
+
+    function setGAll($var,$value){
+      $declare = 0;
+      $this->v_global[$var]=$value;
+      if (is_array($this->sessions)){
+        foreach($this->sessions as $handle => $v){
+          $declare = $this->setGFile($handle,$var,$value) || $declare;
+        }	
+      } 
+      return $declare;
+    }
+
+    function setGOpened($handle){
+// Set Global var into the opened file
+      foreach($this->v_global as $name => $val){
+        $this->setGFile($handle,$name,$val);
+      }
+      return 1;
+    }
+ 
+// Fin VTemplate_Private
+  }
+
+
+  class VTemplate extends VTemplate_Private{
+/****************************************
+ *	   Public Class.		*
+ * ***************************************/
+
+
+/****************************************************************
+	    Core Functions 
+*****************************************************************/
+
+
+    function Open($nomfichier){
+// Ouverture d'un fichier source et retourne le handle de ce fichier
+// Création du handle:
+      $handle =  "{".count($this->sessions)."}" ;
+
+
+// Récupération du source à parser
+      if (!@file_exists($nomfichier)) return $this->error(8,$nomfichier,"TTT1",1);
+      if (!$f_id=@fopen($nomfichier,"r")) return $this->error(9,$nomfichier,"TTT2",1);
+      if (!$source=@fread($f_id, filesize($nomfichier))) return $this->error(10,$nomfichier,"TTT3",1);
+      clearstatcache();
+      fclose($f_id);
+
+// Store the filename
+      $this->file_name[$handle]=$nomfichier;
+
+// Parse les zones
+      $this->parseZone($source);
+
+// Création du tableau de session
+      $this->createSession($handle);
+
+//Nettoyage des variables temporaires
+      $this->sources=NULL;
+
+// Set global var.
+      $this->setGOpened($handle);
+
+      $this->addSession($handle);
+      return $handle;
+    }
+
+    function newSession($handle="{0}",$nom_zone = "|root|"){
+      if ( $this->sessions[$handle][$nom_zone]->used ) $this->closeSession($handle,$nom_zone);
+      $this->addSession($handle,$nom_zone,$cache,$time,$num_session);
+      return 1;
+    }
+
+    function addSession($handle="{0}",$nom_zone = "|root|"){
+      // Does the zone exist ?
+      if(!isset($this->sessions[$handle][$nom_zone])) return $this->error(11,array($nom_zone,$this->file_name[$handle]),"TTT4",1);   
+      $this->sessions[$handle][$nom_zone]->init();
+      return 1;
+    }
+
+    function closeSession($handle="{0}",$nom_zone = "|root|"){ 
+// Close the current session and all his sub-session
+      // Check if the zone exists.
+      if(!isset($this->sessions[$handle][$nom_zone])) return $this->error(11,array($nom_zone,$this->file_name[$handle]),"TTT5",1);
+      // Closing sub-zone
+      $this->sessions[$handle][$nom_zone]->closeSession();	
+      return 1;
+    }
+
+    function setGlobalVar($arg1,$arg2,$arg3){
+      if ($arg1 == 1){
+        if (!$this->setGAll($arg2,$arg3)) return $this->error(12,$arg2,"TTT6",1);
+        return 1; 
+      }
+      if (!isset($this->sessions[$arg1])) return $this->error(13,$arg1,"TTT7",1);
+      $tab=explode(".",$arg2);
+      if (count($tab)==1){
+        if (!$this->setGFile($arg1,$arg2,$arg3)) return $this->error(14,array($this->file_name[$arg1],$arg2),"TTT8",1);
+      }
+      else if (count($tab==2)){
+        if (!isset($this->sessions[$arg1][$tab[0]])) return $this->error(11,array($tab[0],$this->file_name[$arg1],"TTT9",1));
+        if (!$this->setGZone($arg1,$tab[0],$tab[1],$arg3)) return $this->error(15,array($this->file_name[$arg1],$tab[0],$tab[1]),"TTT10",1);
+      }
+      return 1;
+    }
+
+    function setVar($handle,$zone_var,$val){
+      // Fill the variable
+      $tab=explode(".",$zone_var);
+      if(count($tab)==2){
+        $zone=$tab[0];
+        $var=$tab[1];
+      }
+      else
+      {
+        $zone="|root|";
+        $var=$tab[0];
+      }
+
+      // Teste l'existence de la zone dans la liste
+      if (!isset($this->sessions[$handle][$zone])) return $this->error(11,array($this->file_name[$handle],$zone),"TTT11",1);
+
+      //Enregistre la variable
+      return $this->sessions[$handle][$zone]->setVar($var,$val);
+    }
+
+    function Parse($handle_dest,$zone_var_dest,$handle_source,$zone_source="|root|"){
+      if($this->sessions[$handle_source][$zone_source]->used == 1) $this->closeSession($handle_source,$zone_source);
+      $this->setVar($handle_dest,$zone_var_dest, $this->sessions[$handle_source][$zone_source]->generated);
+    }
+
+    function setVarF($handle,$zone_var,$file){
+// Fonction qui ouvre le fichier file et copie ce qu'il y a dedans dans une variable.
+      $tab=explode(".",$zone_var);
+
+// Récupération nom de la zone et de la variable.
+      if(count($tab)==2){
+        $zone=$tab[0];
+        $var=$tab[1];
+      }
+      else
+      {
+        $zone="|root|";
+        $var=$tab[0];
+      }
+// Teste l'existence de la zone dans la liste
+      if (!is_object($this->sessions[$handle][$zone])) return $this->error(11,array($handle,$zone),"TTT12",1);
+
+      // Récupération du source à lire
+      if (!@file_exists($file)) return $this->error(8,$file,"TTT13",1);
+      if (!$f_id=@fopen($file,"r")) return $this->error(9,$file,"TTT14",1);
+      if (!$val=@fread($f_id, filesize($file))) return $this->error(10,$file,"TTT15",1);
+      clearstatcache();
+      fclose($f_id);
+
+//Enregistre la variable
+      return $this->sessions[$handle][$zone]->setVar($var,$val);
+    }
+
+
+
+
+
+    function isZone($handle, $zone="|root|") 
+      { 
+        return isset($this->sessions[$handle][$zone]) ; 
+      } 
+
+    function Display($handle="{0}",$display=1,$zone="|root|"){
+      $this->closeSession($handle,$zone);
+      $c_genere = $this->sessions[$handle][$zone]->generated; 
+	
+      if ($display) echo $c_genere; else return ($c_genere);
+    }
+//fonction complementaire version BETA
+
+/*
+ * 
+ On peut l'utiliser : 
+- SetVarTab($array): tout les couples clef/valeur sont valorisées 
+- SetVarTab($array,$index) seuls les couples clef/valeur dont la clef est dans le tableau index ou dont la valeur == $index (si pas tableau) 
+Si $index contient ou est une clef de type zone.clef, la clef sera extraite du texte est servira d'index pour $array 
+
+Vincent 
+*/
+
+    function setVarTab($handle,$zones,$index = array()){ 
+      if (is_array($index)) 
+      { 
+        if (count($index)>0) 
+        { 
+          reset($index); 
+          while (list (, $key) = each ($index)) 
+          { 
+            $tab=explode(".",$key); 
+            if(count($tab)==2){ 
+              $var=$tab[1]; 
+            } 
+            else 
+            { 
+              $var=$tab[0]; 
+            } 
+            setVar($handle,$key,$zones[$var]); 
+          } 
+        } 
+        else 
+        { 
+          reset($zones); 
+          while (list ($key, $val) = each ($zones)) 
+          { 
+            setVar($handle,$key,$val); 
+          } 
+        } 
+      } 
+      else 
+      { 
+        setVar($handle,$index,$zones[$index]); 
+      } 
+    } 
+
+    function setGlobalVarTab($handle,$zones,$index = array()){ 
+      if (is_array($index)) 
+      { 
+        if (count($index)>0) 
+        { 
+          reset($index); 
+          while (list (, $key) = each ($index)) 
+          { 
+            $tab=explode(".",$key); 
+            if ( count( $tab ) == 2 ) $var=$tab[1]; 
+            else                      $var=$tab[0]; 
+            setGlobalVar( $handle, $key, $zones[$var] );
+          } 
+        } 
+        else 
+        { 
+          reset($zones); 
+          while (list ($key, $val) = each ($zones)) 
+          {
+            GlobalVar($handle,$key,$val); 
+          } 
+        } 
+      } 
+      else 
+      {
+        setBlobalVar($handle,$index,$zones[$index]); 
+      } 
+    } 
+    // End VTemplate
+  }
+  $DEFINE_VTEMPLATE = 1;
+}
+?>
