<?php
//$Id: fpdf_etatparc.php,v 1.4 2006-08-25 14:59:58 fgiva Exp $
// openMairie : http://www.openmairie.org
// contact@openmairie.org

require_once "fpdf.php";
class PDF extends fpdf
{
var $footerfont;
var $footerattribut;
var $footertaille;

//Elimine les accents de chaines pour tri par strcasecmp() compatible avec MySql
function ElimineAccent($str) {
  $str=str_replace("é","e",$str);
  $str=str_replace("è","e",$str);
  $str=str_replace("ê","e",$str);
  $str=str_replace("à","a",$str);
  return $str;
}

// surcharge fpdf
//Pied de page
function Footer()
{
    //Positionnement à 1,5 cm du bas
    $this->SetY(-15);
    //Police Arial italique 8
    $this->SetFont('Arial','I',8);
    //Numéro de page
    $this->Cell(0,10,date('d/m/Y').'    Page '.$this->PageNo().'/{nb}',0,0,'C');
}

function TraiterSubsql($value,&$db,$ireq,$subsql,$ids) {
//  if (!is_null($value))
    if ($value=='subsql') {
      $subsql[1][$ireq]=str_replace("£ids",$ids,$subsql[1][$ireq]);
      $subsql[2][$ireq]=str_replace("£ids",$ids,$subsql[2][$ireq]);
      $subsql[3][$ireq]=str_replace("£ids",$ids,$subsql[3][$ireq]);
      $subsql[4][$ireq]=str_replace("£ids",$ids,$subsql[4][$ireq]);
      $value=$db->getOne($subsql[1][$ireq])." ";
      $value.=$db->getOne($subsql[2][$ireq])."Mo ";
      $value.=$db->getOne($subsql[3][$ireq])."Mo ";
      $value.=$db->getOne($subsql[4][$ireq]);
    }
  return $value;
}

//surcharge  nouvelle fonction
//
//prise en compte sous-chapitres
//2 niveaux possibles ($nbindent=nb niveaux)
//$nbindent a pour valeur 0 à 2
//la requete $sousetat['sql'] envoyée doit être de la forme          
//0: pas de sous-chapitre select... from... order by ... (pas de modif)
//1: 1 niveau de sous-chap select...,sel1 from... order by sel1,... 
//2: 2 niveaux de sous-chap select...,sel2,sel1 from... order by sel1,sel2,...
//les champs de chapitres sel.. doivent $etre ajoutés à la requete pour tester
//le changement de chapitre, la requete doit donc être ordonnée selon ces
//champs
//
//possibilité de masquer le(s) 1er(s) champ(s) de la requete si leur
//largeur vaut "" dans le .sousetat.inc
//$colini représente alors la 1ere colonne affichée
//
//implantation du multiligne avec variable $sousetat['cellule_multiligne'][j]
//à 1 elle provoquera l'appel de PrepareMulticell afin de modifier le texte
//de la cellule pour intégrer des \n si besoin est
//la nouvelle hauteur de ligne (multiheight) sera alors fixé selon le quota
//hauteur/nblignesmulti ($sousetat['cellule_hautmulti'])
function sousetat(&$db,$etat,$sousetat,$nbindent=0){
  for ($i=0;$i<count($sousetat['sql']);$i++) {
    if ($sousetat['sql'][$i]) {  //si requete demandée
      $res[$i] =& $db->query($sousetat['sql'][$i]);
      if (DB::isError($res[$i])) {
        $this->erreur_db($res[$i]->getDebugInfo(),$res[$i]->getMessage(),'');
      } else {
        $info[$i]=$res[$i]->tableInfo();
        //nombre de champ
        $nbchamp[$i]=count($info[$i])-$nbindent; //champs de sous-chapitre sel...non 
        //pris en compte dans .sousetat.inc et utilisés uniquement en titres
      }
      //rechercher 1ere colonne visible pour affichage TOTAL,...
      $colini[$i]=0;
      while (!$sousetat['cellule_largeur'][$i][$colini[$i]])
        $colini[$i]++;
      //couleur du tracé
      $this->SetDrawColor($sousetat['bordure_couleur'][$i][0],$sousetat['bordure_couleur'][$i][1],$sousetat['bordure_couleur'][$i][2]);
    }
  }
  //initialisation
  $champindent=array("","");
  $nbchap=array(0,0);
  $traitement[0]=true;
  for ($i=count($sousetat['sql'])-1;$i>=0;$i--) {
    if ($sousetat['sql'][$i]) {  //si requete demandée
      $row[$i]=& $res[$i]->fetchRow(DB_FETCHMODE_ASSOC); 
      $traitement[$i]=!is_null($row[$i]);
      if ($traitement[$i]) $ireq=$i;   //indique la requete active
    }
  }
  if (isset($ireq)) {
    //  $nouvellepage=true;
    $nouveautableau=true;  //indique ici le debut du sousetat
    $fintableau=false;
    while ($traitement[$ireq]){
      if (!$nouveautableau) {//si pas debut de sousetat
        $row[$ireq]=& $res[$ireq]->fetchRow(DB_FETCHMODE_ASSOC); 
        $traitement[$ireq]=!is_null($row[$ireq]);    
      }
      $nouveauchapprim=false;
      $nouveauchapsec=false;
      $nextireq=-1; 
      //si sous-chapitres configurés, tester chgment de sous-chap 
      //et fixer nouveaux chap et requete
      if ($nbindent>0) { 
        if ($nbindent>1) {  //2 niveaux
          //$changementchap vrai si 1er chap "aa"<>"" ou nv chap "bb"<>"aa"
          //jamais vrai si row est null
          //donc si vrai, nextireq sera >=0
          $changementchap=($this->ElimineAccent($row[$ireq]['sel1'])!=$champindent[0] || $this->ElimineAccent($row[$ireq]['sel2'])!=$champindent[1]);
          if (!$traitement[$ireq] || $changementchap) { //requete finie ou nouveau chapitre 
            if (!$nouveautableau) $fintableau=true;
          //rechercher si autres requetes n'en sont pas à un chapitre à     
          //classer avant le nouveau de la requete courante
            $nextchampindent[0]="";
            $nextchampindent[1]="";
            //$nextireq=-1;
            for ($i=count($sousetat['sql'])-1;$i>=0;$i--) {
              if ($sousetat['sql'][$i] && !is_null($row[$i])) { //si requete existante et non finie
                $rowsel1=$this->ElimineAccent($row[$i]['sel1']);
                if ($nextchampindent[0]) {
                  if (strcasecmp($rowsel1,$nextchampindent[0])<0) {
                    $nextchampindent[0]=$rowsel1;
                    $nextchampindent[1]=$this->ElimineAccent($row[$i]['sel2']); //
                    $nextireq=$i;
                  } else if ($rowsel1==$nextchampindent[0]) {
                    $rowsel2=$this->ElimineAccent($row[$i]['sel2']);
                    if (strcasecmp($rowsel2,$nextchampindent[1])<=0) {
                      $nextchampindent[0]=$rowsel1;
                      $nextchampindent[1]=$rowsel2; //
                      $nextireq=$i;
                    }
                  }
                } else {
                  $nextchampindent[0]=$rowsel1;
                  $nextchampindent[1]=$this->ElimineAccent($row[$i]['sel2']);
                  $nextireq=$i;
                }
              }
            }  //fin for
            if ($nextireq>=0) { //si non fin sousetat
              if (strcasecmp($nextchampindent[0],$champindent[0])>0) { //nouveau chapitre 
              //nouveau chap pour requete $nextireq
                $nouveauchapprim=true;
                $nouveauchapsec=true;
                $nbchap[0]++;
                $nbchap[1]=1;
                $champindent[0]=$this->ElimineAccent($row[$nextireq]['sel1']);  //ou $nextchampindent[0]
                $champindent[1]=$this->ElimineAccent($row[$nextireq]['sel2']);  //ou $nextchampindent[1]
              } else { //meme chapitre prim
                if (strcasecmp($nextchampindent[1],$champindent[1])>0) { 
                //nouveau souschap pour requete $nextireq
                  $nouveauchapsec=true;
                  $nbchap[1]++;
                  $champindent[1]=$this->ElimineAccent($row[$nextireq]['sel2']);
                  //ou $nextchampindent[1] 
                }
              }
            }
          } //fin requete finie ou nouveau chapitre
        } else { //1 niveau 
          $changementchap=($this->ElimineAccent($row[$ireq]['sel1'])!=$champindent[0]);
          if (!$traitement[$ireq] || $changementchap) { //requete finie ou nouveau chapitre
            if (!$nouveautableau) $fintableau=true;
            //rechercher si autres requetes n'en sont pas à un chapitre à     
            //classer avant le nouveau de la requete courante
            $nextchampindent[0]="";
            //$nextireq=-1;
            for ($i=count($sousetat['sql'])-1;$i>=0;$i--) {
              if ($sousetat['sql'][$i] && !is_null($row[$i])) {  //si requete existante et non finie
                $rowsel1=$this->ElimineAccent($row[$i]['sel1']);
                if ($nextchampindent[0]) {
                  if (strcasecmp($rowsel1,$nextchampindent[0])<=0) {
                    $nextchampindent[0]=$rowsel1;
                    $nextireq=$i;
                  }
                } else {
                  $nextchampindent[0]=$rowsel1;
                  $nextireq=$i;
                }
              }
            }  //fin for
            if ($nextireq>=0) { //si non fin sousetat
              if (strcasecmp($nextchampindent[0],$champindent[0])>0) { 
              //nouveau chap pour requete $nextireq
                $nouveauchapprim=true;
                $nbchap[0]++;
                $champindent[0]=$this->ElimineAccent($row[$nextireq]['sel1']);
                // ou $nextchampindent[0]
              }
            } 
          } //fin requete finie ou nouveau chapitre
        } // fin 1 niveau 
      } else {  //pas de niveau de chapitre
        if (!$traitement[$ireq]) { //requete finie 
          if (!$nouveautableau) $fintableau=true;
          $i=$ireq+1;
          while ($nextireq<0 && $i<count($sousetat['sql'])) { 
//echo $sousetat['sql'][$i]."---".$i;
            if ($sousetat['sql'][$i] && !is_null($row[$i]))   //si  requete suivante existe
              $nextireq=$i;
            $i++;
          }
//echo "nextireq".$nextireq;
        } //fin requete finie 
      }
      //si fin de tableau à afficher 
      if ($fintableau /*|| !$traitement[$ireq]*/) {
        // apres derniere ligne
        if ($sousetat['tableau_bordure'][$ireq]=="1"){
           $this->Cell($sousetat['tableau_largeur'][$ireq],0,'',"T",1,'L',0);
        }
        //affichage total----------------------------------------------------
        if ($flagtotal==1){
          for($k=0;$k<$nbchamp[$ireq];$k++){  
            if ($sousetat['cellule_total'][$ireq][$k]==1 && 
            $sousetat['cellule_largeur'][$ireq][$k]){  //afficher total si largeur>0 
              $this->SetFont($etat['se_font'],'',$sousetat['cellule_fontaille_total'][$ireq]);
              $this->SetFillColor($sousetat['cellule_fondcouleur_total'][$ireq][0],$sousetat['cellule_fondcouleur_total'][$ireq][1],$sousetat['cellule_fondcouleur_total'][$ireq][2]);
              $this->Cell($sousetat['cellule_largeur'][$ireq][$k],$sousetat['cellule_hauteur_total'][$ireq],number_format($total[$k], $sousetat['cellule_numerique'][$ireq][$k], ',', ' '),$sousetat['cellule_bordure_total'][$ireq][$k],0,$sousetat['cellule_align_total'][$ireq][$k],$sousetat['cellule_fond_total'][$ireq]);
            } else { // affichage sur la colone correspondante
              if ($k==$colini[$ireq]){    //1ere col visible
                $this->SetFont($etat['se_font'],'',$sousetat['cellule_fontaille_total'][$ireq]);
                $this->SetFillColor($sousetat['cellule_fondcouleur_total'][$ireq][0],$sousetat['cellule_fondcouleur_total'][$ireq][1],$sousetat['cellule_fondcouleur_total'][$ireq][2]);
                $this->Cell($sousetat['cellule_largeur'][$ireq][$k],$sousetat['cellule_hauteur_total'][$ireq],'TOTAL',$sousetat['cellule_bordure_total'][$ireq][$k],0,$sousetat['cellule_align_total'][$ireq][$k],$sousetat['cellule_fond_total'][$ireq]);
              } else if ($sousetat['cellule_largeur'][$ireq][$k]){ //afficher si largeur>0  
                // colones suivante
                $this->SetFont($etat['se_font'],'',$sousetat['cellule_fontaille_total'][$ireq]);
                $this->SetFillColor($sousetat['cellule_fondcouleur_total'][$ireq][0],$sousetat['cellule_fondcouleur_total'][$ireq][1],$sousetat['cellule_fondcouleur_total'][$ireq][2]);
                $this->Cell($sousetat['cellule_largeur'][$ireq][$k],$sousetat['cellule_hauteur_total'][$ireq],'',$sousetat['cellule_bordure_total'][$ireq][$k],0,$sousetat['cellule_align_total'][$ireq][$k],$sousetat['cellule_fond_total'][$ireq]);
              }
            }
          }//fin for k
          $this->ln();
        }
        //affichage moyenne----------------------------------------------------
        if ($flagmoyenne==1){
          for($k=0;$k<$nbchamp[$ireq];$k++){  
            if ($sousetat['cellule_moyenne'][$ireq][$k]==1 &&
            $sousetat['cellule_largeur'][$ireq][$k]){  //afficher si largeur>0 
              $this->SetFont($etat['se_font'],'',$sousetat['cellule_fontaille_moyenne'][$ireq]);
              $this->SetFillColor($sousetat['cellule_fondcouleur_moyenne'][$ireq][0],$sousetat['cellule_fondcouleur_moyenne'][$ireq][1],$sousetat['cellule_fondcouleur_moyenne'][$ireq][2]);
              $this->Cell($sousetat['cellule_largeur'][$ireq][$k],$sousetat['cellule_hauteur_moyenne'][$ireq],number_format($total[$k]/$cptenr, $sousetat['cellule_numerique'][$ireq][$k], ',', ' '),$sousetat['cellule_bordure_moyenne'][$ireq][$k],0,$sousetat['cellule_align_moyenne'][$ireq][$k],$sousetat['cellule_fond_moyenne']);
            } else {// affichage sur la colone correspondante
              if ($k==$colini[$ireq]){  //1ere col visible 
                $this->SetFont($etat['se_font'],'',$sousetat['cellule_fontaille_moyenne'][$ireq]);
                $this->SetFillColor($sousetat['cellule_fondcouleur_moyenne'][$ireq][0],$sousetat['cellule_fondcouleur_moyenne'][$ireq][1],$sousetat['cellule_fondcouleur_moyenne'][$ireq][2]);
                $this->Cell($sousetat['cellule_largeur'][$ireq][$k],$sousetat['cellule_hauteur_moyenne'][$ireq],'MOYENNE',$sousetat['cellule_bordure_moyenne'][$ireq][$k],0,$sousetat['cellule_align_moyenne'][$ireq][$k],$sousetat['cellule_fond_moyenne'][$ireq]);
              } else if ($sousetat['cellule_largeur'][$ireq][$k]){ //afficher si largeur>0
                // colones suivante
                $this->SetFont($etat['se_font'],'',$sousetat['cellule_fontaille_moyenne'][$ireq]);
                $this->SetFillColor($sousetat['cellule_fondcouleur_moyenne'][$ireq][0],$sousetat['cellule_fondcouleur_moyenne'][$ireq][1],$sousetat['cellule_fondcouleur_moyenne'][$ireq][2]);
                $this->Cell($sousetat['cellule_largeur'][$ireq][$k],$sousetat['cellule_hauteur_moyenne'][$ireq],'',$sousetat['cellule_bordure_moyenne'][$ireq][$k],0,$sousetat['cellule_align_moyenne'][$ireq][$k],$sousetat['cellule_fond_moyenne'][$ireq]);
              }
            }
          }//fin for k
          $this->ln();
        }
        //affichage compteur----------------------------------------------------
        if ($flagcompteur==1){
          for($k=0;$k<$nbchamp[$ireq];$k++){ 
            if ($sousetat['cellule_compteur'][$ireq][$k]==1 &&
            $sousetat['cellule_largeur'][$ireq][$k]){  //afficher si largeur 
              $this->SetFont($etat['se_font'],'',$sousetat['cellule_fontaille_nbr'][$ireq]);
              $this->SetFillColor($sousetat['cellule_fondcouleur_nbr'][$ireq][0],$sousetat['cellule_fondcouleur_nbr'][$ireq][1],$sousetat['cellule_fondcouleur_nbr'][$ireq][2]);
              $this->Cell($sousetat['cellule_largeur'][$ireq][$k],$sousetat['cellule_hauteur_nbr'][$ireq],number_format($cptenr, 0, ',', ' '),$sousetat['cellule_bordure_nbr'][$ireq][$k],0,$sousetat['cellule_align_nbr'][$ireq][$k],$sousetat['cellule_fond_nbr'][$ireq]);
            } else {// affichage sur la colone correspondante
              if ($k==$colini[$ireq]){  //1ere col visible 
                $this->SetFont($etat['se_font'],'',$sousetat['cellule_fontaille_nbr'][$ireq]);
                $this->SetFillColor($sousetat['cellule_fondcouleur_nbr'][$ireq][0],$sousetat['cellule_fondcouleur_nbr'][$ireq][1],$sousetat['cellule_fondcouleur_nbr'][$ireq][2]);
                $this->Cell($sousetat['cellule_largeur'][$ireq][$k],$sousetat['cellule_hauteur_nbr'][$ireq],'NOMBRE',$sousetat['cellule_bordure_nbr'][$ireq][$k],0,$sousetat['cellule_align_nbr'][$ireq][$k],$sousetat['cellule_fond_nbr'][$ireq]);
              } else if ($sousetat['cellule_largeur'][$ireq][$k]){ //afficher si largeur>0
                // colones suivante
                $this->SetFont($etat['se_font'],'',$sousetat['cellule_fontaille_nbr'][$ireq]);
                $this->SetFillColor($sousetat['cellule_fondcouleur_nbr'][$ireq][0],$sousetat['cellule_fondcouleur_nbr'][$ireq][1],$sousetat['cellule_fondcouleur_nbr'][$ireq][2]);
                $this->Cell($sousetat['cellule_largeur'][$ireq][$k],$sousetat['cellule_hauteur_nbr'][$ireq],'',$sousetat['cellule_bordure_nbr'][$ireq][$k],0,$sousetat['cellule_align_nbr'][$ireq][$k],$sousetat['cellule_fond_nbr'][$ireq]);
              }
            }
          }//fin for k
            $this->ln();
        }
        if ($cptenr>0)
          $this->ln($sousetat['intervalle_fin'][$ireq]);
        $fintableau=false;
        $nouveautableau=true;
      } //fin de fin de tableau à afficher
      //passage à requete suivante si existe  ex: station->imprimante
      //$row[req.actuelle] conservé, $row[req.suiv.] deja preetabli
      //avec en consequence son $traitement[req.suiv.]
      if ($nextireq>=0) $ireq=$nextireq;
      if ($traitement[$ireq]) { //si pas fin de requete
        if ($nouveautableau) { //si demarrage nouveau tableau 
          //intervalle
          $this->ln($sousetat['intervalle_debut'][$ireq]);
          // initialisation
          $couleur=1;
          for($j=0;$j<$nbchamp[$ireq];$j++)  
            $total[$j]=0;
          $cptenr=0;
          $flagtotal=0;
          $flagmoyenne=0;
          $flagcompteur=0;
          //souschapitre
          if ($nouveauchapprim) { 
            //intervalle
    //        $this->ln($sousetat['intervalle_debut']);
            //titre
            $this->SetFillColor($etat['chap1']['titrefondcouleur'][0],
            $etat['chap1']['titrefondcouleur'][1],
            $etat['chap1']['titrefondcouleur'][2]);
            $this->SetTextColor($etat['chap1']['titretextecouleur'][0],
            $etat['chap1']['titretextecouleur'][1],
            $etat['chap1']['titretextecouleur'][2]);
            $this->SetFont($etat['chap1']["titrefont"],
            $etat['chap1']["titreattribut"],
            $etat['chap1']["titretaille"]);
            $this->MultiCell($sousetat['tableau_largeur'][$ireq],
            $etat['chap1']["titrehauteur"],
            strval($nbchap[0])."-".$champindent[0],
            $etat['chap1']["titrebordure"],
            $etat['chap1']["titrealign"],$etat['chap1']["titrefond"]);
          }
          if ($nouveauchapsec) {
            //intervalle
    //        $this->ln($sousetat['intervalle_debut']);
            //titre
            $this->SetFillColor($etat['chap2']['titrefondcouleur'][0],
            $etat['chap2']['titrefondcouleur'][1],
            $etat['chap2']['titrefondcouleur'][2]);
            $this->SetTextColor($etat['chap2']['titretextecouleur'][0],
            $etat['chap2']['titretextecouleur'][1],
            $etat['chap2']['titretextecouleur'][2]);
            $this->SetFont($etat['chap2']["titrefont"],
            $etat['chap2']["titreattribut"],
            $etat['chap2']["titretaille"]);
            $this->MultiCell($sousetat['tableau_largeur'][$ireq],
            $etat['chap2']["titrehauteur"],
            "       ".strval($nbchap[0])."-".strval($nbchap[1])."-".
            $champindent[1],
            $etat['chap2']["titrebordure"],
            $etat['chap2']["titrealign"],$etat['chap2']["titrefond"]);
          }
          //titre
          $this->SetFillColor($sousetat['titrefondcouleur'][$ireq][0],$sousetat['titrefondcouleur'][$ireq][1],$sousetat['titrefondcouleur'][$ireq][2]);
          $this->SetTextColor($sousetat['titretextecouleur'][$ireq][0],$sousetat['titretextecouleur'][$ireq][1],$sousetat['titretextecouleur'][$ireq][2]);
          $this->SetFont($sousetat["titrefont"][$ireq],$sousetat["titreattribut"][$ireq],$sousetat["titretaille"][$ireq]);
          $this->MultiCell($sousetat['tableau_largeur'][$ireq],$sousetat["titrehauteur"][$ireq],$sousetat["titre"][$ireq],$sousetat["titrebordure"][$ireq],$sousetat["titrealign"][$ireq],$sousetat["titrefond"][$ireq]);
          //police
          $this->SetFont($etat['se_font'],'',$sousetat['tableau_fontaille'][$ireq]);
          //couleur texte
          $this->SetTextColor($etat['se_couleurtexte'][0],$etat['se_couleurtexte'][1],$etat['se_couleurtexte'][2]);
          //Entete tableau
          if ($sousetat['entete_flag'][$ireq]==1){
            $this->SetFillColor($sousetat['entete_fondcouleur'][$ireq][0],$sousetat['entete_fondcouleur'][$ireq][1],$sousetat['entete_fondcouleur'][$ireq][2]);
            $this->SetTextColor($sousetat['entete_textecouleur'][$ireq][0],$sousetat['entete_textecouleur'][$ireq][1],$sousetat['entete_textecouleur'][$ireq][2]);
            for($k=0;$k<$nbchamp[$ireq];$k++){  
              if ($sousetat['cellule_largeur'][$ireq][$k]) //afficher si largeur>0
                $this->Cell($sousetat['cellule_largeur'][$ireq][$k],$sousetat['entete_hauteur'][$ireq],strtoupper($info[$ireq][$k]['name']),$sousetat['entetecolone_bordure'][$ireq][$k],0,$sousetat['entetecolone_align'][$ireq][$k],$sousetat['entete_fond'][$ireq]);
            }
            $this->ln();
          }  //fin entete tableau
          $nouveautableau=false;
        } //fin demarrage nouveau tableau
        //affichage ligne enregistremant tableau
        //choix couleur ligne alternative tableau
        if ($couleur==1){
          $this->SetFillColor($sousetat['se_fond1'][$ireq][0],$sousetat['se_fond1'][$ireq][1],$sousetat['se_fond1'][$ireq][2]);
          $couleur=0;
        } else {
          $this->SetFillColor($sousetat['se_fond2'][$ireq][0],$sousetat['se_fond2'][$ireq][1],$sousetat['se_fond2'][$ireq][2]);
          $couleur=1;
        }
        //preparer multiligne
        $max_ln=1;   //ajout parc
        $multi_height=$sousetat['cellule_hauteur'][$ireq];
        //Etablir nb ligne necessaire et preparer chaines avec \n
        for($j=0;$j<$nbchamp[$ireq];$j++){   
          if ($sousetat['cellule_multiligne'][$ireq][$j]==1) {
            //
            $row[$ireq][$info[$ireq][$j]['name']]=$this->TraiterSubsql($row[$ireq][$info[$ireq][$j]['name']],$db,$ireq,$sousetat['subsql'],$row[$ireq]['id']);
            //
            $t_ln=$this->PrepareMultiCell($sousetat['cellule_largeur'][$ireq][$j],$row[$ireq][$info[$ireq][$j]['name']]);
            if ($t_ln>$max_ln) $max_ln=$t_ln;
          }
        }
        //fixation de la nouvelle hauteur à selon quota hauteur/nblignesmulti
        if ($max_ln>1) $multi_height=$max_ln*$sousetat['cellule_hauteur'][$ireq]*$sousetat['cellule_hautmulti'][$ireq];  
        for($j=0;$j<$nbchamp[$ireq];$j++){   
          if ($sousetat['cellule_largeur'][$ireq][$j]) { //afficher si largeur>0
            if (isset($sousetat['cellule_numerique'][$ireq][$j]) AND TRIM($sousetat['cellule_numerique'][$ireq][$j])!=""){
              //champs non numerique = 999 , numerique
              if ($sousetat['cellule_numerique'][$ireq][$j]==999){ // non numerique
                if ($cptenr==0){
                  $this->Cell($sousetat['cellule_largeur'][$ireq][$j],$multi_height,$row[$ireq][$info[$ireq][$j]['name']],$sousetat['cellule_bordure_un'][$ireq][$j],0,$sousetat['cellule_align'][$ireq][$j],$sousetat['cellule_fond'][$ireq]);
                  //$this->Cell($sousetat['cellule_largeur'][$ireq][$j],$multi_height,$this->TraiterSubsql($row[$ireq][$info[$ireq][$j]['name']],$db,$ireq,$sousetat['subsql'],$row[$ireq]['id']),$sousetat['cellule_bordure_un'][$ireq][$j],0,$sousetat['cellule_align'][$ireq][$j],$sousetat['cellule_fond'][$ireq]);
                } else {
                  $this->Cell($sousetat['cellule_largeur'][$ireq][$j],$multi_height,$row[$ireq][$info[$ireq][$j]['name']],$sousetat['cellule_bordure_un'][$ireq][$j],0,$sousetat['cellule_align'][$ireq][$j],$sousetat['cellule_fond'][$ireq]);
                  //$this->Cell($sousetat['cellule_largeur'][$ireq][$j],$multi_height,$this->TraiterSubsql($row[$ireq][$info[$ireq][$j]['name']],$db,$ireq,$sousetat['subsql'],$row[$ireq]['id']),$sousetat['cellule_bordure'][$ireq][$j],0,$sousetat['cellule_align'][$ireq][$j],$sousetat['cellule_fond'][$ireq]);
                }
              } else { // numerique
                if ($cptenr==0){
                  $this->Cell($sousetat['cellule_largeur'][$ireq][$j],$multi_height,$row[$ireq][$info[$ireq][$j]['name']],$sousetat['cellule_bordure_un'][$ireq][$j],0,$sousetat['cellule_align'][$ireq][$j],$sousetat['cellule_fond'][$ireq]);
                } else {
                  $this->Cell($sousetat['cellule_largeur'][$ireq][$j],$multi_height,$row[$ireq][$info[$ireq][$j]['name']],$sousetat['cellule_bordure'][$ireq][$j],0,$sousetat['cellule_align'][$ireq][$j],$sousetat['cellule_fond'][$ireq]);
                }
                // si total = calcul variable total
                if ($sousetat['cellule_total'][$ireq][$j]==1){
                  $total[$j] = $total[$j]+$row[$ireq][$info[$ireq][$j]['name']];
                  $flagtotal=1;
                }
                if ($sousetat['cellule_moyenne'][$ireq][$j]==1){
                  if ($flagtotal==0)
                    $total[$j] = $total[$j]+$row[$ireq][$info[$ireq][$j]['name']];
                  $flagmoyenne=1;
                }
              }
            }
            if ($sousetat['cellule_compteur'][$ireq][$j]==1){
              $flagcompteur=1;
            }
          } //fin afficher si largeur
        }// fin for
        $cptenr=$cptenr+1;
        $this->ln();
      } //fin traitement en cours
    }//fin while
  } //fin au moins 1 requete valide
}// fin fonction sous etat

function PrepareMultiCell($w,&$txt)
{   //prepare un texte passé par référence (en le modifiant) avec ajout \n pour traitement par Cell modifié  
    //et retourne nb ligne necessaire
    //basé sur code MultiCell mais pas d'affichage
    $cw=&$this->CurrentFont['cw']; //largeur caractere
    if($w==0) //si largeur=0, largeur=largeurcourante-margegauche-positionx
        $w=$this->w-$this->rMargin-$this->x;
    $wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
    $s=str_replace("\r",'',$txt);
    $nb=strlen($s); //longueur texte sans retour chariot
    if($nb>0 && $s[$nb-1]=="\n")
        $nb--;      //supp. dernier retour ligne si existe
    $sep=-1;    //espace
    $i=0;       //index boucle
    $j=0;
    $l=0;
    $ns=0;
    $nl=1;
  $nbrc=0; //nb retourcharriot
    while($i<$nb) {  //boucle sur texte
        //Get next character
        $c=$s{$i};  //caractere courant
        if($c=="\n") {  //retour ligne
            //Explicit line break
            $i++;     //
            $sep=-1;   //raz espace
            $j=$i;     //debut de ligne
            $l=0;
            $ns=0;
            $nl++;   //nb ligne +1
            continue; // prochain caractere
        }
        if($c==' ') {  //si espace
            $sep=$i; //position espace
            $ls=$l;
            $ns++;
        }
        $l+=$cw[$c];
        if($l>$wmax) { //si ligne depasse largeur
            //Automatic line break
            if($sep==-1) { //si aucun espace detecte
                if($i==$j)
                    $i++;
            } else { //espace detecte
                $i=$sep+1;   //prochain car = car suivant dernier espace
            }  //insertion retour charriot dans texte
      $txt=substr($txt,0,$i+$nbrc)."\n".substr($txt,$i+$nbrc);
      $nbrc++;
            $sep=-1;
            $j=$i;
            $l=0;
            $ns=0;
            $nl++;   //nb ligne +1 
        } else //ligne < largeur colonne
            $i++;
    }  //fin de texte
  return $nl;
}

function Cell($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=0, $link='')  
//surcharge pour retour ligne sur detection \n sinon compression
//changement
//border: indicates if borders must be drawn around the cell. The value can be either a number:
//0: no border 
//>0: frame of the corresponding width 
//or a string containing some or all of the following characters (in any order): 
//L: left 
//T: top 
//R: right 
//B: bottom 
//or for bold border: 
//l: left 
//t: top 
//r: right 
//b: bottom 
//Default value: 0.
{
    //Output a cell
    $k=$this->k;
    if($this->y+$h>$this->PageBreakTrigger and !$this->InFooter and $this->AcceptPageBreak())
    {
        $x=$this->x;
        $ws=$this->ws;
        if($ws>0)
        {
            $this->ws=0;
            $this->_out('0 Tw');
        }
        $this->AddPage($this->CurOrientation);
        $this->x=$x;
        if($ws>0)
        {
            $this->ws=$ws;
            $this->_out(sprintf('%.3f Tw', $ws*$k));
        }
    }
    if($w==0)
        $w=$this->w-$this->rMargin-$this->x;
    $s='';
// begin change Cell function 12.08.2003 
    if($fill==1 or $border>0)
    {
        if($fill==1)
            $op=($border>0) ? 'B' : 'f';
        else
            $op='S';
        if ($border>1) {
            $s=sprintf(' q %.2f w %.2f %.2f %.2f %.2f re %s Q ', $border, 
                $this->x*$k, ($this->h-$this->y)*$k, $w*$k, -$h*$k, $op);
        }
        else
            $s=sprintf('%.2f %.2f %.2f %.2f re %s ', $this->x*$k, ($this->h-$this->y)*$k, $w*$k, -$h*$k, $op);
    }
    if(is_string($border))
    {
        $x=$this->x;
        $y=$this->y;
        if(is_int(strpos($border, 'L')))
            $s.=sprintf('%.2f %.2f m %.2f %.2f l S ', $x*$k, ($this->h-$y)*$k, $x*$k, ($this->h-($y+$h))*$k);
        else if(is_int(strpos($border, 'l')))
            $s.=sprintf('q 2 w %.2f %.2f m %.2f %.2f l S Q ', $x*$k, ($this->h-$y)*$k, $x*$k, ($this->h-($y+$h))*$k);
            
        if(is_int(strpos($border, 'T')))
            $s.=sprintf('%.2f %.2f m %.2f %.2f l S ', $x*$k, ($this->h-$y)*$k, ($x+$w)*$k, ($this->h-$y)*$k);
        else if(is_int(strpos($border, 't')))
            $s.=sprintf('q 2 w %.2f %.2f m %.2f %.2f l S Q ', $x*$k, ($this->h-$y)*$k, ($x+$w)*$k, ($this->h-$y)*$k);
        
        if(is_int(strpos($border, 'R')))
            $s.=sprintf('%.2f %.2f m %.2f %.2f l S ', ($x+$w)*$k, ($this->h-$y)*$k, ($x+$w)*$k, ($this->h-($y+$h))*$k);
        else if(is_int(strpos($border, 'r')))
            $s.=sprintf('q 2 w %.2f %.2f m %.2f %.2f l S Q ', ($x+$w)*$k, ($this->h-$y)*$k, ($x+$w)*$k, ($this->h-($y+$h))*$k);
        
        if(is_int(strpos($border, 'B')))
            $s.=sprintf('%.2f %.2f m %.2f %.2f l S ', $x*$k, ($this->h-($y+$h))*$k, ($x+$w)*$k, ($this->h-($y+$h))*$k);
        else if(is_int(strpos($border, 'b')))
            $s.=sprintf('q 2 w %.2f %.2f m %.2f %.2f l S Q ', $x*$k, ($this->h-($y+$h))*$k, ($x+$w)*$k, ($this->h-($y+$h))*$k);
    }
    if (trim($txt)!='') {
        $cr=substr_count($txt, "\n");
        if ($cr>0) { // Multi line
            $txts = explode("\n", $txt);
            $lines = count($txts);
            //$dy=($h-2*$this->cMargin)/$lines;
            for($l=0;$l<$lines;$l++) {
                $txt=$txts[$l];
                $w_txt=$this->GetStringWidth($txt);
                if($align=='R')
                    $dx=$w-$w_txt-$this->cMargin;
                elseif($align=='C')
                    $dx=($w-$w_txt)/2;
                else
                    $dx=$this->cMargin;

                $txt=str_replace(')', '\\)', str_replace('(', '\\(', str_replace('\\', '\\\\', $txt)));
                if($this->ColorFlag)
                    $s.='q '.$this->TextColor.' ';
                $s.=sprintf('BT %.2f %.2f Td (%s) Tj ET ', 
                    ($this->x+$dx)*$k, 
                    ($this->h-($this->y+.5*$h+(.7+$l-$lines/2)*$this->FontSize))*$k, 
                    $txt);
                if($this->underline)
                    $s.=' '.$this->_dounderline($this->x+$dx, $this->y+.5*$h+.3*$this->FontSize, $txt);
                if($this->ColorFlag)
                    $s.='Q ';
                if($link)
                    $this->Link($this->x+$dx, $this->y+.5*$h-.5*$this->FontSize, $w_txt, $this->FontSize, $link);
            }
        }
        else { // Single line
            $w_txt=$this->GetStringWidth($txt);
            $Tz=100;
            if ($w_txt>$w-2*$this->cMargin) { // Need compression
                $Tz=($w-2*$this->cMargin)/$w_txt*100;
                $w_txt=$w-2*$this->cMargin;
            }
            if($align=='R')
                $dx=$w-$w_txt-$this->cMargin;
            elseif($align=='C')
                $dx=($w-$w_txt)/2;
            else
                $dx=$this->cMargin;
            $txt=str_replace(')', '\\)', str_replace('(', '\\(', str_replace('\\', '\\\\', $txt)));
            if($this->ColorFlag)
                $s.='q '.$this->TextColor.' ';
            $s.=sprintf('q BT %.2f %.2f Td %.2f Tz (%s) Tj ET Q ', 
                        ($this->x+$dx)*$k, 
                        ($this->h-($this->y+.5*$h+.3*$this->FontSize))*$k, 
                        $Tz, $txt);
            if($this->underline)
                $s.=' '.$this->_dounderline($this->x+$dx, $this->y+.5*$h+.3*$this->FontSize, $txt);
            if($this->ColorFlag)
                $s.='Q ';
            if($link)
                $this->Link($this->x+$dx, $this->y+.5*$h-.5*$this->FontSize, $w_txt, $this->FontSize, $link);
        }
    }
// end change Cell function 12.08.2003
    if($s)
        $this->_out($s);
    $this->lasth=$h;
    if($ln>0)
    {
        //Go to next line
        $this->y+=$h;
        if($ln==1)
            $this->x=$this->lMargin;
    }
    else
        $this->x+=$w;
}

// =====================================================================
// Traitement d erreur
// transfert à l ecran des erreurs de bases de donnees
// $debuginfo : info table de données
// $messageDB : message d erreur DB pear
// $table = table concernée
// =====================================================================
function erreur_db($debuginfo,$messageDB,$table)
{
  include ("error_db.inc");
        $this->SetFont('arial','','9');
        $this->ln();
        $this->Cell(0,10,'Attention, Erreur de base de données',0,1,'L');
        $this->Cell(0,10,$requete,0,1,'L');
        $this->Cell(0,10,$erreur_origine,0,1,'L');
        $this->Cell(0,10,$messageDB,0,1,'L');
        $this->Cell(0,10,$msgfr,0,1,'L');
        $this->Cell(0,10,'Contactez votre administrateur',0,1,'L');
}

} //fin class pdf
?>