<?php
/*
 * Recoit un tableau data dont les index sont des années précédées d'un
 * x minuscule (eg. "x2007") et dont les valeurs sont des entiers positifs
 * (des comptages). Le script revoie un SVG dont la largeur fait 100% et
 * qui s'adapte en hauteur.
 * Parametres : 
 *		ENV{data} : le tableau
 *		ENV{titre} : le titre du graphique
 *		ENV{couleur} : la couleur de remplissage des barres
 */
    $i=0; $data = array(
     <BOUCLE_db(POUR) {tableau #ENV{data}} {","}> 
       "#CLE" => #VALEUR
     </BOUCLE_db>
     );
     
    if(count($data) == 0) {
        echo "<svg:svg xmlns:svg='http://www.w3.org/2000/svg' width='100%' height='auto' viewBox='-10 0 140 20'>\n"; 
        echo " <svg:text x='24' y='48' transform='scale(0.25 0.25)' fill='black'>[(#ENV{titre}) - ]Aucune donnée.</svg:text>\n";
        echo "</svg:svg>\n";
    } else {
    
    $amin = $amax = $vmin = $vmax = $count =0;
    
    // Mise à jour des min/max
    foreach($data as $key => $value) {
      // Extraction de l'année
      preg_match('/x(\d{4})/',$key,$matches);
      $annee = $matches[1]; 
      $count += $value;
      if($i==0) {
      	$amin = $annee; $amax = $annee;
      	$vmin = $value; $vmax=$value;
      	$i=1;
      } else {
      	$amin = ($annee < $amin)?$annee:$amin;
      	$amax = ($annee > $amax)?$annee:$amax;
      	$vmin = ($value < $vmin)?$value:$vmin;
      	$vmax = ($value > $vmax)?$value:$vmax;
      }
    }
     
    if($amin != $amax) {
    	// Dimensionnement des axes
    	$da = $amax - $amin +1;
     
    	$dv = $vmax - $vmin;
    	if($dv > 0) {
    		$vb = floor(log10($dv));
    		$ygrad = pow(10,$vb);
    	} else {
    		$ygrad = 1;
    		$dv=1;
    	}

    	$yvmin = floor($vmin /$ygrad) * $ygrad;
    	$cy = 0;
    	if(($yvmin == $vmin) && ($vmin !=0)) {
    	  $yvmin = $yvmin - $ygrad;
    	  $cy = 1;
    	  }
    	$dyv = ceil($dv /$ygrad)+1+$cy;
    	$yvmax = $yvmin + $dyv*$ygrad;
      
    	$dx = $da*10; $x2=$dx+5;
    	$height = $dyv*10;
    	$xview = $dx + 20; 
    	$xview = ($xview < 140)?140:$xview;
    	$yview = $height + 20;

    	echo "<svg:svg xmlns:svg='http://www.w3.org/2000/svg' width='100%' height='auto' viewBox='-10 0 $xview $yview'>\n";
    	echo " <svg:g style='stroke:black; stroke-width:0.5;'>\n";
    	echo "   <svg:line x1='5' y1='$height' x2='5' y2='0' />\n";
    	echo "   <svg:line x1='5' y1='$height' x2='$x2' y2='$height' />\n";
    	echo " </svg:g>\n";
    	echo " <svg:g transform='scale(1 -1) translate(5 -$height)' style='stroke:black; fill:white; stroke-width:0.5;'>\n";

     
    	// Tracé des données
    	foreach($data as $key => $value) {
         	preg_match('/x(\d{4})/',$key,$matches);
         	$annee = $matches[1];
         	$px = ($annee - $amin)* 10;
         	$h = 10*($value - $yvmin)/$ygrad;
         	echo "   <svg:rect x='$px' y='0' width='10' height='$h' fill='#ENV{couleur,green}'/>\n";
         	}
         
         // Affichage des graduations en ordonnées
         for($i=0; $i <$dyv ;$i++) {
         	$py = $i*30; $yval = $yvmin+ $i*$ygrad; $gy = $i*10;
         	echo "   <svg:line x1='0' y1='$gy' x2='-1' y2='$gy' />\n";
         	echo "   <svg:text x='-36' y='-$py' transform='scale(0.33 -0.33)' fill='black'>$yval</svg:text>\n";
         	}

         // Affichage des années en abscisse     
         for($j=0; $j<$da; $j++) {
        	 $tx = $j*40 + 4;
        	 $annee = $amin + $j;
        	 echo "<svg:text x='$tx' y='20' transform='scale(0.25 -0.25)' fill='black'>". $annee ."</svg:text>\n";
        	 }

        	 echo " </svg:g>\n";
        	 $yt = ($height + 12)*4;
        	 echo " <svg:text x='24' y='$yt' transform='scale(0.25 0.25)' fill='black'>[(#ENV{titre}) - ]Total $count</svg:text>\n";
        	 echo "</svg:svg>\n"; 
       } else {
       		echo "<svg:svg xmlns:svg='http://www.w3.org/2000/svg' width='100%' height='auto' viewBox='-10 0 140 20'>\n"; 
       		echo " <svg:text x='24' y='48' transform='scale(0.25 0.25)' fill='black'>[(#ENV{titre}) - ]Total en $amin: $count</svg:text>\n";
       		echo "</svg:svg>\n";
       }
    }
?>