diff --git a/htdocs/core/class/dolgraph.class.php b/htdocs/core/class/dolgraph.class.php
index eaf35954bfb33b11668eccaddf8394edc1bb5873..c14cbeec7901c8b722edbd049a025e782dcf5168 100644
--- a/htdocs/core/class/dolgraph.class.php
+++ b/htdocs/core/class/dolgraph.class.php
@@ -1,20 +1,20 @@
 <?php
 /* Copyright (c) 2003-2006 Rodolphe Quiedeville <rodolphe@quiedeville.org>
  * Copyright (c) 2004-2011 Laurent Destailleur  <eldy@users.sourceforge.net>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
+*
+* This program is free software; you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation; either version 2 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
 
 /**
  *	\file       htdocs/core/class/dolgraph.class.php
@@ -42,645 +42,695 @@
  */
 class DolGraph
 {
-	//! Type du graphique
-	var $type='bars';		// bars, lines, ...
-	var $mode='side';		// Mode bars graph: side, depth
-
-	//! Tableau de donnees
-	var $data;				// array(array('abs1',valA1,valB1), array('abs2',valA2,valB2), ...)
-	var $title;
-	var $width=380;
-	var $height=200;
-	var $MaxValue=0;
-	var $MinValue=0;
-	var $SetShading=0;
-
-	var $PrecisionY=-1;
-
-	var $horizTickIncrement=-1;
-	var $SetNumXTicks=-1;
-	var $labelInterval=-1;
-
-	var $hideXGrid=false;
-	var $hideYGrid=false;
-
-	var $Legend=array();
-	var $LegendWidthMin=0;
-
-	var $graph;     			// Objet Graph (Artichow, Phplot...)
-	var $error;
-
-	var $library='artichow';	// Graphic library to use
-
-	var $bordercolor;			// array(R,G,B)
-	var $bgcolor;				// array(R,G,B)
-	var $bgcolorgrid;			// array(R,G,B)
-	var $datacolor;				// array(array(R,G,B),...)
-
-	private $stringtoshow;      // To store string to output graph into HTML page
-
-
-	/**
-	 * Constructor
-	 */
-	function DolGraph()
-	{
-		global $conf;
-		global $theme_bordercolor, $theme_datacolor, $theme_bgcolor, $theme_bgcoloronglet;
-
-		// Test si module GD present
-		$modules_list = get_loaded_extensions();
-		$isgdinstalled=0;
-		foreach ($modules_list as $module)
-		{
-			if ($module == 'gd') { $isgdinstalled=1; }
-		}
-		if (! $isgdinstalled)
-		{
-			$this->error="Error: PHP GD module is not available. It is required to build graphics.";
-			return -1;
-		}
-
-		$this->bordercolor = array(235,235,224);
-		$this->datacolor = array(array(120,130,150), array(160,160,180), array(190,190,220));
-		$this->bgcolor = array(235,235,224);
-
-		$color_file = DOL_DOCUMENT_ROOT.'/theme/'.$conf->theme.'/graph-color.php';
-		if (is_readable($color_file))
-		{
-			include_once($color_file);
-			if (isset($theme_bordercolor)) $this->bordercolor = $theme_bordercolor;
-			if (isset($theme_datacolor))   $this->datacolor   = $theme_datacolor;
-			if (isset($theme_bgcolor))     $this->bgcolor     = $theme_bgcolor;
-		}
-		//print 'bgcolor: '.join(',',$this->bgcolor).'<br>';
-		return 1;
-	}
-
-
-	/**
-	 * Set Y precision
-	 *
-	 * @param 	float	$which_prec
-	 * @return 	string
-	 */
-	function SetPrecisionY($which_prec)
-	{
-		$this->PrecisionY = $which_prec;
-		return true;
-	}
-
-	/**
-	 * Utiliser SetNumTicks ou SetHorizTickIncrement mais pas les 2
-	 *
-	 * @param float $xi
-	 */
-	function SetHorizTickIncrement($xi)
-	{
-		$this->horizTickIncrement = $xi;
-		return true;
-	}
-
-	/**
-	 * Utiliser SetNumTicks ou SetHorizTickIncrement mais pas les 2
-	 *
-	 * @param float $xt
-	 */
-	function SetNumXTicks($xt)
-	{
-		$this->SetNumXTicks = $xt;
-		return true;
-	}
-
-	/**
-	 * Set label interval to reduce number of labels
-	 *
-	 * @param float $x
-	 */
-	function SetLabelInterval($x)
-	{
-		$this->labelInterval = $x;
-		return true;
-	}
-
-	/**
-	 * Hide X grid
-	 */
-	function SetHideXGrid($bool)
-	{
-		$this->hideXGrid = $bool;
-		return true;
-	}
-
-	/**
-	 * Hide Y grid
-	 */
-	function SetHideYGrid($bool)
-	{
-		$this->hideYGrid = $bool;
-		return true;
-	}
-
-	/**
-	 *
-	 * @param unknown_type $label
-	 */
-	function SetYLabel($label)
-	{
-		$this->YLabel = $label;
-	}
-
-	/**
-	 *
-	 * @param $w
-	 */
-	function SetWidth($w)
-	{
-		$this->width = $w;
-	}
-
-	/**
-	 *
-	 * @param $title
-	 */
-	function SetTitle($title)
-	{
-		$this->title = $title;
-	}
-
-	/**
-	 *
-	 * @param $data
-	 */
-	function SetData($data)
-	{
-		$this->data = $data;
-	}
-
-	/**
-	 *
-	 * @param $type
-	 */
-	function SetType($type)
-	{
-		$this->type = $type;
-	}
-
-	/**
-	 *
-	 * @param $legend
-	 */
-	function SetLegend($legend)
-	{
-		$this->Legend = $legend;
-	}
-
-	/**
-	 *
-	 * @param $legendwidthmin
-	 */
-	function SetLegendWidthMin($legendwidthmin)
-	{
-		$this->LegendWidthMin = $legendwidthmin;
-	}
-
-	/**
-	 *
-	 * @param $max
-	 */
-	function SetMaxValue($max)
-	{
-		$this->MaxValue = $max;
-	}
-
-	/**
-	 *
-	 */
-	function GetMaxValue()
-	{
-		return $this->MaxValue;
-	}
-
-	/**
-	 *
-	 * @param $min
-	 */
-	function SetMinValue($min)
-	{
-		$this->MinValue = $min;
-	}
-
-	/**
-	 *
-	 */
-	function GetMinValue()
-	{
-		return $this->MinValue;
-	}
-
-	/**
-	 *
-	 * @param $h
-	 */
-	function SetHeight($h)
-	{
-		$this->height = $h;
-	}
-
-	/**
-	 *
-	 * @param $s
-	 */
-	function SetShading($s)
-	{
-		$this->SetShading = $s;
-	}
-
-	/**
-	 *
-	 */
-	function ResetBgColor()
-	{
-		unset($this->bgcolor);
-	}
-
-	/**
-	 *
-	 */
-	function ResetBgColorGrid()
-	{
-		unset($this->bgcolorgrid);
-	}
-
-	/**
-	 *
-	 */
-	function isGraphKo()
-	{
-		return $this->error;
-	}
-
-
-	/**
-	 * Definie la couleur de fond de l'image complete
-	 *
-	 * @param	array	$bg_color		array(R,G,B) ou 'onglet' ou 'default'
-	 * @return	void
-	 */
-	function SetBgColor($bg_color = array(255,255,255))
-	{
-		global $theme_bgcolor,$theme_bgcoloronglet;
-		if (! is_array($bg_color))
-		{
-			if ($bg_color == 'onglet')
-		  	{
-		  		//print 'ee'.join(',',$theme_bgcoloronglet);
-		  		$this->bgcolor = $theme_bgcoloronglet;
-		  	}
-		  	else
-		  	{
-		  		$this->bgcolor = $theme_bgcolor;
-			}
-		}
-		else
-		{
-			$this->bgcolor = $bg_color;
-		}
-	}
-
-	/**
-	 * Definie la couleur de fond de la grille
-	 *
-	 * @param	array	$bg_colorgrid		array(R,G,B) ou 'onglet' ou 'default'
-	 */
-	function SetBgColorGrid($bg_colorgrid = array(255,255,255))
-	{
-		global $theme_bgcolor,$theme_bgcoloronglet;
-		if (! is_array($bg_colorgrid))
-		{
-			if ($bg_colorgrid == 'onglet')
-		  	{
-		  		//print 'ee'.join(',',$theme_bgcoloronglet);
-		  		$this->bgcolorgrid = $theme_bgcoloronglet;
-		  	}
-		  	else
-		  	{
-		  		$this->bgcolorgrid = $theme_bgcolor;
-			}
-		}
-		else
-		{
-			$this->bgcolorgrid = $bg_colorgrid;
-		}
-	}
-
-	/**
-	 *
-	 */
-	function ResetDataColor()
-	{
-		unset($this->datacolor);
-	}
-
-	/**
-	 *
-	 */
-	function GetMaxValueInData()
-	{
-		$k = 0;
-		$vals = array();
-
-		$nblines = count($this->data);
-		$nbvalues = count($this->data[0]) - 1;
-
-		for ($j = 0 ; $j < $nblines ; $j++)
-		{
-			for ($i = 0 ; $i < $nbvalues ; $i++)
-	  {
-	  	$vals[$k] = $this->data[$j][$i+1];
-	  	$k++;
-	  }
-		}
-		rsort($vals);
-		return $vals[0];
-	}
-
-	/**
-	 *
-	 */
-	function GetMinValueInData()
-	{
-		$k = 0;
-		$vals = array();
-
-		$nblines = count($this->data);
-		$nbvalues = count($this->data[0]) - 1;
-
-		for ($j = 0 ; $j < $nblines ; $j++)
-		{
-			for ($i = 0 ; $i < $nbvalues ; $i++)
-	  {
-	  	$vals[$k] = $this->data[$j][$i+1];
-	  	$k++;
-	  }
-		}
-		sort($vals);
-		return $vals[0];
-	}
-
-	/**
-	 * Return max value of all data
-	 *
-	 * @return 	int		Max value of all data
-	 */
-	function GetCeilMaxValue()
-	{
-		$max = $this->GetMaxValueInData();
-		if ($max != 0) $max++;
-		$size=dol_strlen(abs(ceil($max)));
-		$factor=1;
-		for ($i=0; $i < ($size-1); $i++)
-		{
-			$factor*=10;
-		}
-
-		$res=0;
-		if (is_numeric($max)) $res=ceil($max/$factor)*$factor;
-
-		//print "max=".$max." res=".$res;
-		return $res;
-	}
-
-	/**
-	 * Return min value of all data
-	 *
-	 * @return 	int		Max value of all data
-	 */
-	function GetFloorMinValue()
-	{
-		$min = $this->GetMinValueInData();
-		if ($min != 0) $min--;
-		$size=dol_strlen(abs(floor($min)));
-		$factor=1;
-		for ($i=0; $i < ($size-1); $i++)
-		{
-			$factor*=10;
-		}
-
-		$res=floor($min/$factor)*$factor;
-
-		//print "min=".$min." res=".$res;
-		return $res;
-	}
-
-	/**
-	 * Build a graph onto disk using correct library
-	 *
-	 * @param	string	$file    	Image file name to use if we save onto disk
-	 * @param	string	$fileurl	Url path to show image if saved onto disk
-	 * @return	void
-	 */
-	function draw($file,$fileurl='')
-	{
-		if (! is_array($this->data) || count($this->data) < 1)
-		{
-			$this->error="Call to draw method was made but SetData was not called or called with an empty dataset for parameters";
-			dol_syslog(get_class($this)."::draw ".$this->error, LOG_ERR);
-			return -1;
-		}
-		$call = "draw_".$this->library;
-		$this->$call($file,$fileurl);
-	}
-
-
-	/**
-	 * Build a graph onto disk using Artichow library
-	 *
-	 * @param	string	$file    	Image file name to use if we save onto disk
-	 * @param	string	$fileurl	Url path to show image if saved onto disk
-	 * @return	void
-	 */
-	private function draw_artichow($file,$fileurl)
-	{
-	    global $artichow_defaultfont;
-
-		dol_syslog(get_class($this)."::draw_artichow this->type=".$this->type);
-
-		if (! defined('SHADOW_RIGHT_TOP'))  define('SHADOW_RIGHT_TOP',3);
-		if (! defined('LEGEND_BACKGROUND')) define('LEGEND_BACKGROUND',2);
-		if (! defined('LEGEND_LINE'))       define('LEGEND_LINE',1);
-
-		// Create graph
-		$classname='';
-		if ($this->type == 'bars')  $classname='BarPlot';
-		if ($this->type == 'lines') $classname='LinePlot';
-		include_once(ARTICHOW_PATH.$classname.".class.php");
-
-		// Definition de couleurs
-		$bgcolor=new Color($this->bgcolor[0],$this->bgcolor[1],$this->bgcolor[2]);
-		$bgcolorgrid=new Color($this->bgcolorgrid[0],$this->bgcolorgrid[1],$this->bgcolorgrid[2]);
-		$colortrans=new Color(0,0,0,100);
-		$colorsemitrans=new Color(255,255,255,60);
-		$colorgradient= new LinearGradient(new Color(235, 235, 235),new Color(255, 255, 255),0);
-		$colorwhite=new Color(255,255,255);
-
-		// Graph
-		$graph = new Graph($this->width, $this->height);
-		$graph->border->hide();
-		$graph->setAntiAliasing(true);
-		if (isset($this->title))
-		{
-			$graph->title->set($this->title);
-			//print $artichow_defaultfont;exit;
-			$graph->title->setFont(new $artichow_defaultfont(10));
-		}
-
-		if (is_array($this->bgcolor)) $graph->setBackgroundColor($bgcolor);
-		else $graph->setBackgroundGradient($colorgradient);
-
-		$group = new PlotGroup;
-		//$group->setSpace(5, 5, 0, 0);
-
-		$paddleft=50;
-		$paddright=10;
-		$strl=dol_strlen(max(abs($this->MaxValue),abs($this->MinValue)));
-		if ($strl > 6) $paddleft += ($strl * 4);
-		$group->setPadding($paddleft, $paddright);		// Width on left and right for Y axis values
-		$group->legend->setSpace(0);
-		$group->legend->setPadding(2,2,2,2);
-		$group->legend->setPosition(NULL,0.1);
-		$group->legend->setBackgroundColor($colorsemitrans);
-
-		if (is_array($this->bgcolorgrid)) $group->grid->setBackgroundColor($bgcolorgrid);
-		else $group->grid->setBackgroundColor($colortrans);
-
-		if ($this->hideXGrid)	$group->grid->hideVertical(true);
-		if ($this->hideYGrid)	$group->grid->hideHorizontal(true);
-
-		// On boucle sur chaque lot de donnees
-		$legends=array();
-		$i=0;
-		$nblot=count($this->data[0])-1;
-
-		while ($i < $nblot)
-		{
-			$j=0;
-			$values=array();
-			foreach($this->data as $key => $valarray)
-			{
-				$legends[$j] = $valarray[0];
-				$values[$j]  = $valarray[$i+1];
-				$j++;
-			}
-
-			// Artichow ne gere pas les valeurs inconnues
-			// Donc si inconnu, on la fixe a null
-			$newvalues=array();
-			foreach($values as $val)
-			{
-				$newvalues[]=(is_numeric($val) ? $val : null);
-			}
-
-
-			if ($this->type == 'bars')
-			{
-				//print "Lot de donnees $i<br>";
-				//print_r($values);
-				//print '<br>';
-
-				$color=new Color($this->datacolor[$i][0],$this->datacolor[$i][1],$this->datacolor[$i][2],20);
-				$colorbis=new Color(min($this->datacolor[$i][0]+50,255),min($this->datacolor[$i][1]+50,255),min($this->datacolor[$i][2]+50,255),50);
-
-				$colorgrey=new Color(100,100,100);
-				$colorborder=new Color($this->datacolor[$i][0],$this->datacolor[$i][1],$this->datacolor[$i][2]);
-
-				if ($this->mode == 'side')  $plot = new BarPlot($newvalues, $i+1, $nblot);
-				if ($this->mode == 'depth') $plot = new BarPlot($newvalues, 1, 1, ($nblot-$i-1)*5);
-
-				$plot->barBorder->setColor($colorgrey);
-				//$plot->setBarColor($color);
-				$plot->setBarGradient(new LinearGradient($colorbis, $color, 90));
-
-				if ($this->mode == 'side')  $plot->setBarPadding(0.1, 0.1);
-				if ($this->mode == 'depth') $plot->setBarPadding(0.1, 0.4);
-				if ($this->mode == 'side')  $plot->setBarSpace(5);
-				if ($this->mode == 'depth') $plot->setBarSpace(2);
-
-				$plot->barShadow->setSize($this->SetShading);
-				$plot->barShadow->setPosition(SHADOW_RIGHT_TOP);
-				$plot->barShadow->setColor(new Color(160, 160, 160, 50));
-				$plot->barShadow->smooth(TRUE);
-				//$plot->setSize(1, 0.96);
-				//$plot->setCenter(0.5, 0.52);
-
-				// Le mode automatique est plus efficace
-				$plot->SetYMax($this->MaxValue);
-				$plot->SetYMin($this->MinValue);
-			}
-
-			if ($this->type == 'lines')
-			{
-				$color=new Color($this->datacolor[$i][0],$this->datacolor[$i][1],$this->datacolor[$i][2],20);
-				$colorbis=new Color(min($this->datacolor[$i][0]+20,255),min($this->datacolor[$i][1]+20,255),min($this->datacolor[$i][2]+20,255),60);
-				$colorter=new Color(min($this->datacolor[$i][0]+50,255),min($this->datacolor[$i][1]+50,255),min($this->datacolor[$i][2]+50,255),90);
-
-				$plot = new LinePlot($newvalues);
-				//$plot->setSize(1, 0.96);
-				//$plot->setCenter(0.5, 0.52);
-
-				$plot->setColor($color);
-				$plot->setThickness(1);
-
-				// Set line background gradient
-				$plot->setFillGradient(new LinearGradient($colorter, $colorbis, 90));
-
-				$plot->xAxis->setLabelText($legends);
-
-				// Le mode automatique est plus efficace
-				$plot->SetYMax($this->MaxValue);
-				$plot->SetYMin($this->MinValue);
-				//$plot->setYAxis(0);
-				//$plot->hideLine(true);
-			}
-
-			//$plot->reduce(80);		// Evite temps d'affichage trop long et nombre de ticks absisce satures
-
-			$group->legend->setTextFont(new $artichow_defaultfont(10)); // This is to force Artichow to use awFileFontDriver to
-														// solve a bug in Artichow with UTF8
-			if (count($this->Legend))
-			{
-				if ($this->type == 'bars')  $group->legend->add($plot, $this->Legend[$i], LEGEND_BACKGROUND);
-				if ($this->type == 'lines') $group->legend->add($plot, $this->Legend[$i], LEGEND_LINE);
-			}
-			$group->add($plot);
-
-			$i++;
-		}
-
-		$group->axis->bottom->setLabelText($legends);
-		$group->axis->bottom->label->setFont(new $artichow_defaultfont(7));
-
-		//print $group->axis->bottom->getLabelNumber();
-		if ($this->labelInterval > 0) $group->axis->bottom->setLabelInterval($this->labelInterval);
-
-		$graph->add($group);
-
-		// Generate file
-		$graph->draw($file);
-
-		$this->stringtoshow='<img src="'.$fileurl.'" title="'.dol_escape_htmltag($this->title?$this->title:$this->YLabel).'" alt="'.dol_escape_htmltag($this->title?$this->title:$this->YLabel).'">';
-	}
-
-
-	/**
-	* Output HTML string to show graph
-	*
-	* @return	string		HTML string to show graph
-	*/
-	function show()
-	{
-	    return $this->stringtoshow;
-	}
+    //! Type du graphique
+    var $type='bars';		// bars, lines, ...
+    var $mode='side';		// Mode bars graph: side, depth
+
+    //! Tableau de donnees
+    var $data;				// array(array('abs1',valA1,valB1), array('abs2',valA2,valB2), ...)
+    var $title;
+    var $width=380;
+    var $height=200;
+    var $MaxValue=0;
+    var $MinValue=0;
+    var $SetShading=0;
+
+    var $PrecisionY=-1;
+
+    var $horizTickIncrement=-1;
+    var $SetNumXTicks=-1;
+    var $labelInterval=-1;
+
+    var $hideXGrid=false;
+    var $hideYGrid=false;
+
+    var $Legend=array();
+    var $LegendWidthMin=0;
+
+    var $graph;     			// Objet Graph (Artichow, Phplot...)
+    var $error;
+
+    var $library='artichow';	// Graphic library to use
+
+    var $bordercolor;			// array(R,G,B)
+    var $bgcolor;				// array(R,G,B)
+    var $bgcolorgrid;			// array(R,G,B)
+    var $datacolor;				// array(array(R,G,B),...)
+
+    private $_stringtoshow;      // To store string to output graph into HTML page
+
+
+    /**
+     * Constructor
+     */
+    function DolGraph()
+    {
+        global $conf;
+        global $theme_bordercolor, $theme_datacolor, $theme_bgcolor, $theme_bgcoloronglet;
+
+        // Test si module GD present
+        $modules_list = get_loaded_extensions();
+        $isgdinstalled=0;
+        foreach ($modules_list as $module)
+        {
+            if ($module == 'gd') {
+                $isgdinstalled=1;
+            }
+        }
+        if (! $isgdinstalled)
+        {
+            $this->error="Error: PHP GD module is not available. It is required to build graphics.";
+            return -1;
+        }
+
+        $this->bordercolor = array(235,235,224);
+        $this->datacolor = array(array(120,130,150), array(160,160,180), array(190,190,220));
+        $this->bgcolor = array(235,235,224);
+
+        $color_file = DOL_DOCUMENT_ROOT.'/theme/'.$conf->theme.'/graph-color.php';
+        if (is_readable($color_file))
+        {
+            include_once($color_file);
+            if (isset($theme_bordercolor)) $this->bordercolor = $theme_bordercolor;
+            if (isset($theme_datacolor))   $this->datacolor   = $theme_datacolor;
+            if (isset($theme_bgcolor))     $this->bgcolor     = $theme_bgcolor;
+        }
+        //print 'bgcolor: '.join(',',$this->bgcolor).'<br>';
+        return 1;
+    }
+
+
+    /**
+     * Set Y precision
+     *
+     * @param 	float	$which_prec		Precision
+     * @return 	string
+     */
+    function SetPrecisionY($which_prec)
+    {
+        $this->PrecisionY = $which_prec;
+        return true;
+    }
+
+    /**
+     * Utiliser SetNumTicks ou SetHorizTickIncrement mais pas les 2
+     *
+     * @param 	float 		$xi		Xi
+     * @return	boolean				True
+     */
+    function SetHorizTickIncrement($xi)
+    {
+        $this->horizTickIncrement = $xi;
+        return true;
+    }
+
+    /**
+     * Utiliser SetNumTicks ou SetHorizTickIncrement mais pas les 2
+     *
+     * @param 	float 		$xt		Xt
+     * @return	boolean				True
+     */
+    function SetNumXTicks($xt)
+    {
+        $this->SetNumXTicks = $xt;
+        return true;
+    }
+
+    /**
+     * Set label interval to reduce number of labels
+     *
+     * @param 	float 		$x		Label interval
+     * @return	boolean				True
+     */
+    function SetLabelInterval($x)
+    {
+        $this->labelInterval = $x;
+        return true;
+    }
+
+    /**
+     * Hide X grid
+     *
+     * @param	boolean		$bool	XGrid or not
+     * @return	boolean				true
+     */
+    function SetHideXGrid($bool)
+    {
+        $this->hideXGrid = $bool;
+        return true;
+    }
+
+    /**
+     * Hide Y grid
+     *
+     * @param	boolean		$bool	YGrid or not
+     * @return	boolean				true
+     */
+    function SetHideYGrid($bool)
+    {
+        $this->hideYGrid = $bool;
+        return true;
+    }
+
+    /**
+     * Set y label
+     *
+     * @param 	string	$label		Y label
+     * @return	boolean				True
+     */
+    function SetYLabel($label)
+    {
+        $this->YLabel = $label;
+    }
+
+    /**
+     * Set width
+     *
+     * @param 	int		$w			Width
+     * @return	boolean				True
+     */
+    function SetWidth($w)
+    {
+        $this->width = $w;
+    }
+
+    /**
+     * Set title
+     *
+     * @param 	string	$title		Title
+     * @return	void
+     */
+    function SetTitle($title)
+    {
+        $this->title = $title;
+    }
+
+    /**
+     * Set data
+     *
+     * @param 	array	$data		Data
+     * @return	void
+     */
+    function SetData($data)
+    {
+        $this->data = $data;
+    }
+
+    /**
+     * Set type
+     *
+     * @param 	string	$type		Type
+     * @return	void
+     */
+    function SetType($type)
+    {
+        $this->type = $type;
+    }
+
+    /**
+     * Set legend
+     *
+     * @param 	string	$legend		Legend
+     * @return	void
+     */
+    function SetLegend($legend)
+    {
+        $this->Legend = $legend;
+    }
+
+    /**
+     * Set min width
+     *
+     * @param 	int		$legendwidthmin		Min width
+     * @return	void
+     */
+    function SetLegendWidthMin($legendwidthmin)
+    {
+        $this->LegendWidthMin = $legendwidthmin;
+    }
+
+    /**
+     * Set max value
+     *
+     * @param 	int		$max			Max value
+     * @return	void
+     */
+    function SetMaxValue($max)
+    {
+        $this->MaxValue = $max;
+    }
+
+    /**
+     * Get max value
+     *
+     * @return	int		Max value
+     */
+    function GetMaxValue()
+    {
+        return $this->MaxValue;
+    }
+
+    /**
+     * Set min value
+     *
+     * @param 	int		$min			Min value
+     * @return	void
+     */
+    function SetMinValue($min)
+    {
+        $this->MinValue = $min;
+    }
+
+    /**
+     * Get min value
+     *
+     * @return	int		Max value
+     */
+    function GetMinValue()
+    {
+        return $this->MinValue;
+    }
+
+    /**
+     * Set height
+     *
+     * @param 	int		$h				Height
+     * @return	void
+     */
+    function SetHeight($h)
+    {
+        $this->height = $h;
+    }
+
+    /**
+     * Set shading
+     *
+     * @param 	string	$s				Shading
+     * @return	void
+     */
+    function SetShading($s)
+    {
+        $this->SetShading = $s;
+    }
+
+    /**
+     * Reset bg color
+     *
+     * @return	void
+     */
+    function ResetBgColor()
+    {
+        unset($this->bgcolor);
+    }
+
+    /**
+     * Reset bgcolorgrid
+     *
+     * @return	void
+     */
+    function ResetBgColorGrid()
+    {
+        unset($this->bgcolorgrid);
+    }
+
+    /**
+     * Is graph ko
+     *
+     * @return	string		Error
+     */
+    function isGraphKo()
+    {
+        return $this->error;
+    }
+
+
+    /**
+     * Define background color of complete image
+     *
+     * @param	array	$bg_color		array(R,G,B) ou 'onglet' ou 'default'
+     * @return	void
+     */
+    function SetBgColor($bg_color = array(255,255,255))
+    {
+        global $theme_bgcolor,$theme_bgcoloronglet;
+        if (! is_array($bg_color))
+        {
+            if ($bg_color == 'onglet')
+            {
+                //print 'ee'.join(',',$theme_bgcoloronglet);
+                $this->bgcolor = $theme_bgcoloronglet;
+            }
+            else
+            {
+                $this->bgcolor = $theme_bgcolor;
+            }
+        }
+        else
+        {
+            $this->bgcolor = $bg_color;
+        }
+    }
+
+    /**
+     * Define background color of grid
+     *
+     * @param	array	$bg_colorgrid		array(R,G,B) ou 'onglet' ou 'default'
+     * @return	void
+     */
+    function SetBgColorGrid($bg_colorgrid = array(255,255,255))
+    {
+        global $theme_bgcolor,$theme_bgcoloronglet;
+        if (! is_array($bg_colorgrid))
+        {
+            if ($bg_colorgrid == 'onglet')
+            {
+                //print 'ee'.join(',',$theme_bgcoloronglet);
+                $this->bgcolorgrid = $theme_bgcoloronglet;
+            }
+            else
+            {
+                $this->bgcolorgrid = $theme_bgcolor;
+            }
+        }
+        else
+        {
+            $this->bgcolorgrid = $bg_colorgrid;
+        }
+    }
+
+    /**
+     * Reset data color
+     *
+     * @return	void
+     */
+    function ResetDataColor()
+    {
+        unset($this->datacolor);
+    }
+
+    /**
+     * Get max value
+     *
+     * @return	int		Max value
+     */
+    function GetMaxValueInData()
+    {
+        $k = 0;
+        $vals = array();
+
+        $nblines = count($this->data);
+        $nbvalues = count($this->data[0]) - 1;
+
+        for ($j = 0 ; $j < $nblines ; $j++)
+        {
+            for ($i = 0 ; $i < $nbvalues ; $i++)
+            {
+                $vals[$k] = $this->data[$j][$i+1];
+                $k++;
+            }
+        }
+        rsort($vals);
+        return $vals[0];
+    }
+
+    /**
+     * Return min value of all data
+     *
+     * @return	int		Min value of all data
+     */
+    function GetMinValueInData()
+    {
+        $k = 0;
+        $vals = array();
+
+        $nblines = count($this->data);
+        $nbvalues = count($this->data[0]) - 1;
+
+        for ($j = 0 ; $j < $nblines ; $j++)
+        {
+            for ($i = 0 ; $i < $nbvalues ; $i++)
+            {
+                $vals[$k] = $this->data[$j][$i+1];
+                $k++;
+            }
+        }
+        sort($vals);
+        return $vals[0];
+    }
+
+    /**
+     * Return max value of all data
+     *
+     * @return 	int		Max value of all data
+     */
+    function GetCeilMaxValue()
+    {
+        $max = $this->GetMaxValueInData();
+        if ($max != 0) $max++;
+        $size=dol_strlen(abs(ceil($max)));
+        $factor=1;
+        for ($i=0; $i < ($size-1); $i++)
+        {
+            $factor*=10;
+        }
+
+        $res=0;
+        if (is_numeric($max)) $res=ceil($max/$factor)*$factor;
+
+        //print "max=".$max." res=".$res;
+        return $res;
+    }
+
+    /**
+     * Return min value of all data
+     *
+     * @return 	int		Max value of all data
+     */
+    function GetFloorMinValue()
+    {
+        $min = $this->GetMinValueInData();
+        if ($min != 0) $min--;
+        $size=dol_strlen(abs(floor($min)));
+        $factor=1;
+        for ($i=0; $i < ($size-1); $i++)
+        {
+            $factor*=10;
+        }
+
+        $res=floor($min/$factor)*$factor;
+
+        //print "min=".$min." res=".$res;
+        return $res;
+    }
+
+    /**
+     * Build a graph onto disk using correct library
+     *
+     * @param	string	$file    	Image file name to use if we save onto disk
+     * @param	string	$fileurl	Url path to show image if saved onto disk
+     * @return	void
+     */
+    function draw($file,$fileurl='')
+    {
+        if (! is_array($this->data) || count($this->data) < 1)
+        {
+            $this->error="Call to draw method was made but SetData was not called or called with an empty dataset for parameters";
+            dol_syslog(get_class($this)."::draw ".$this->error, LOG_ERR);
+            return -1;
+        }
+        $call = "draw_".$this->library;
+        $this->$call($file,$fileurl);
+    }
+
+
+    /**
+     * Build a graph onto disk using Artichow library
+     *
+     * @param	string	$file    	Image file name to use if we save onto disk
+     * @param	string	$fileurl	Url path to show image if saved onto disk
+     * @return	void
+     */
+    private function draw_artichow($file,$fileurl)
+    {
+        global $artichow_defaultfont;
+
+        dol_syslog(get_class($this)."::draw_artichow this->type=".$this->type);
+
+        if (! defined('SHADOW_RIGHT_TOP'))  define('SHADOW_RIGHT_TOP',3);
+        if (! defined('LEGEND_BACKGROUND')) define('LEGEND_BACKGROUND',2);
+        if (! defined('LEGEND_LINE'))       define('LEGEND_LINE',1);
+
+        // Create graph
+        $classname='';
+        if ($this->type == 'bars')  $classname='BarPlot';
+        if ($this->type == 'lines') $classname='LinePlot';
+        include_once(ARTICHOW_PATH.$classname.".class.php");
+
+        // Definition de couleurs
+        $bgcolor=new Color($this->bgcolor[0],$this->bgcolor[1],$this->bgcolor[2]);
+        $bgcolorgrid=new Color($this->bgcolorgrid[0],$this->bgcolorgrid[1],$this->bgcolorgrid[2]);
+        $colortrans=new Color(0,0,0,100);
+        $colorsemitrans=new Color(255,255,255,60);
+        $colorgradient= new LinearGradient(new Color(235, 235, 235),new Color(255, 255, 255),0);
+        $colorwhite=new Color(255,255,255);
+
+        // Graph
+        $graph = new Graph($this->width, $this->height);
+        $graph->border->hide();
+        $graph->setAntiAliasing(true);
+        if (isset($this->title))
+        {
+            $graph->title->set($this->title);
+            //print $artichow_defaultfont;exit;
+            $graph->title->setFont(new $artichow_defaultfont(10));
+        }
+
+        if (is_array($this->bgcolor)) $graph->setBackgroundColor($bgcolor);
+        else $graph->setBackgroundGradient($colorgradient);
+
+        $group = new PlotGroup;
+        //$group->setSpace(5, 5, 0, 0);
+
+        $paddleft=50;
+        $paddright=10;
+        $strl=dol_strlen(max(abs($this->MaxValue),abs($this->MinValue)));
+        if ($strl > 6) $paddleft += ($strl * 4);
+        $group->setPadding($paddleft, $paddright);		// Width on left and right for Y axis values
+        $group->legend->setSpace(0);
+        $group->legend->setPadding(2,2,2,2);
+        $group->legend->setPosition(NULL,0.1);
+        $group->legend->setBackgroundColor($colorsemitrans);
+
+        if (is_array($this->bgcolorgrid)) $group->grid->setBackgroundColor($bgcolorgrid);
+        else $group->grid->setBackgroundColor($colortrans);
+
+        if ($this->hideXGrid)	$group->grid->hideVertical(true);
+        if ($this->hideYGrid)	$group->grid->hideHorizontal(true);
+
+        // On boucle sur chaque lot de donnees
+        $legends=array();
+        $i=0;
+        $nblot=count($this->data[0])-1;
+
+        while ($i < $nblot)
+        {
+            $j=0;
+            $values=array();
+            foreach($this->data as $key => $valarray)
+            {
+                $legends[$j] = $valarray[0];
+                $values[$j]  = $valarray[$i+1];
+                $j++;
+            }
+
+            // Artichow ne gere pas les valeurs inconnues
+            // Donc si inconnu, on la fixe a null
+            $newvalues=array();
+            foreach($values as $val)
+            {
+                $newvalues[]=(is_numeric($val) ? $val : null);
+            }
+
+
+            if ($this->type == 'bars')
+            {
+                //print "Lot de donnees $i<br>";
+                //print_r($values);
+                //print '<br>';
+
+                $color=new Color($this->datacolor[$i][0],$this->datacolor[$i][1],$this->datacolor[$i][2],20);
+                $colorbis=new Color(min($this->datacolor[$i][0]+50,255),min($this->datacolor[$i][1]+50,255),min($this->datacolor[$i][2]+50,255),50);
+
+                $colorgrey=new Color(100,100,100);
+                $colorborder=new Color($this->datacolor[$i][0],$this->datacolor[$i][1],$this->datacolor[$i][2]);
+
+                if ($this->mode == 'side')  $plot = new BarPlot($newvalues, $i+1, $nblot);
+                if ($this->mode == 'depth') $plot = new BarPlot($newvalues, 1, 1, ($nblot-$i-1)*5);
+
+                $plot->barBorder->setColor($colorgrey);
+                //$plot->setBarColor($color);
+                $plot->setBarGradient(new LinearGradient($colorbis, $color, 90));
+
+                if ($this->mode == 'side')  $plot->setBarPadding(0.1, 0.1);
+                if ($this->mode == 'depth') $plot->setBarPadding(0.1, 0.4);
+                if ($this->mode == 'side')  $plot->setBarSpace(5);
+                if ($this->mode == 'depth') $plot->setBarSpace(2);
+
+                $plot->barShadow->setSize($this->SetShading);
+                $plot->barShadow->setPosition(SHADOW_RIGHT_TOP);
+                $plot->barShadow->setColor(new Color(160, 160, 160, 50));
+                $plot->barShadow->smooth(TRUE);
+                //$plot->setSize(1, 0.96);
+                //$plot->setCenter(0.5, 0.52);
+
+                // Le mode automatique est plus efficace
+                $plot->SetYMax($this->MaxValue);
+                $plot->SetYMin($this->MinValue);
+            }
+
+            if ($this->type == 'lines')
+            {
+                $color=new Color($this->datacolor[$i][0],$this->datacolor[$i][1],$this->datacolor[$i][2],20);
+                $colorbis=new Color(min($this->datacolor[$i][0]+20,255),min($this->datacolor[$i][1]+20,255),min($this->datacolor[$i][2]+20,255),60);
+                $colorter=new Color(min($this->datacolor[$i][0]+50,255),min($this->datacolor[$i][1]+50,255),min($this->datacolor[$i][2]+50,255),90);
+
+                $plot = new LinePlot($newvalues);
+                //$plot->setSize(1, 0.96);
+                //$plot->setCenter(0.5, 0.52);
+
+                $plot->setColor($color);
+                $plot->setThickness(1);
+
+                // Set line background gradient
+                $plot->setFillGradient(new LinearGradient($colorter, $colorbis, 90));
+
+                $plot->xAxis->setLabelText($legends);
+
+                // Le mode automatique est plus efficace
+                $plot->SetYMax($this->MaxValue);
+                $plot->SetYMin($this->MinValue);
+                //$plot->setYAxis(0);
+                //$plot->hideLine(true);
+            }
+
+            //$plot->reduce(80);		// Evite temps d'affichage trop long et nombre de ticks absisce satures
+
+            $group->legend->setTextFont(new $artichow_defaultfont(10)); // This is to force Artichow to use awFileFontDriver to
+            // solve a bug in Artichow with UTF8
+            if (count($this->Legend))
+            {
+                if ($this->type == 'bars')  $group->legend->add($plot, $this->Legend[$i], LEGEND_BACKGROUND);
+                if ($this->type == 'lines') $group->legend->add($plot, $this->Legend[$i], LEGEND_LINE);
+            }
+            $group->add($plot);
+
+            $i++;
+        }
+
+        $group->axis->bottom->setLabelText($legends);
+        $group->axis->bottom->label->setFont(new $artichow_defaultfont(7));
+
+        //print $group->axis->bottom->getLabelNumber();
+        if ($this->labelInterval > 0) $group->axis->bottom->setLabelInterval($this->labelInterval);
+
+        $graph->add($group);
+
+        // Generate file
+        $graph->draw($file);
+
+        $this->_stringtoshow='<img src="'.$fileurl.'" title="'.dol_escape_htmltag($this->title?$this->title:$this->YLabel).'" alt="'.dol_escape_htmltag($this->title?$this->title:$this->YLabel).'">';
+    }
+
+
+    /**
+     * Output HTML string to show graph
+     *
+     * @return	string		HTML string to show graph
+     */
+    function show()
+    {
+        return $this->_stringtoshow;
+    }
 }
 
 ?>