diff --git a/htdocs/lib/databases/mssql.lib.php b/htdocs/lib/databases/mssql.lib.php
index 4191d8ea1fae4789824cd44ad8c802f3293545ec..4b52dd49c57c6737ed47b311f6c0cf868f7d5e91 100644
--- a/htdocs/lib/databases/mssql.lib.php
+++ b/htdocs/lib/databases/mssql.lib.php
@@ -20,239 +20,218 @@
  */
 
 /**
-		\file       	htdocs/lib/databases/mssql.lib.php
-		\brief			Fichier de la classe permettant de g�rer une base mssql
-		\version		$Id$
-*/
-// Pour compatibilit� lors de l'upgrade
+ \file       	htdocs/lib/databases/mssql.lib.php
+ \brief			Fichier de la classe permettant de g�rer une base mssql
+ \version		$Id$
+ */
+// Pour compatibilite lors de l'upgrade
 if (! defined('DOL_DOCUMENT_ROOT'))	 define('DOL_DOCUMENT_ROOT', '../..');
 if (! defined('ADODB_DATE_VERSION')) include_once(DOL_DOCUMENT_ROOT."/includes/adodbtime/adodb-time.inc.php");
 
 
 /**
-		\class      DoliDb
-		\brief      Classe de gestion de la database de dolibarr
-		\remarks	Works with PHP5 Only
-*/
+ \class      DoliDb
+ \brief      Classe de gestion de la database de dolibarr
+ \remarks	Works with PHP5 Only
+ */
 class DoliDb
 {
-  //! Handler de base
-  var $db;
-  //! Nom du gestionnaire
-  var $type='mssql';
-  //! Charset
-  var $forcecharset='latin1';
-  //! Collate
-  var $forcecollate='latin1_swedish_ci';
-  //! Version min database
-  var $versionmin=array(2000);	
-  //! Resultset de la derni�re requete  
-  var $results;
-  //! 1 si connect�, 0 sinon  
-  var $connected;             
-  //! 1 si base s�lectionn�, 0 sinon
-  var $database_selected; 
-  //! Nom base s�lectionn�e
-  var $database_name;			
-  //! Nom user base
-  var $database_user;		
-  //! 1 si une transaction est en cours, 0 sinon
-  var $transaction_opened;	
-  //! Derniere requete ex�cut�e
-  var $lastquery;			
-  //! Derniere requete ex�cut�e avec echec
-  var $lastqueryerror;		
-  //! Message erreur mysql
-  var $lasterror;		
-  //! Message erreur mysql
-  var $lasterrno;
-  
-  var $ok;
-  var $error;
-  
-
-  // Constantes pour conversion code erreur MSSql en code erreur g�n�rique
-  var $errorcode_map = array(
-			     1004 => 'DB_ERROR_CANNOT_CREATE',
-			     1005 => 'DB_ERROR_CANNOT_CREATE',
-			     1006 => 'DB_ERROR_CANNOT_CREATE',
-			     1007 => 'DB_ERROR_ALREADY_EXISTS',
-			     1008 => 'DB_ERROR_CANNOT_DROP',
-			     1025 => 'DB_ERROR_NO_FOREIGN_KEY_TO_DROP',
-			     1046 => 'DB_ERROR_NODBSELECTED',
-			     1048 => 'DB_ERROR_CONSTRAINT',
-			     2714 => 'DB_ERROR_TABLE_ALREADY_EXISTS',
-			     1051 => 'DB_ERROR_NOSUCHTABLE',
-			     1054 => 'DB_ERROR_NOSUCHFIELD',
-			     1060 => 'DB_ERROR_COLUMN_ALREADY_EXISTS',
-			     1061 => 'DB_ERROR_KEY_NAME_ALREADY_EXISTS',
-			     2627 => 'DB_ERROR_RECORD_ALREADY_EXISTS',
-			     102  => 'DB_ERROR_SYNTAX',
-			     8120 => 'DB_ERROR_GROUP_BY_SYNTAX',
-			     1068 => 'DB_ERROR_PRIMARY_KEY_ALREADY_EXISTS',
-			     1075 => 'DB_ERROR_CANT_DROP_PRIMARY_KEY',
-			     1091 => 'DB_ERROR_NOSUCHFIELD',
-			     1100 => 'DB_ERROR_NOT_LOCKED',
-			     1136 => 'DB_ERROR_VALUE_COUNT_ON_ROW',
-			     1146 => 'DB_ERROR_NOSUCHTABLE',
-			     1216 => 'DB_ERROR_NO_PARENT',
-			     1217 => 'DB_ERROR_CHILD_EXISTS',
-			     1451 => 'DB_ERROR_CHILD_EXISTS'
-			     );
-  
-  
-  /**
-     \brief      Ouverture d'une connexion vers le serveur et �ventuellement une database.
-     \param      type		Type de base de donn�es (mysql ou pgsql)
-     \param	    host		Addresse de la base de donn�es
-     \param	    user		Nom de l'utilisateur autoris�
-     \param	    pass		Mot de passe
-     \param	    name		Nom de la database
-     \param	    port		Port of database server
-     \return     int			1 en cas de succ�s, 0 sinon
-  */
-  function DoliDb($type='mssql', $host, $user, $pass, $name='', $port=0)
-  {
-    global $conf,$langs;
-
-	$this->database_user=$user;
-    $this->transaction_opened=0;
-        
-    if (! function_exists("mssql_connect"))
-    {
-    	$this->connected = 0;
-    	$this->ok = 0;
-    	$this->error="Mssql PHP functions for using MSSql driver are not available in this version of PHP";
-    	dolibarr_syslog("DoliDB::DoliDB : MSsql PHP functions for using MSsql driver are not available in this version of PHP",LOG_ERR);
-    	return $this->ok;
-    }
-    
-    if (! $host)
-    {
-    	$this->connected = 0;
-    	$this->ok = 0;
-    	$this->error=$langs->trans("ErrorWrongHostParameter");
-    	dolibarr_syslog("DoliDB::DoliDB : Erreur Connect, wrong host parameters",LOG_ERR);
-    	return $this->ok;
-    }
-    
-    // Essai connexion serveur
-    $this->db = $this->connect($host, $user, $pass, $name, $port);
-    if ($this->db)
-    {
-    	// Si client connect� avec charset different de celui de la base Dolibarr
-    	// (La base Dolibarr a �t� forc�e en this->forcecharset � l'install)
-    	$this->connected = 1;
-    	$this->ok = 1;
-    }
-    else
-    {
-    	// host, login ou password incorrect
-    	$this->connected = 0;
-    	$this->ok = 0;
-    	$this->error=mssql_get_last_message();
-		dolibarr_syslog("DoliDB::DoliDB : Erreur Connect mssql_get_last_message=".$this->error,LOG_ERR);
-    }
-    
-    // Si connexion serveur ok et si connexion base demand�e, on essaie connexion base
-    if ($this->connected && $name)
-    {
-    	if ($this->select_db($name))
-    	{
-    		$this->database_selected = 1;
-    		$this->database_name = $name;
-    		$this->ok = 1;
-    	}
-    	else
-    	{
-    		$this->database_selected = 0;
-    		$this->database_name = '';
-    		$this->ok = 0;
-    		$this->error=$this->error();
-    		dolibarr_syslog("DoliDB::DoliDB : Erreur Select_db ".$this->error,LOG_ERR);
-    	}
-    }
-    else
-    {
-    	// Pas de selection de base demand�e, ok ou ko
-    	$this->database_selected = 0;
-    }
-    
-    return $this->ok;
-  }
-  
-
-  /**
-     \brief      Selectionne une database.
-     \param	    database		Nom de la database
-     \return	    boolean         true si ok, false si ko
+	//! Handler de base
+	var $db;
+	//! Nom du gestionnaire
+	var $type='mssql';
+	//! Charset
+	var $forcecharset='latin1';
+	//! Collate
+	var $forcecollate='latin1_swedish_ci';
+	//! Version min database
+	var $versionmin=array(2000);
+	//! Resultset de la derni�re requete  
+	var $results;
+	//! 1 si connect�, 0 sinon  
+	var $connected;
+	//! 1 si base s�lectionn�, 0 sinon
+	var $database_selected;
+	//! Nom base s�lectionn�e
+	var $database_name;
+	//! Nom user base
+	var $database_user;
+	//! 1 si une transaction est en cours, 0 sinon
+	var $transaction_opened;
+	//! Derniere requete ex�cut�e
+	var $lastquery;
+	//! Derniere requete ex�cut�e avec echec
+	var $lastqueryerror;
+	//! Message erreur mysql
+	var $lasterror;
+	//! Message erreur mysql
+	var $lasterrno;
+
+	var $ok;
+	var $error;
+
+
+	/**
+	 \brief      Ouverture d'une connexion vers le serveur et �ventuellement une database.
+	 \param      type		Type de base de donn�es (mysql ou pgsql)
+	 \param	    host		Addresse de la base de donn�es
+	 \param	    user		Nom de l'utilisateur autoris�
+	 \param	    pass		Mot de passe
+	 \param	    name		Nom de la database
+	 \param	    port		Port of database server
+	 \return     int			1 en cas de succ�s, 0 sinon
   */
-  function select_db($database)
-  {
-    return mssql_select_db($database, $this->db);
-  }
-
-  /**
-     \brief		Connection vers le serveur
-     \param	    host		addresse de la base de donn�es
-     \param	    login		nom de l'utilisateur autoris
-     \param	    passwd		mot de passe
-     \param		name		nom de la database (ne sert pas sous mysql, sert sous pgsql)
+	function DoliDb($type='mssql', $host, $user, $pass, $name='', $port=0)
+	{
+		global $conf,$langs;
+
+		$this->database_user=$user;
+		$this->transaction_opened=0;
+
+		if (! function_exists("mssql_connect"))
+		{
+			$this->connected = 0;
+			$this->ok = 0;
+			$this->error="Mssql PHP functions for using MSSql driver are not available in this version of PHP";
+			dolibarr_syslog("DoliDB::DoliDB : MSsql PHP functions for using MSsql driver are not available in this version of PHP",LOG_ERR);
+			return $this->ok;
+		}
+
+		if (! $host)
+		{
+			$this->connected = 0;
+			$this->ok = 0;
+			$this->error=$langs->trans("ErrorWrongHostParameter");
+			dolibarr_syslog("DoliDB::DoliDB : Erreur Connect, wrong host parameters",LOG_ERR);
+			return $this->ok;
+		}
+
+		// Essai connexion serveur
+		$this->db = $this->connect($host, $user, $pass, $name, $port);
+		if ($this->db)
+		{
+			// Si client connect� avec charset different de celui de la base Dolibarr
+			// (La base Dolibarr a �t� forc�e en this->forcecharset � l'install)
+			$this->connected = 1;
+			$this->ok = 1;
+		}
+		else
+		{
+			// host, login ou password incorrect
+			$this->connected = 0;
+			$this->ok = 0;
+			$this->error=mssql_get_last_message();
+			dolibarr_syslog("DoliDB::DoliDB : Erreur Connect mssql_get_last_message=".$this->error,LOG_ERR);
+		}
+
+		// Si connexion serveur ok et si connexion base demand�e, on essaie connexion base
+		if ($this->connected && $name)
+		{
+			if ($this->select_db($name))
+			{
+				$this->database_selected = 1;
+				$this->database_name = $name;
+				$this->ok = 1;
+			}
+			else
+			{
+				$this->database_selected = 0;
+				$this->database_name = '';
+				$this->ok = 0;
+				$this->error=$this->error();
+				dolibarr_syslog("DoliDB::DoliDB : Erreur Select_db ".$this->error,LOG_ERR);
+			}
+		}
+		else
+		{
+			// Pas de selection de base demandee, ok ou ko
+			$this->database_selected = 0;
+		}
+
+		return $this->ok;
+	}
+
+	/**
+	 *	\brief		Convert a SQL request in mysql syntax to database syntax
+	 * 	\param		request		SQL request to convert
+	 * 	\return		string		SQL request converted
+	 */
+	function convertSQLFromMysql($request)
+	{
+		return $request;
+	}
+
+	/**
+	 * 	\brief      Selectionne une database.
+	 *	\param	    database		Nom de la database
+	 *	\return	    boolean         true si ok, false si ko
+  	 */
+	function select_db($database)
+	{
+		return mssql_select_db($database, $this->db);
+	}
+
+	/**
+	 \brief		Connection vers le serveur
+	 \param	    host		addresse de la base de donnees
+	 \param	    login		nom de l'utilisateur autoris
+	 \param	    passwd		mot de passe
+	 \param		name		nom de la database (ne sert pas sous mysql, sert sous pgsql)
 	 \param		port		Port of database server
-     \return	resource	handler d'acc�s � la base
-     \seealso	close
+	 \return	resource	handler d'acc�s � la bas
+	 \seealso	close
   */
-  function connect($host, $login, $passwd, $name, $port=0)
-  {
-    dolibarr_syslog("DoliDB::connect host=$host, port=$port, login=$login, passwd=--hidden--, name=$name");
-	$newhost=$host;
-	if ($port) $newhost.=':'.$port;
-    $this->db  = @mssql_connect($newhost, $login, $passwd);
-    //force les enregistrement en latin1 si la base est en utf8 par d�faut
-    // Supprim� car plante sur mon PHP-Mysql. De plus, la base est forcement en latin1 avec
-	// les nouvelles version de Dolibarr car forc� par l'install Dolibarr.
-	//$this->query('SET NAMES '.$this->forcecharset);
-    //print "Resultat fonction connect: ".$this->db;
-    return $this->db;
-  }
-    
-  /**
-     \brief          Renvoie la version du serveur
-     \return	        string      Chaine version
+	function connect($host, $login, $passwd, $name, $port=0)
+	{
+		dolibarr_syslog("DoliDB::connect host=$host, port=$port, login=$login, passwd=--hidden--, name=$name");
+		$newhost=$host;
+		if ($port) $newhost.=':'.$port;
+		$this->db  = @mssql_connect($newhost, $login, $passwd);
+		//force les enregistrement en latin1 si la base est en utf8 par d�faut
+		// Supprim� car plante sur mon PHP-Mysql. De plus, la base est forcement en latin1 avec
+		// les nouvelles version de Dolibarr car forc� par l'install Dolibarr.
+		//$this->query('SET NAMES '.$this->forcecharset);
+		//print "Resultat fonction connect: ".$this->db;
+		return $this->db;
+	}
+
+	/**
+	 \brief          Renvoie la version du serveur
+	 \return	        string      Chaine version
   */
-  function getVersion()
-  {
-    $resql=$this->query("SELECT @@VERSION");
-    $version=$this->fetch_array($resql);
-	  return $version['computed'];
-  }
-  
-  
-  /**
-     \brief          Renvoie la version du serveur dans un tableau
-     \return	        array  		Tableau de chaque niveau de version
+	function getVersion()
+	{
+		$resql=$this->query("SELECT @@VERSION");
+		$version=$this->fetch_array($resql);
+		return $version['computed'];
+	}
+
+
+	/**
+	 \brief          Renvoie la version du serveur dans un tableau
+	 \return	        array  		Tableau de chaque niveau de version
   */
-  function getVersionArray()
-  {
-    return split('\.',$this->getVersion());
-  }
-  
-    
-  /**
-     \brief      Fermeture d'une connexion vers une database.
-     \return	    resource
-     \seealso	connect
+	function getVersionArray()
+	{
+		return split('\.',$this->getVersion());
+	}
+
+
+	/**
+	 \brief      Fermeture d'une connexion vers une database.
+	 \return	    resource
+	 \seealso	connect
   */
-  function close()
-  {
-    return mssql_close($this->db);
-  }
-  
+	function close()
+	{
+		return mssql_close($this->db);
+	}
+
 
 	/**
 		\brief      Debut d'une transaction.
 		\return	    int         1 si ouverture transaction ok ou deja ouverte, 0 en cas d'erreur
-	*/
+		*/
 	function begin()
 	{
 		if (! $this->transaction_opened)
@@ -275,13 +254,13 @@ class DoliDb
 	/**
 		\brief      Validation d'une transaction
 		\return	    int         1 si validation ok ou niveau de transaction non ouverte, 0 en cas d'erreur
-	*/
+		*/
 	function commit()
 	{
 		if ($this->transaction_opened <= 1)
 		{
 			$ret=$this->query("COMMIT TRANSACTION");
-			if ($ret) 
+			if ($ret)
 			{
 				$this->transaction_opened=0;
 				dolibarr_syslog("COMMIT Transaction",LOG_DEBUG);
@@ -294,220 +273,220 @@ class DoliDb
 			return 1;
 		}
 	}
-  
-  /**
-     \brief      Annulation d'une transaction et retour aux anciennes valeurs
-     \return	    int         1 si annulation ok ou transaction non ouverte, 0 en cas d'erreur
+
+	/**
+	 \brief      Annulation d'une transaction et retour aux anciennes valeurs
+	 \return	    int         1 si annulation ok ou transaction non ouverte, 0 en cas d'erreur
   */
-  function rollback()
-  {    
-    if ($this->transaction_opened<=1)
-      {
-	$ret=$this->query("ROLLBACK TRANSACTION");
-	$this->transaction_opened=0;
-	dolibarr_syslog("ROLLBACK Transaction",LOG_DEBUG);
-	return $ret;
-      }
-    else
-      {
-	$this->transaction_opened--;
-	return 1;
-      }
-  }
-  
-  /**
-     \brief      Effectue une requete et renvoi le resultset de r�ponse de la base
-     \param	    query	    Contenu de la query
-     \return	    resource    Resultset de la reponse
+	function rollback()
+	{
+		if ($this->transaction_opened<=1)
+		{
+			$ret=$this->query("ROLLBACK TRANSACTION");
+			$this->transaction_opened=0;
+			dolibarr_syslog("ROLLBACK Transaction",LOG_DEBUG);
+			return $ret;
+		}
+		else
+		{
+			$this->transaction_opened--;
+			return 1;
+		}
+	}
+
+	/**
+	 \brief      Effectue une requete et renvoi le resultset de r�ponse de la base
+	 \param	    query	    Contenu de la query
+	 \return	    resource    Resultset de la reponse
   */
-  function query($query)
-  {
-    $query = trim($query);
-    
-    // Conversion syntaxe MySql vers MSDE.
-    $query = str_ireplace("now()", "getdate()", $query);
-	// Erreur SQL: cannot update timestamp field
-    $query = str_ireplace(", tms = tms", "", $query);
-	// Voir si l'on peut directement utiliser $query = str_ireplace("file", "[file]", $query);
-	// au lieu des 3 lignes ci-dessous
-    $query = str_ireplace(".file", ".[file]", $query);
-    $query = str_ireplace(" file ", " [file] ", $query);
-    $query = str_ireplace(" file,", " [file],", $query);
-	// Idem file
-    $query = str_ireplace(".percent", ".[percent]", $query);
-    $query = str_ireplace(" percent ", " [percent] ", $query);
-    $query = str_ireplace("percent,", "[percent],", $query);
-    $query = str_ireplace("percent=", "[percent]=", $query);
-    $query = str_ireplace("\'", "''", $query);
-    
-    
-    $itemfound = stripos($query, " limit ");
-    if ($itemfound !== false) {
-	    // Extraire le nombre limite
-	    $number = stristr($query, " limit ");
-	    $number = substr($number, 7);
-	    // Ins�rer l'instruction TOP et le nombre limite
-	    $query = str_ireplace("select ", "select top ".$number." ", $query);
-	    // Supprimer l'instruction MySql
-	    $query = str_ireplace(" limit ".$number, "", $query);
-    }
-    
-    $itemfound = stripos($query, " week(");
-    if ($itemfound !== false) {
-	    // Recr�er une requ�te sans instruction Mysql
-	    $positionMySql = stripos($query, " week(");
-	    $newquery = substr($query, 0, $positionMySql);
-
-	    // R�cup�rer la date pass�e en param�tre
-	    $extractvalue = stristr($query, " week(");
-	    $extractvalue = substr($extractvalue, 6);
-	    $positionMySql = stripos($extractvalue, ")");
-	    // Conserver la fin de la requ�te
-	    $endofquery = substr($extractvalue, $positionMySql);
-	    $extractvalue = substr($extractvalue, 0, $positionMySql);
-
-	    // Remplacer l'instruction MySql en Sql Server
-	    // Ins�rer la date en param�tre et le reste de la requ�te
-	    $query = $newquery." DATEPART(week, ".$extractvalue.$endofquery;
-    }
-    
-    //print "<!--".$query."-->";
-    
-    if (! $this->database_name)
-    {
-    	// Ordre SQL ne n�cessitant pas de connexion � une base (exemple: CREATE DATABASE)
-	    $ret = mssql_query($query, $this->db);
-    }
-    else
-    {
-    	$ret = mssql_query($query, $this->db);
-    }
-    
-    if (! eregi("^COMMIT",$query) && ! eregi("^ROLLBACK",$query))
-    {
-    	// Si requete utilisateur, on la sauvegarde ainsi que son resultset
-	    if (! $ret)
-	    {
-	      $this->lastqueryerror = $query;
-
-        $result = mssql_query("SELECT @@ERROR as code", $this->db);
-        $row = mssql_fetch_array($result);
-	    
-	      $this->lasterror = $this->error();
-	      $this->lasterrno = $row["code"];
-	    }
-	    $this->lastquery=$query;
-	    $this->results = $ret;
-    }
-    
-    return $ret;
-    }
-
-    /**
-        \brief      Renvoie la ligne courante (comme un objet) pour le curseur resultset.
-        \param      resultset   Curseur de la requete voulue
-        \return	    resource
-    */
-    function fetch_object($resultset=0)
-    {
-        // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
-        if (! is_resource($resultset)) { $resultset=$this->results; }
-        return mssql_fetch_object($resultset);
-    }
-
-    /**
-        \brief      Renvoie les donn�es dans un tableau.
-        \param      resultset   Curseur de la requete voulue
-        \return	    array
-    */
-    function fetch_array($resultset=0)
-    {
-        // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
-        if (! is_resource($resultset)) { $resultset=$this->results; }
-        return mssql_fetch_array($resultset);
-    }
-
-
-    /**
-        \brief      Renvoie les donn�es comme un tableau.
-        \param      resultset   Curseur de la requete voulue
-        \return	    array
-    */
-    function fetch_row($resultset=0)
-    {
-        // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
-        if (! is_resource($resultset)) { $resultset=$this->results; }
-        return @mssql_fetch_row($resultset);
-    }
-
-    /**
-        \brief      Renvoie le nombre de lignes dans le resultat d'une requete SELECT
-        \see    	affected_rows
-        \param      resultset   Curseur de la requete voulue
-        \return     int		    Nombre de lignes
-    */
-    function num_rows($resultset=0)
-    {
-        // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
-        if (! is_resource($resultset)) { $resultset=$this->results; }
-        return mssql_num_rows($resultset);
-    }
-    
-    /**
-        \brief      Renvoie le nombre de lignes dans le resultat d'une requete INSERT, DELETE ou UPDATE
-        \see    	num_rows
-        \param      resultset   Curseur de la requete voulue
-        \return     int		    Nombre de lignes
-    */
-    function affected_rows($resultset=0)
-    {
-    	// Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
-      if (! is_resource($resultset)) { $resultset=$this->results; }
-      // mssql necessite un link de base pour cette fonction contrairement
-      // a pqsql qui prend un resultset
-      $rsRows = mssql_query("select @@rowcount as rows", $this->db);
-      return mssql_result($rsRows, 0, "rows");
-      //return mssql_affected_rows($this->db);
-    }
-
-
-    /**
-        \brief      Lib�re le dernier resultset utilis� sur cette connexion.
-        \param      resultset   Curseur de la requete voulue
-    */
-    function free($resultset=0)
-    {
-        // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
-        if (! is_resource($resultset)) { $resultset=$this->results; }
-        // Si resultset en est un, on libere la m�moire
-        if (is_resource($resultset)) mssql_free_result($resultset);
-    }
-
-
-    /**
-        \brief      D�fini les limites de la requ�te.
-        \param	    limit       nombre maximum de lignes retourn�es
-        \param	    offset      num�ro de la ligne � partir de laquelle recup�rer les lignes
-        \return	    string      chaine exprimant la syntax sql de la limite
-    */
-    function plimit($limit=0,$offset=0)
-    {
-        global $conf;
-        if (! $limit) $limit=$conf->liste_limit;
-        if ($offset > 0) return " LIMIT $offset,$limit ";
-        else return " LIMIT $limit ";
-    }
-
-
-	/**
-        \brief      D�fini le tri de la requ�te.
-        \param	    sortfield   liste des champ de tri
-        \param	    sortorder   ordre du tri
-        \return	    string      chaine exprimant la syntax sql de l'ordre de tri
+	function query($query)
+	{
+		$query = trim($query);
+
+		// Conversion syntaxe MySql vers MSDE.
+		$query = str_ireplace("now()", "getdate()", $query);
+		// Erreur SQL: cannot update timestamp field
+		$query = str_ireplace(", tms = tms", "", $query);
+		// Voir si l'on peut directement utiliser $query = str_ireplace("file", "[file]", $query);
+		// au lieu des 3 lignes ci-dessous
+		$query = str_ireplace(".file", ".[file]", $query);
+		$query = str_ireplace(" file ", " [file] ", $query);
+		$query = str_ireplace(" file,", " [file],", $query);
+		// Idem file
+		$query = str_ireplace(".percent", ".[percent]", $query);
+		$query = str_ireplace(" percent ", " [percent] ", $query);
+		$query = str_ireplace("percent,", "[percent],", $query);
+		$query = str_ireplace("percent=", "[percent]=", $query);
+		$query = str_ireplace("\'", "''", $query);
+
+
+		$itemfound = stripos($query, " limit ");
+		if ($itemfound !== false) {
+			// Extraire le nombre limite
+			$number = stristr($query, " limit ");
+			$number = substr($number, 7);
+			// Ins�rer l'instruction TOP et le nombre limite
+			$query = str_ireplace("select ", "select top ".$number." ", $query);
+			// Supprimer l'instruction MySql
+			$query = str_ireplace(" limit ".$number, "", $query);
+		}
+
+		$itemfound = stripos($query, " week(");
+		if ($itemfound !== false) {
+			// Recr�er une requ�te sans instruction Mysql
+			$positionMySql = stripos($query, " week(");
+			$newquery = substr($query, 0, $positionMySql);
+
+			// R�cup�rer la date pass�e en param�tre
+			$extractvalue = stristr($query, " week(");
+			$extractvalue = substr($extractvalue, 6);
+			$positionMySql = stripos($extractvalue, ")");
+			// Conserver la fin de la requ�te
+			$endofquery = substr($extractvalue, $positionMySql);
+			$extractvalue = substr($extractvalue, 0, $positionMySql);
+
+			// Remplacer l'instruction MySql en Sql Server
+			// Ins�rer la date en param�tre et le reste de la requ�te
+			$query = $newquery." DATEPART(week, ".$extractvalue.$endofquery;
+		}
+
+		//print "<!--".$query."-->";
+
+		if (! $this->database_name)
+		{
+			// Ordre SQL ne n�cessitant pas de connexion � une base (exemple: CREATE DATABASE)
+			$ret = mssql_query($query, $this->db);
+		}
+		else
+		{
+			$ret = mssql_query($query, $this->db);
+		}
+
+		if (! eregi("^COMMIT",$query) && ! eregi("^ROLLBACK",$query))
+		{
+			// Si requete utilisateur, on la sauvegarde ainsi que son resultset
+			if (! $ret)
+			{
+				$this->lastqueryerror = $query;
+
+				$result = mssql_query("SELECT @@ERROR as code", $this->db);
+				$row = mssql_fetch_array($result);
+				 
+				$this->lasterror = $this->error();
+				$this->lasterrno = $row["code"];
+			}
+			$this->lastquery=$query;
+			$this->results = $ret;
+		}
+
+		return $ret;
+	}
+
+	/**
+	 \brief      Renvoie la ligne courante (comme un objet) pour le curseur resultset.
+	 \param      resultset   Curseur de la requete voulue
+	 \return	    resource
+	 */
+	function fetch_object($resultset=0)
+	{
+		// Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
+		if (! is_resource($resultset)) { $resultset=$this->results; }
+		return mssql_fetch_object($resultset);
+	}
+
+	/**
+	 \brief      Renvoie les donn�es dans un tableau.
+	 \param      resultset   Curseur de la requete voulue
+	 \return	    array
+	 */
+	function fetch_array($resultset=0)
+	{
+		// Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
+		if (! is_resource($resultset)) { $resultset=$this->results; }
+		return mssql_fetch_array($resultset);
+	}
+
+
+	/**
+	 \brief      Renvoie les donn�es comme un tableau.
+	 \param      resultset   Curseur de la requete voulue
+	 \return	    array
+	 */
+	function fetch_row($resultset=0)
+	{
+		// Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
+		if (! is_resource($resultset)) { $resultset=$this->results; }
+		return @mssql_fetch_row($resultset);
+	}
+
+	/**
+	 \brief      Renvoie le nombre de lignes dans le resultat d'une requete SELECT
+	 \see    	affected_rows
+	 \param      resultset   Curseur de la requete voulue
+	 \return     int		    Nombre de lignes
+	 */
+	function num_rows($resultset=0)
+	{
+		// Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
+		if (! is_resource($resultset)) { $resultset=$this->results; }
+		return mssql_num_rows($resultset);
+	}
+
+	/**
+	 \brief      Renvoie le nombre de lignes dans le resultat d'une requete INSERT, DELETE ou UPDATE
+	 \see    	num_rows
+	 \param      resultset   Curseur de la requete voulue
+	 \return     int		    Nombre de lignes
+	 */
+	function affected_rows($resultset=0)
+	{
+		// Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
+		if (! is_resource($resultset)) { $resultset=$this->results; }
+		// mssql necessite un link de base pour cette fonction contrairement
+		// a pqsql qui prend un resultset
+		$rsRows = mssql_query("select @@rowcount as rows", $this->db);
+		return mssql_result($rsRows, 0, "rows");
+		//return mssql_affected_rows($this->db);
+	}
+
+
+	/**
+	 \brief      Lib�re le dernier resultset utilis� sur cette connexion.
+	 \param      resultset   Curseur de la requete voulue
+	 */
+	function free($resultset=0)
+	{
+		// Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
+		if (! is_resource($resultset)) { $resultset=$this->results; }
+		// Si resultset en est un, on libere la m�moire
+		if (is_resource($resultset)) mssql_free_result($resultset);
+	}
+
+
+	/**
+	 \brief      D�fini les limites de la requ�te.
+	 \param	    limit       nombre maximum de lignes retourn�es
+	 \param	    offset      num�ro de la ligne � partir de laquelle recup�rer les ligne
+	 \return	    string      chaine exprimant la syntax sql de la limite
+	 */
+	function plimit($limit=0,$offset=0)
+	{
+		global $conf;
+		if (! $limit) $limit=$conf->liste_limit;
+		if ($offset > 0) return " LIMIT $offset,$limit ";
+		else return " LIMIT $limit ";
+	}
+
+
+	/**
+	 \brief      D�fini le tri de la requ�te.
+	 \param	    sortfield   liste des champ de tri
+	 \param	    sortorder   ordre du tri
+	 \return	    string      chaine exprimant la syntax sql de l'ordre de tri
 		\TODO		A mutualiser dans classe mere
-    */
-    function order($sortfield=0,$sortorder=0)
-    {
+		*/
+	function order($sortfield=0,$sortorder=0)
+	{
 		if ($sortfield)
 		{
 			$return='';
@@ -516,7 +495,7 @@ class DoliDb
 			{
 				if (! $return) $return.=' ORDER BY ';
 				else $return.=',';
-				
+
 				$return.=$val;
 				if ($sortorder) $return.=' '.$sortorder;
 			}
@@ -526,146 +505,176 @@ class DoliDb
 		{
 			return '';
 		}
-    }
+	}
 
 
 	/**
-        \brief      Escape a string to insert data.
-        \param	    stringtoencode		String to escape
-        \return	    string				String escaped
-    */
-    function escape($stringtoencode)
+	 \brief      Escape a string to insert data.
+	 \param	    stringtoencode		String to escape
+	 \return	    string				String escaped
+	 */
+	function escape($stringtoencode)
 	{
 		return addslashes($stringtoencode);
 	}
 
 
-    /**
-    *   \brief      Formatage (par la base de donn�es) d'un champ de la base au format TMS ou Date (YYYY-MM-DD HH:MM:SS)
-    *               afin de retourner une donn�e toujours au format universel date TMS unix.
-    *               Fonction � utiliser pour g�n�rer les SELECT.
-    *   \param	    param       Nom champ base de type date ou chaine 'YYYY-MM-DD HH:MM:SS'
-    *   \return	    date        Date au format TMS.
-	*	\TODO		Remove unix_timestamp functions
-    */
-    function pdate($param)
-    {
-        return "dbo.unix_timestamp(".$param.")";
-    }
-
-    /**
-        \brief      Formatage (par PHP) d'une date vers format texte pour insertion dans champ date.
-                    Fonction � utiliser pour g�n�rer les INSERT.
-        \param	    param       Date TMS � convertir
-        \return	    date        Date au format texte YYYYMMDDHHMMSS.
-    */
-    function idate($param)
-    {
-        //return "dbo.from_unixtime(".$param.")";
-        return adodb_strftime("%d/%m/%Y %H:%M:%S",$param);
-    }
-
-
-    /**
-        \brief      Formatage d'un if SQL
-        \param		test            chaine test
-        \param		resok           resultat si test egal
-        \param		resko           resultat si test non egal
-        \return		string          chaine format� SQL
-    */
-    function ifsql($test,$resok,$resko)
-    {
-        return 'IF('.$test.','.$resok.','.$resko.')';
-    }
-
-
-    /**
-        \brief      Renvoie la derniere requete soumise par la methode query()
-        \return	    lastquery
-    */
-    function lastquery()
-    {
-        return $this->lastquery;
-    }
-
-    /**
-        \brief      Renvoie la derniere requete en erreur
-        \return	    string	lastqueryerror
-    */
+	/**
+	 *   \brief      Formatage (par la base de donn�es) d'un champ de la base au format TMS ou Date (YYYY-MM-DD HH:MM:SS)
+	 *               afin de retourner une donn�e toujours au format universel date TMS unix.
+	 *               Fonction � utiliser pour g�n�rer les SELECT.
+	 *   \param	    param       Nom champ base de type date ou chaine 'YYYY-MM-DD HH:MM:SS'
+	 *   \return	    date        Date au format TMS.
+	 *	\TODO		Remove unix_timestamp functions
+	 */
+	function pdate($param)
+	{
+		return "dbo.unix_timestamp(".$param.")";
+	}
+
+	/**
+	 \brief      Formatage (par PHP) d'une date vers format texte pour insertion dans champ date.
+	 Fonction � utiliser pour g�n�rer les INSERT.
+	 \param	    param       Date TMS � convertir
+	 \return	    date        Date au format texte YYYYMMDDHHMMSS.
+	 */
+	function idate($param)
+	{
+		//return "dbo.from_unixtime(".$param.")";
+		return adodb_strftime("%d/%m/%Y %H:%M:%S",$param);
+	}
+
+
+	/**
+	 \brief      Formatage d'un if SQL
+	 \param		test            chaine test
+	 \param		resok           resultat si test egal
+	 \param		resko           resultat si test non egal
+	 \return		string          chaine format� SQL
+	 */
+	function ifsql($test,$resok,$resko)
+	{
+		return 'IF('.$test.','.$resok.','.$resko.')';
+	}
+
+
+	/**
+	 \brief      Renvoie la derniere requete soumise par la methode query()
+	 \return	    lastquery
+	 */
+	function lastquery()
+	{
+		return $this->lastquery;
+	}
+
+	/**
+	 \brief      Renvoie la derniere requete en erreur
+	 \return	    string	lastqueryerror
+	 */
 	function lastqueryerror()
 	{
 		return $this->lastqueryerror;
 	}
 
-    /**
-        \brief      Renvoie le libelle derniere erreur
-        \return	    string	lasterror
-    */
+	/**
+	 \brief      Renvoie le libelle derniere erreur
+	 \return	    string	lasterror
+	 */
 	function lasterror()
 	{
 		return $this->lasterror;
 	}
 
-    /**
-        \brief      Renvoie le code derniere erreur
-        \return	    string	lasterrno
-    */
+	/**
+	 \brief      Renvoie le code derniere erreur
+	 \return	    string	lasterrno
+	 */
 	function lasterrno()
 	{
 		return $this->lasterrno;
 	}
 
-    /**
-        \brief     Renvoie le code erreur generique de l'operation precedente.
-        \return    error_num       (Exemples: DB_ERROR_TABLE_ALREADY_EXISTS, DB_ERROR_RECORD_ALREADY_EXISTS...)
-    */
-    function errno()
-    {
-        if (! $this->connected) {
-            // Si il y a eu echec de connexion, $this->db n'est pas valide.
-            return 'DB_ERROR_FAILED_TO_CONNECT';
-        }
-        else {
-            if (isset($this->errorcode_map[$this->lasterrno])) {
-                return $this->errorcode_map[$this->lasterrno];
-            }
-            $errno=$this->lasterrno;
-            return ($errno?'DB_ERROR_'.$errno:'0');
-        }
-    }
-
-    /**
-        \brief     Renvoie le texte de l'erreur mssql de l'operation precedente.
-        \return    error_text
-    */
-    function error()
-    {
-        if (! $this->connected) {
-            // Si il y a eu echec de connexion, $this->db n'est pas valide pour mssql_get_last_message.
-            return 'Not connected. Check setup parameters in conf/conf.php file and your mssql client and server versions';
-        }
-        else {
-            return mssql_get_last_message($this->db);
-        }
-    }
-
-    /**
-        \brief     R�cup�re l'id gen�r� par le dernier INSERT.
-        \param     tab     Nom de la table concern�e par l'insert. Ne sert pas sous mssql mais requis pour compatibilit� avec Postgresql
-        \return    int     id
-    */
-    function last_insert_id($tab)
-    {
-    	$res = $this->query("SELECT @@IDENTITY as id");
-    	if ($data = $this->fetch_array($res))
-    	{
-    		return $data["id"];
-    	}
-    	else
-    	{
-    		return -1;
-    	}
-    }
+	/**
+	 \brief     Renvoie le code erreur generique de l'operation precedente.
+	 \return    error_num       (Exemples: DB_ERROR_TABLE_ALREADY_EXISTS, DB_ERROR_RECORD_ALREADY_EXISTS...)
+	 */
+	function errno()
+	{
+		if (! $this->connected) {
+			// Si il y a eu echec de connexion, $this->db n'est pas valide.
+			return 'DB_ERROR_FAILED_TO_CONNECT';
+		}
+		else {
+			// Constants to convert a MSSql error code to a generic Dolibarr error code
+			$errorcode_map = array(
+			1004 => 'DB_ERROR_CANNOT_CREATE',
+			1005 => 'DB_ERROR_CANNOT_CREATE',
+			1006 => 'DB_ERROR_CANNOT_CREATE',
+			1007 => 'DB_ERROR_ALREADY_EXISTS',
+			1008 => 'DB_ERROR_CANNOT_DROP',
+			1025 => 'DB_ERROR_NO_FOREIGN_KEY_TO_DROP',
+			1046 => 'DB_ERROR_NODBSELECTED',
+			1048 => 'DB_ERROR_CONSTRAINT',
+			2714 => 'DB_ERROR_TABLE_ALREADY_EXISTS',
+			1051 => 'DB_ERROR_NOSUCHTABLE',
+			1054 => 'DB_ERROR_NOSUCHFIELD',
+			1060 => 'DB_ERROR_COLUMN_ALREADY_EXISTS',
+			1061 => 'DB_ERROR_KEY_NAME_ALREADY_EXISTS',
+			2627 => 'DB_ERROR_RECORD_ALREADY_EXISTS',
+			102  => 'DB_ERROR_SYNTAX',
+			8120 => 'DB_ERROR_GROUP_BY_SYNTAX',
+			1068 => 'DB_ERROR_PRIMARY_KEY_ALREADY_EXISTS',
+			1075 => 'DB_ERROR_CANT_DROP_PRIMARY_KEY',
+			1091 => 'DB_ERROR_NOSUCHFIELD',
+			1100 => 'DB_ERROR_NOT_LOCKED',
+			1136 => 'DB_ERROR_VALUE_COUNT_ON_ROW',
+			1146 => 'DB_ERROR_NOSUCHTABLE',
+			1216 => 'DB_ERROR_NO_PARENT',
+			1217 => 'DB_ERROR_CHILD_EXISTS',
+			1451 => 'DB_ERROR_CHILD_EXISTS'
+		     );
+			
+			if (isset($this->errorcode_map[$this->lasterrno]))
+			{
+				return $this->errorcode_map[$this->lasterrno];
+			}
+			$errno=$this->lasterrno;
+			return ($errno?'DB_ERROR_'.$errno:'0');
+		}
+	}
+
+	/**
+	 \brief     Renvoie le texte de l'erreur mssql de l'operation precedente.
+	 \return    error_text
+	 */
+	function error()
+	{
+		if (! $this->connected) {
+			// Si il y a eu echec de connexion, $this->db n'est pas valide pour mssql_get_last_message.
+			return 'Not connected. Check setup parameters in conf/conf.php file and your mssql client and server versions';
+		}
+		else {
+			return mssql_get_last_message($this->db);
+		}
+	}
+
+	/**
+	 \brief     R�cup�re l'id gen�r� par le dernier INSERT.
+	 \param     tab     Nom de la table concern�e par l'insert. Ne sert pas sous mssql mais requis pour compatibilit� avec Postgresql
+	 \return    int     id
+	 */
+	function last_insert_id($tab)
+	{
+		$res = $this->query("SELECT @@IDENTITY as id");
+		if ($data = $this->fetch_array($res))
+		{
+			return $data["id"];
+		}
+		else
+		{
+			return -1;
+		}
+	}
 
 
 	// Next function are not required. Only minor features use them.
@@ -676,7 +685,7 @@ class DoliDb
 	/**
 		\brief          Renvoie l'id de la connexion
 		\return	        string      Id connexion
-	*/
+		*/
 	function DDLGetConnectId()
 	{
 		$resql=$this->query('SELECT CONNECTION_ID()');
@@ -685,33 +694,33 @@ class DoliDb
 	}
 
 	/**
-		\brief          Cr�ation d'une nouvelle base de donn�e
-		\param	        database		nom de la database � cr�er
-		\return	        resource		resource d�finie si ok, null si ko
+		\brief          Cr�ation d'une nouvelle base de donn�e
+		\param	        database		nom de la database � cr�er
+		\return	        resource		resource d�finie si ok, null si k
 		\remarks        Ne pas utiliser les fonctions xxx_create_db (xxx=mssql, ...) car elles sont deprecated
-						On force creation de la base avec le charset forcecharset
-	*/
+		On force creation de la base avec le charset forcecharset
+		*/
 	function DDLCreateDb($database)
 	{
-	    // ALTER DATABASE dolibarr_db DEFAULT CHARACTER SET latin DEFAULT COLLATE latin1_swedish_ci
-	    $sql = 'CREATE DATABASE '.$database;
-	    $sql.= ' DEFAULT CHARACTER SET '.$this->forcecharset.' DEFAULT COLLATE '.$this->forcecollate;
-	    $ret=$this->query($sql);
-	    if (! $ret)
-	      {
-		// On r�essaie pour compatibilit� avec mssql < 5.0
+		// ALTER DATABASE dolibarr_db DEFAULT CHARACTER SET latin DEFAULT COLLATE latin1_swedish_ci
 		$sql = 'CREATE DATABASE '.$database;
+		$sql.= ' DEFAULT CHARACTER SET '.$this->forcecharset.' DEFAULT COLLATE '.$this->forcecollate;
 		$ret=$this->query($sql);
-	      }
-    
+		if (! $ret)
+		{
+			// On r�essaie pour compatibilit� avec mssql < 5.0
+			$sql = 'CREATE DATABASE '.$database;
+			$ret=$this->query($sql);
+		}
+
 		return $ret;
 	}
-  
+
 	/**
 		\brief      Liste des tables dans une database.
 		\param	    database	Nom de la database
 		\return	    resource
-	*/
+		*/
 	function DDLListTables($database)
 	{
 		$this->results = mssql_list_tables($database, $this->db);
@@ -719,19 +728,19 @@ class DoliDb
 	}
 
 	/**
-	 \brief      Cr�e une table
+	 \brief      Cr�e une table
 	 \param	    table 			Nom de la table
 	 \param	    fields 			Tableau associatif [nom champ][tableau des descriptions]
 	 \param	    primary_key 	Nom du champ qui sera la clef primaire
 	 \param	    unique_keys 	Tableau associatifs Nom de champs qui seront clef unique => valeur
-	 \param	    fulltext 		Tableau des Nom de champs qui seront index�s en fulltext
-	 \param	    key 			Tableau des champs cl�s noms => valeur
+	 \param	    fulltext 		Tableau des Nom de champs qui seront index�s en fulltext
+	 \param	    key 			Tableau des champs cl�s noms => valeur
 	 \param	    type 			Type de la table
 	 \return	    int				<0 si KO, >=0 si OK
-	*/
+	 */
 	function DDLCreateTable($table,$fields,$primary_key,$type,$unique_keys="",$fulltext_keys="",$keys="")
 	{
-		// cl�s recherch�es dans le tableau des descriptions (fields) : type,value,attribute,null,default,extra
+		// cl�s recherch�es dans le tableau des descriptions (fields) : type,value,attribute,null,default,extra
 		// ex. : $fields['rowid'] = array('type'=>'int','value'=>'11','null'=>'not null','extra'=> 'auto_increment');
 		$sql = "create table ".$table."(";
 		$i=0;
@@ -752,14 +761,14 @@ class DoliDb
 			}
 			else if( eregi("^[^ ]",$field_desc['null']))
 			$sqlfields[$i]  .= " ".$field_desc['null'];
-	
+
 			else if( eregi("^[^ ]",$field_desc['extra']))
 			$sqlfields[$i]  .= " ".$field_desc['extra'];
 			$i++;
 		}
 		if($primary_key != "")
 		$pk = "primary key(".$primary_key.")";
-	
+
 		if($unique_keys != "")
 		{
 			$i = 0;
@@ -786,130 +795,130 @@ class DoliDb
 		if($keys != "")
 		$sql .= ",".implode(',',$sqlk);
 		$sql .=") type=".$type;
-	
+
 		dolibarr_syslog($sql);
 		if(! $this -> query($sql))
-			return -1;
+		return -1;
 		else
-			return 1;
+		return 1;
 	}
 
 	/**
-        \brief      d�crit une table dans une database.
+	 \brief      d�crit une table dans une database.
 		\param	    table	Nom de la table
 		\param	    field	Optionnel : Nom du champ si l'on veut la desc d'un champ
-        \return	    resource
-    */
+		\return	    resource
+		*/
 	function DDLDescTable($table,$field="")
-    {
+	{
 		$sql="DESC ".$table." ".$field;
 
 		dolibarr_syslog($sql);
 		$this->results = $this->query($sql);
 		return $this->results;
-    }
+	}
 
 	/**
-		\brief      Ins�re un nouveau champ dans une table
+		\brief      Ins�re un nouveau champ dans une table
 		\param	    table 			Nom de la table
-		\param		field_name 		Nom du champ � ins�rer
-		\param	    field_desc 		Tableau associatif de description duchamp � ins�rer[nom du param�tre][valeur du param�tre]
+		\param		field_name 		Nom du champ � ins�rer
+		\param	    field_desc 		Tableau associatif de description duchamp � ins�rer[nom du param�tre][valeur du param�tre]
 		\param	    field_position 	Optionnel ex.: "after champtruc"
 		\return	    int				<0 si KO, >0 si OK
-    */
+		*/
 	function DDLAddField($table,$field_name,$field_desc,$field_position="")
 	{
-		// cl�s recherch�es dans le tableau des descriptions (field_desc) : type,value,attribute,null,default,extra
+		// cl�s recherch�es dans le tableau des descriptions (field_desc) : type,value,attribute,null,default,extra
 		// ex. : $field_desc = array('type'=>'int','value'=>'11','null'=>'not null','extra'=> 'auto_increment');
 		$sql= "ALTER TABLE ".$table." ADD ".$field_name." ";
 		$sql .= $field_desc['type'];
 		if( eregi("^[^ ]",$field_desc['value']))
-			$sql  .= "(".$field_desc['value'].")";
+		$sql  .= "(".$field_desc['value'].")";
 		if( eregi("^[^ ]",$field_desc['attribute']))
-			$sql  .= " ".$field_desc['attribute'];
+		$sql  .= " ".$field_desc['attribute'];
 		if( eregi("^[^ ]",$field_desc['null']))
-			$sql  .= " ".$field_desc['null'];
+		$sql  .= " ".$field_desc['null'];
 		if( eregi("^[^ ]",$field_desc['default']))
-			if(eregi("null",$field_desc['default']))
-				$sql  .= " default ".$field_desc['default'];
-			else
-				$sql  .= " default '".$field_desc['default']."'";
+		if(eregi("null",$field_desc['default']))
+		$sql  .= " default ".$field_desc['default'];
+		else
+		$sql  .= " default '".$field_desc['default']."'";
 		if( eregi("^[^ ]",$field_desc['extra']))
-			$sql  .= " ".$field_desc['extra'];
+		$sql  .= " ".$field_desc['extra'];
 		$sql .= " ".$field_position;
 
 		if(! $this -> query($sql))
-			return -1;
+		return -1;
 		else
-			return 1;
+		return 1;
 	}
-	
+
 	function getDefaultCharacterSetDatabase(){
-		 /*
+		/*
 		 $resql=$this->query('SHOW VARIABLES LIKE \'character_set_database\'');
-		  if (!$resql)
-	    {
-			  return $this->forcecharset;
-	    }
-	    $liste=$this->fetch_array($resql);
-	    return $liste['Value'];
-	    */
-	    return '';
-	}
-	
+		 if (!$resql)
+		 {
+		 return $this->forcecharset;
+		 }
+		 $liste=$this->fetch_array($resql);
+		 return $liste['Value'];
+		 */
+		return '';
+	}
+
 	function getListOfCharacterSet(){
 		/*
-		$resql=$this->query('SHOW CHARSET');
-		$liste = array();
-		if ($resql) 
-		{
+		 $resql=$this->query('SHOW CHARSET');
+		 $liste = array();
+		 if ($resql)
+		 {
 			$i = 0;
 			while ($obj = $this->fetch_object($resql) )
 			{
-				$liste[$i]['charset'] = $obj->Charset;
-				$liste[$i]['description'] = $obj->Description;
-				$i++;           
-			}   
-	    	$this->free($resql);
+			$liste[$i]['charset'] = $obj->Charset;
+			$liste[$i]['description'] = $obj->Description;
+			$i++;
+			}
+			$this->free($resql);
 	  } else {
-	   		return null;
-	  	}
-    	return $liste;
-    	*/
-    	return ''; // attente d�buggage
+	  return null;
+	  }
+	  return $liste;
+	  */
+		return ''; // attente d�buggage
 	}
-	
+
 	function getDefaultCollationDatabase(){
 		$resql=$this->query("SELECT SERVERPROPERTY('collation')");
-		 if (!$resql)
-	   {
+		if (!$resql)
+		{
 			return $this->forcecollate;
-	   }
-	   $liste=$this->fetch_array($resql);
-	   return $liste['computed'];
+		}
+		$liste=$this->fetch_array($resql);
+		return $liste['computed'];
 	}
-	
+
 	function getListOfCollation(){
 		/*
-		$resql=$this->query('SHOW COLLATION');
-		$liste = array();
-		if ($resql) 
+		 $resql=$this->query('SHOW COLLATION');
+		 $liste = array();
+		 if ($resql)
 			{
 			$i = 0;
 			while ($obj = $this->fetch_object($resql) )
 			{
-				$liste[$i]['collation'] = $obj->Collation;
-				$i++;           
-			}   
-	    	$this->free($resql);
-	  	} else {
-	   		return null;
-	  	}
-    	return $liste;
-    	*/
-    	return ''; // attente d�bugage
-	}
-	
+			$liste[$i]['collation'] = $obj->Collation;
+			$i++;
+			}
+			$this->free($resql);
+			} else {
+			return null;
+			}
+			return $liste;
+			*/
+		return ''; // attente d�bugage
+	}
+
 }
 
 ?>
diff --git a/htdocs/lib/databases/mysql.lib.php b/htdocs/lib/databases/mysql.lib.php
index 29f3e7a95372e542f585f5f705c29157cef16370..1eae22088ec59858f885a20a476425e08096f214 100644
--- a/htdocs/lib/databases/mysql.lib.php
+++ b/htdocs/lib/databases/mysql.lib.php
@@ -21,112 +21,70 @@
  */
 
 /**
-		\file       	htdocs/lib/databases/mysql.lib.php
-		\brief      	Fichier de la classe permettant de g�rer une base mysql
-		\version		$Id$
-*/
-// Pour compatibilit� lors de l'upgrade
+ \file       	htdocs/lib/databases/mysql.lib.php
+ \brief      	Fichier de la classe permettant de g�rer une base mysql
+ \version		$Id$
+ */
+// For compatibility during upgrade
 if (! defined('DOL_DOCUMENT_ROOT'))	 define('DOL_DOCUMENT_ROOT', '../..');
 if (! defined('ADODB_DATE_VERSION')) include_once(DOL_DOCUMENT_ROOT."/includes/adodbtime/adodb-time.inc.php");
 
 
 /**
-		\class      DoliDb
-		\brief      Classe de gestion de la database de dolibarr
-*/
+ \class      DoliDb
+ \brief      Classe de gestion de la database de dolibarr
+ */
 class DoliDb
 {
-  //! Handler de base
-  var $db;
-  //! Nom du gestionnaire
-  var $type='mysql';          
-  //! Charset
-  var $forcecharset='latin1';
-  //! Collate
-  var $forcecollate='latin1_swedish_ci';
-  //! Version min database
-  var $versionmin=array(3,1,0);	
-  //! Resultset de la derni�re requete  
-  var $results;
-  //! 1 si connect�, 0 sinon  
-  var $connected;             
-  //! 1 si base s�lectionn�, 0 sinon
-  var $database_selected; 
-  //! Nom base s�lectionn�e
-  var $database_name;
-    //! Nom user base
-  var $database_user;		
-  //! 1 si une transaction est en cours, 0 sinon
-  var $transaction_opened;	
-  //! Derniere requete ex�cut�e
-  var $lastquery;			
-  //! Derniere requete ex�cut�e avec echec
-  var $lastqueryerror;		
-  //! Message erreur mysql
-  var $lasterror;		
-  //! Message erreur mysql
-  var $lasterrno;
-  
-  var $ok;
-  var $error;
-
-
-  // Constantes pour conversion code erreur MySql en code erreur g�n�rique
-  var $errorcode_map = array(
-			     1004 => 'DB_ERROR_CANNOT_CREATE',
-			     1005 => 'DB_ERROR_CANNOT_CREATE',
-			     1006 => 'DB_ERROR_CANNOT_CREATE',
-			     1007 => 'DB_ERROR_ALREADY_EXISTS',
-			     1008 => 'DB_ERROR_CANNOT_DROP',
-			     1025 => 'DB_ERROR_NO_FOREIGN_KEY_TO_DROP',
-			     1044 => 'DB_ERROR_ACCESSDENIED',
-			     1046 => 'DB_ERROR_NODBSELECTED',
-			     1048 => 'DB_ERROR_CONSTRAINT',
-			     1050 => 'DB_ERROR_TABLE_ALREADY_EXISTS',
-			     1051 => 'DB_ERROR_NOSUCHTABLE',
-			     1054 => 'DB_ERROR_NOSUCHFIELD',
-			     1060 => 'DB_ERROR_COLUMN_ALREADY_EXISTS',
-			     1061 => 'DB_ERROR_KEY_NAME_ALREADY_EXISTS',
-			     1062 => 'DB_ERROR_RECORD_ALREADY_EXISTS',
-			     1064 => 'DB_ERROR_SYNTAX',
-			     1068 => 'DB_ERROR_PRIMARY_KEY_ALREADY_EXISTS',
-			     1075 => 'DB_ERROR_CANT_DROP_PRIMARY_KEY',
-			     1091 => 'DB_ERROR_NOSUCHFIELD',
-			     1100 => 'DB_ERROR_NOT_LOCKED',
-			     1136 => 'DB_ERROR_VALUE_COUNT_ON_ROW',
-			     1146 => 'DB_ERROR_NOSUCHTABLE',
-			     1216 => 'DB_ERROR_NO_PARENT',
-			     1217 => 'DB_ERROR_CHILD_EXISTS',
-			     1451 => 'DB_ERROR_CHILD_EXISTS'
-			     );
-  
-  
-  /**
-     \brief      Ouverture d'une connexion vers le serveur et �ventuellement une database.
-     \param      type		Type de base de donn�es (mysql ou pgsql)
-     \param	    host		Addresse de la base de donn�es
-     \param	    user		Nom de l'utilisateur autoris�
-     \param	    pass		Mot de passe
-     \param	    name		Nom de la database
-     \param	    port		Port of database server
-     \return     int			1 en cas de succ�s, 0 sinon
-  */
+	//! Handler de base
+	var $db;
+	//! Nom du gestionnaire
+	var $type='mysql';
+	//! Charset
+	var $forcecharset='latin1';
+	//! Collate
+	var $forcecollate='latin1_swedish_ci';
+	//! Version min database
+	var $versionmin=array(3,1,0);
+	//! Resultset of last request
+	var $results;
+	//! 1 si connect�, 0 sinon  
+	var $connected;
+	//! 1 si base s�lectionn�, 0 sinon
+	var $database_selected;
+	//! Nom base s�lectionn�e
+	var $database_name;
+	//! Nom user base
+	var $database_user;
+	//! 1 si une transaction est en cours, 0 sinon
+	var $transaction_opened;
+	//! Derniere requete ex�cut�e
+	var $lastquery;
+	//! Derniere requete ex�cut�e avec echec
+	var $lastqueryerror;
+	//! Message erreur mysql
+	var $lasterror;
+	//! Message erreur mysql
+	var $lasterrno;
+
+	var $ok;
+	var $error;
+
+
+	/**
+	 \brief      Ouverture d'une connexion vers le serveur et �ventuellement une database.
+	 \param      type		Type de base de donn�es (mysql ou pgsql)
+	 \param	    host		Addresse de la base de donn�es
+	 \param	    user		Nom de l'utilisateur autoris�
+	 \param	    pass		Mot de passe
+	 \param	    name		Nom de la database
+	 \param	    port		Port of database server
+	 \return     int			1 en cas de succ�s, 0 sinon
+  	*/
 	function DoliDb($type='mysql', $host, $user, $pass, $name='', $port=0)
 	{
 		global $conf,$langs;
 
-		/* Ce test est inutile. En effet, si DOL_DOCUMENT_ROOT est d�fini, cela signifie      */
-		/* obligatoirement que le fichier conf a deja �t� charg�e puisque cette constante est */
-		/* definie a partir du contenu du fichier conf.php                                    */
-		/* Et toutes les infos sont charg�s dans l'objet conf                                 */
-		/*
-			if (file_exists($conffile)) {
-				include($conffile);
-				$this->forcecharset=$character_set_database;
-				$this->forcecollate=$dolibarr_main_db_collation;
-				$this->db_user=$dolibarr_main_db_user;
-			}
-			*/
 		if (isset($conf->db->character_set) && $conf->db->character_set) {
 			$this->forcecharset=$conf->db->character_set;
 		}
@@ -136,7 +94,7 @@ class DoliDb
 		$this->database_user=$user;
 
 		$this->transaction_opened=0;
-		
+
 		if (! function_exists("mysql_connect"))
 		{
 			$this->connected = 0;
@@ -145,7 +103,7 @@ class DoliDb
 			dolibarr_syslog("DoliDB::DoliDB : Mysql PHP functions for using Mysql driver are not available in this version of PHP",LOG_ERR);
 			return $this->ok;
 		}
-		
+
 		if (! $host)
 		{
 			$this->connected = 0;
@@ -171,7 +129,7 @@ class DoliDb
 			dolibarr_syslog("DoliDB::DoliDB : Erreur Connect mysql_error=".$this->error,LOG_ERR);
 		}
 
-		// Si connexion serveur ok et si connexion base demand�e, on essaie connexion base
+		// Si connexion serveur ok et si connexion base demand�e, on essaie connexion base
 		if ($this->connected && $name)
 		{
 			if ($this->select_db($name))
@@ -180,12 +138,12 @@ class DoliDb
 				$this->database_name = $name;
 				$this->ok = 1;
 
-				// Si client connect� avec charset different de celui de la base Dolibarr
-				// (La base Dolibarr a �t� forc�e en this->forcecharset � l'install)
+				// Si client connect� avec charset different de celui de la base Dolibarr
+				// (La base Dolibarr a �t� forc�e en this->forcecharset � l'install)
 				/*if (mysql_client_encoding ( $this->db ) != $this->getDefaultCharacterSetDatabase())
 				{
-					$this->query("SET NAMES '".$this->forcecharset."'", $this->db);
-					$this->query("SET CHARACTER SET ". $this->forcecharset);
+				$this->query("SET NAMES '".$this->forcecharset."'", $this->db);
+				$this->query("SET CHARACTER SET ". $this->forcecharset);
 				}*/
 			}
 			else
@@ -199,19 +157,29 @@ class DoliDb
 		}
 		else
 		{
-			// Pas de selection de base demand�e, ok ou ko
+			// Pas de selection de base demandee, ok ou ko
 			$this->database_selected = 0;
 		}
-		
+
 		return $this->ok;
 	}
-  
+
+
+	/**
+	 *	\brief		Convert a SQL request in mysql syntax to database syntax
+	 * 	\param		request		SQL request to convert
+	 * 	\return		string		SQL request converted
+	 */
+	function convertSQLFromMysql($request)
+	{
+		return $request;
+	}
 
 	/**
 		\brief      Selectionne une database.
 		\param	    database		Nom de la database
 		\return	    boolean         true si ok, false si ko
-	*/
+		*/
 	function select_db($database)
 	{
 		return mysql_select_db($database, $this->db);
@@ -219,27 +187,27 @@ class DoliDb
 
 	/**
 		\brief		Connection vers le serveur
-		\param	    host		addresse de la base de donn�es
-		\param	    login		nom de l'utilisateur autoris�
+		\param	    host		addresse de la base de donn�es
+		\param	    login		nom de l'utilisateur autoris�
 		\param	    passwd		mot de passe
 		\param		name		nom de la database (ne sert pas sous mysql, sert sous pgsql)
 		\param		port		Port of database server
-		\return		resource	Handler d'acc�s � la base
+		\return		resource	Handler d'acc�s � la bas
 		\seealso	close
-	*/
+		*/
 	function connect($host, $login, $passwd, $name, $port=0)
 	{
 		dolibarr_syslog("DoliDB::connect host=$host, port=$port, login=$login, passwd=--hidden--, name=$name",LOG_DEBUG);
 
 		$newhost=$host;
-		
+
 		// With mysql, port must be in hostname
 		if ($port) $newhost.=':'.$port;
 
 		$this->db  = @mysql_connect($newhost, $login, $passwd);
-		//force les enregistrement en latin1 si la base est en utf8 par d�faut
-		// Supprim� car plante sur mon PHP-Mysql. De plus, la base est forcement en latin1 avec
-		// les nouvelles version de Dolibarr car forc� par l'install Dolibarr.
+		//force les enregistrement en latin1 si la base est en utf8 par d�faut
+		// Supprim� car plante sur mon PHP-Mysql. De plus, la base est forcement en latin1 avec
+		// les nouvelles version de Dolibarr car forc� par l'install Dolibarr.
 		if ($this->db)
 		{
 			$this->query("SET NAMES '".$this->forcecharset."'", $this->db);
@@ -248,65 +216,65 @@ class DoliDb
 		//print "Resultat fonction connect: ".$this->db;
 		return $this->db;
 	}
-    
+
 	/**
 		\brief          Renvoie la version du serveur
 		\return	        string      Chaine version
-	*/
+		*/
 	function getVersion()
 	{
 		return mysql_get_server_info($this->db);
 	}
 
-    /**
-     \brief          Renvoie la version du serveur sous forme de nombre
-     \return	        string      Chaine version
-	  */
-	  function getIntVersion()
-	  {
-			$version=	$this->getVersion();
-			$vlist=split('[.-]',$version);
-			if (strlen($vlist[1])==1){
-				$vlist[1]="0".$vlist[1];
-			}
-			if (strlen($vlist[2])==1){
-				$vlist[2]="0".$vlist[2];
-			}
-			return $vlist[0].$vlist[1].$vlist[2];
-	  }
-  
-  
-  /**
-     \brief          Renvoie la version du serveur dans un tableau
-     \return	        array  		Tableau de chaque niveau de version
+	/**
+	 \brief          Renvoie la version du serveur sous forme de nombre
+	 \return	        string      Chaine version
+	 */
+	function getIntVersion()
+	{
+		$version=	$this->getVersion();
+		$vlist=split('[.-]',$version);
+		if (strlen($vlist[1])==1){
+			$vlist[1]="0".$vlist[1];
+		}
+		if (strlen($vlist[2])==1){
+			$vlist[2]="0".$vlist[2];
+		}
+		return $vlist[0].$vlist[1].$vlist[2];
+	}
+
+
+	/**
+	 \brief          Renvoie la version du serveur dans un tableau
+	 \return	        array  		Tableau de chaque niveau de version
   */
-  function getVersionArray()
-  {
-    return split('\.',$this->getVersion());
-  }
-  
-    
-  /**
-     \brief      Fermeture d'une connexion vers une database.
-     \return	    resource
-     \seealso	connect
+	function getVersionArray()
+	{
+		return split('\.',$this->getVersion());
+	}
+
+
+	/**
+	 \brief      Fermeture d'une connexion vers une database.
+	 \return	    resource
+	 \seealso	connect
   */
-  function close()
-  {
-    return mysql_close($this->db);
-  }
-  
-
-  /**
-     \brief      Debut d'une transaction.
-     \return	    int         1 si ouverture transaction ok ou deja ouverte, 0 en cas d'erreur
+	function close()
+	{
+		return mysql_close($this->db);
+	}
+
+
+	/**
+	 \brief      Debut d'une transaction.
+	 \return	    int         1 si ouverture transaction ok ou deja ouverte, 0 en cas d'erreur
   */
 	function begin()
 	{
 		if (! $this->transaction_opened)
 		{
 			$ret=$this->query("BEGIN");
-            if ($ret)
+			if ($ret)
 			{
 				$this->transaction_opened++;
 				dolibarr_syslog("BEGIN Transaction",LOG_DEBUG);
@@ -323,13 +291,13 @@ class DoliDb
 	/**
 		\brief      Validation d'une transaction
 		\return	    int         1 si validation ok ou niveau de transaction non ouverte, 0 en cas d'erreur
-	*/
+		*/
 	function commit()
 	{
 		if ($this->transaction_opened<=1)
 		{
 			$ret=$this->query("COMMIT");
-			if ($ret) 
+			if ($ret)
 			{
 				$this->transaction_opened=0;
 				dolibarr_syslog("COMMIT Transaction",LOG_DEBUG);
@@ -342,13 +310,13 @@ class DoliDb
 			return 1;
 		}
 	}
-  
+
 	/**
 		\brief      Annulation d'une transaction et retour aux anciennes valeurs
 		\return	    int         1 si annulation ok ou transaction non ouverte, 0 en cas d'erreur
-	*/
+		*/
 	function rollback()
-	{    
+	{
 		if ($this->transaction_opened<=1)
 		{
 			$ret=$this->query("ROLLBACK");
@@ -362,26 +330,26 @@ class DoliDb
 			return 1;
 		}
 	}
-  
+
 	/**
-		\brief      Effectue une requete et renvoi le resultset de r�ponse de la base
+		\brief      Effectue une requete et renvoi le resultset de r�ponse de la base
 		\param	    query	    Contenu de la query
 		\return	    resource    Resultset de la reponse
-	*/
+		*/
 	function query($query)
 	{
 		$query = trim($query);
-		
+
 		if (! $this->database_name)
 		{
-			// Ordre SQL ne n�cessitant pas de connexion � une base (exemple: CREATE DATABASE)
+			// Ordre SQL ne n�cessitant pas de connexion � une base (exemple: CREATE DATABASE)
 			$ret = mysql_query($query, $this->db);
 		}
 		else
 		{
 			$ret = mysql_db_query($this->database_name, $query, $this->db);
 		}
-		
+
 		if (! eregi("^COMMIT",$query) && ! eregi("^ROLLBACK",$query))
 		{
 			// Si requete utilisateur, on la sauvegarde ainsi que son resultset
@@ -394,113 +362,113 @@ class DoliDb
 			$this->lastquery=$query;
 			$this->results = $ret;
 		}
-		
+
 		return $ret;
 	}
 
-    /**
-        \brief      Renvoie la ligne courante (comme un objet) pour le curseur resultset.
-        \param      resultset   Curseur de la requete voulue
-        \return	    resource
-    */
-    function fetch_object($resultset=0)
-    {
-    	// Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
-        if (! is_resource($resultset)) { $resultset=$this->results; }
-        return mysql_fetch_object($resultset);
-    }
-
-    /**
-        \brief      Renvoie les donn�es dans un tableau.
-        \param      resultset   Curseur de la requete voulue
-        \return	    array
-    */
-    function fetch_array($resultset=0)
-    {
-        // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
-        if (! is_resource($resultset)) { $resultset=$this->results; }
-        return mysql_fetch_array($resultset);
-    }
-
-
-    /**
-        \brief      Renvoie les donn�es comme un tableau.
-        \param      resultset   Curseur de la requete voulue
-        \return	    array
-    */
-    function fetch_row($resultset=0)
-    {
-        // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
-        if (! is_resource($resultset)) { $resultset=$this->results; }
-        return @mysql_fetch_row($resultset);
-    }
-
-    /**
-        \brief      Renvoie le nombre de lignes dans le resultat d'une requete SELECT
-        \see    	affected_rows
-        \param      resultset   Curseur de la requete voulue
-        \return     int		    Nombre de lignes
-    */
-    function num_rows($resultset=0)
-    {
-        // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
-        if (! is_resource($resultset)) { $resultset=$this->results; }
-        return mysql_num_rows($resultset);
-    }
-    
-    /**
-        \brief      Renvoie le nombre de lignes dans le resultat d'une requete INSERT, DELETE ou UPDATE
-        \see    	num_rows
-        \param      resultset   Curseur de la requete voulue
-        \return     int		    Nombre de lignes
-    */
-    function affected_rows($resultset=0)
-    {
-        // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
-        if (! is_resource($resultset)) { $resultset=$this->results; }
-        // mysql necessite un link de base pour cette fonction contrairement
-        // a pqsql qui prend un resultset
-        return mysql_affected_rows($this->db);
-    }
-
-
-    /**
-        \brief      Lib�re le dernier resultset utilis� sur cette connexion.
-        \param      resultset   Curseur de la requete voulue
-    */
-    function free($resultset=0)
-    {
-        // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
-        if (! is_resource($resultset)) { $resultset=$this->results; }
-        // Si resultset en est un, on libere la m�moire
-        if (is_resource($resultset)) mysql_free_result($resultset);
-    }
-
-
-    /**
-        \brief      D�fini les limites de la requ�te.
-        \param	    limit       nombre maximum de lignes retourn�es
-        \param	    offset      num�ro de la ligne � partir de laquelle recup�rer les lignes
-        \return	    string      chaine exprimant la syntax sql de la limite
-    */
-    function plimit($limit=0,$offset=0)
-    {
-        global $conf;
-        if (! $limit) $limit=$conf->liste_limit;
-        if ($offset > 0) return " LIMIT $offset,$limit ";
-        else return " LIMIT $limit ";
-    }
-
-
-	/**
-        \brief      D�fini le tri de la requ�te.
-        \param	    sortfield   liste des champ de tri
-        \param	    sortorder   ordre du tri
-        \return	    string      chaine exprimant la syntax sql de l'ordre de tri
+	/**
+	 \brief      Renvoie la ligne courante (comme un objet) pour le curseur resultset.
+	 \param      resultset   Curseur de la requete voulue
+	 \return	    resource
+	 */
+	function fetch_object($resultset=0)
+	{
+		// Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
+		if (! is_resource($resultset)) { $resultset=$this->results; }
+		return mysql_fetch_object($resultset);
+	}
+
+	/**
+	 \brief      Renvoie les donn�es dans un tableau.
+	 \param      resultset   Curseur de la requete voulue
+	 \return	    array
+	 */
+	function fetch_array($resultset=0)
+	{
+		// Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
+		if (! is_resource($resultset)) { $resultset=$this->results; }
+		return mysql_fetch_array($resultset);
+	}
+
+
+	/**
+	 \brief      Renvoie les donn�es comme un tableau.
+	 \param      resultset   Curseur de la requete voulue
+	 \return	    array
+	 */
+	function fetch_row($resultset=0)
+	{
+		// Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
+		if (! is_resource($resultset)) { $resultset=$this->results; }
+		return @mysql_fetch_row($resultset);
+	}
+
+	/**
+	 \brief      Renvoie le nombre de lignes dans le resultat d'une requete SELECT
+	 \see    	affected_rows
+	 \param      resultset   Curseur de la requete voulue
+	 \return     int		    Nombre de lignes
+	 */
+	function num_rows($resultset=0)
+	{
+		// Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
+		if (! is_resource($resultset)) { $resultset=$this->results; }
+		return mysql_num_rows($resultset);
+	}
+
+	/**
+	 \brief      Renvoie le nombre de lignes dans le resultat d'une requete INSERT, DELETE ou UPDATE
+	 \see    	num_rows
+	 \param      resultset   Curseur de la requete voulue
+	 \return     int		    Nombre de lignes
+	 */
+	function affected_rows($resultset=0)
+	{
+		// Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
+		if (! is_resource($resultset)) { $resultset=$this->results; }
+		// mysql necessite un link de base pour cette fonction contrairement
+		// a pqsql qui prend un resultset
+		return mysql_affected_rows($this->db);
+	}
+
+
+	/**
+	 \brief      Lib�re le dernier resultset utilis� sur cette connexion.
+	 \param      resultset   Curseur de la requete voulue
+	 */
+	function free($resultset=0)
+	{
+		// Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
+		if (! is_resource($resultset)) { $resultset=$this->results; }
+		// Si resultset en est un, on libere la m�moire
+		if (is_resource($resultset)) mysql_free_result($resultset);
+	}
+
+
+	/**
+	 \brief      D�fini les limites de la requ�te.
+	 \param	    limit       nombre maximum de lignes retourn�es
+	 \param	    offset      num�ro de la ligne � partir de laquelle recup�rer les ligne
+	 \return	    string      chaine exprimant la syntax sql de la limite
+	 */
+	function plimit($limit=0,$offset=0)
+	{
+		global $conf;
+		if (! $limit) $limit=$conf->liste_limit;
+		if ($offset > 0) return " LIMIT $offset,$limit ";
+		else return " LIMIT $limit ";
+	}
+
+
+	/**
+	 \brief      D�fini le tri de la requ�te.
+	 \param	    sortfield   liste des champ de tri
+	 \param	    sortorder   ordre du tri
+	 \return	    string      chaine exprimant la syntax sql de l'ordre de tri
 		\TODO		A mutualiser dans classe mere
-    */
-    function order($sortfield=0,$sortorder=0)
-    {
+		*/
+	function order($sortfield=0,$sortorder=0)
+	{
 		if ($sortfield)
 		{
 			$return='';
@@ -509,7 +477,7 @@ class DoliDb
 			{
 				if (! $return) $return.=' ORDER BY ';
 				else $return.=',';
-				
+
 				$return.=$val;
 				if ($sortorder) $return.=' '.$sortorder;
 			}
@@ -519,138 +487,168 @@ class DoliDb
 		{
 			return '';
 		}
-    }
-	
-	
+	}
+
+
 	/**
-        \brief      Escape a string to insert data.
-        \param	    stringtoencode		String to escape
-        \return	    string				String escaped
-    */
-    function escape($stringtoencode)
+	 \brief      Escape a string to insert data.
+	 \param	    stringtoencode		String to escape
+	 \return	    string				String escaped
+	 */
+	function escape($stringtoencode)
 	{
 		return addslashes($stringtoencode);
 	}
 
-	
-	/**
-    *   \brief      Formatage (par la base de donn�es) d'un champ de la base au format TMS ou Date (YYYY-MM-DD HH:MM:SS)
-    *               afin de retourner une donn�e toujours au format universel date TMS unix.
-    *               Fonction � utiliser pour g�n�rer les SELECT.
-    *   \param	    param       Nom champ base de type date ou chaine 'YYYY-MM-DD HH:MM:SS'
-    *   \return	    date        Date au format TMS.
-	*	\TODO		Remove unix_timestamp functions
-    */
-    function pdate($param)
-    {
-        return "unix_timestamp(".$param.")";
-    }
-
-    /**
-     *   \brief     Formatage (par PHP) d'une date vers format texte pour insertion dans champ date.
-     *              Fonction � utiliser pour g�n�rer les INSERT, UPDATE ou les clauses WHERE.
-     *   \param	    param       Date TMS � convertir
-     *   \return	date        Date au format texte YYYYMMDDHHMMSS.
-     */
-    function idate($param)
-    {
-        return adodb_strftime("%Y%m%d%H%M%S",$param);
-    }
-
-
-    /**
-        \brief      Formatage d'un if SQL
-        \param		test            chaine test
-        \param		resok           resultat si test egal
-        \param		resko           resultat si test non egal
-        \return		string          chaine format� SQL
-    */
-    function ifsql($test,$resok,$resko)
-    {
-        return 'IF('.$test.','.$resok.','.$resko.')';
-    }
-
-
-    /**
-        \brief      Renvoie la derniere requete soumise par la methode query()
-        \return	    lastquery
-    */
-    function lastquery()
-    {
-        return $this->lastquery;
-    }
-
-    /**
-        \brief      Renvoie la derniere requete en erreur
-        \return	    string	lastqueryerror
-    */
+
+	/**
+	 *   \brief      Formatage (par la base de donn�es) d'un champ de la base au format TMS ou Date (YYYY-MM-DD HH:MM:SS)
+	 *               afin de retourner une donn�e toujours au format universel date TMS unix.
+	 *               Fonction � utiliser pour g�n�rer les SELECT.
+	 *   \param	    param       Nom champ base de type date ou chaine 'YYYY-MM-DD HH:MM:SS'
+	 *   \return	    date        Date au format TMS.
+	 *	\TODO		Remove unix_timestamp functions
+	 */
+	function pdate($param)
+	{
+		return "unix_timestamp(".$param.")";
+	}
+
+	/**
+	 *   \brief     Formatage (par PHP) d'une date vers format texte pour insertion dans champ date.
+	 *              Fonction � utiliser pour g�n�rer les INSERT, UPDATE ou les clauses WHERE
+	 *   \param	    param       Date TMS � convertir
+	 *   \return	date        Date au format texte YYYYMMDDHHMMSS.
+	 */
+	function idate($param)
+	{
+		return adodb_strftime("%Y%m%d%H%M%S",$param);
+	}
+
+
+	/**
+	 \brief      Formatage d'un if SQL
+	 \param		test            chaine test
+	 \param		resok           resultat si test egal
+	 \param		resko           resultat si test non egal
+	 \return		string          chaine format� SQL
+	 */
+	function ifsql($test,$resok,$resko)
+	{
+		return 'IF('.$test.','.$resok.','.$resko.')';
+	}
+
+
+	/**
+	 \brief      Renvoie la derniere requete soumise par la methode query()
+	 \return	    lastquery
+	 */
+	function lastquery()
+	{
+		return $this->lastquery;
+	}
+
+	/**
+	 \brief      Renvoie la derniere requete en erreur
+	 \return	    string	lastqueryerror
+	 */
 	function lastqueryerror()
 	{
 		return $this->lastqueryerror;
 	}
 
-    /**
-        \brief      Renvoie le libelle derniere erreur
-        \return	    string	lasterror
-    */
+	/**
+	 \brief      Renvoie le libelle derniere erreur
+	 \return	    string	lasterror
+	 */
 	function lasterror()
 	{
 		return $this->lasterror;
 	}
 
-    /**
-        \brief      Renvoie le code derniere erreur
-        \return	    string	lasterrno
-    */
+	/**
+	 \brief      Renvoie le code derniere erreur
+	 \return	    string	lasterrno
+	 */
 	function lasterrno()
 	{
 		return $this->lasterrno;
 	}
 
-    /**
-        \brief     Renvoie le code erreur generique de l'operation precedente.
-        \return    error_num       (Exemples: DB_ERROR_TABLE_ALREADY_EXISTS, DB_ERROR_RECORD_ALREADY_EXISTS...)
-    */
-    function errno()
-    {
-        if (! $this->connected) {
-            // Si il y a eu echec de connexion, $this->db n'est pas valide.
-            return 'DB_ERROR_FAILED_TO_CONNECT';
-        }
-        else {
-            if (isset($this->errorcode_map[mysql_errno($this->db)])) {
-                return $this->errorcode_map[mysql_errno($this->db)];
-            }
-            $errno=mysql_errno($this->db);
-            return ($errno?'DB_ERROR_'.$errno:'0');
-        }
-    }
-
-    /**
-        \brief     Renvoie le texte de l'erreur mysql de l'operation precedente.
-        \return    error_text
-    */
-    function error()
-    {
-        if (! $this->connected) {
-            // Si il y a eu echec de connexion, $this->db n'est pas valide pour mysql_error.
-            return 'Not connected. Check setup parameters in conf/conf.php file and your mysql client and server versions';
-        }
-        else {
-            return mysql_error($this->db);
-        }
-    }
-
-    /**
-        \brief     R�cup�re l'id gen�r� par le dernier INSERT.
-        \param     tab     Nom de la table concern�e par l'insert. Ne sert pas sous MySql mais requis pour compatibilit� avec Postgresql
-        \return    int     id
-    */
-    function last_insert_id($tab)
-    {
-        return mysql_insert_id($this->db);
-    }    
-    
+	/**
+	 \brief     Renvoie le code erreur generique de l'operation precedente.
+	 \return    error_num       (Exemples: DB_ERROR_TABLE_ALREADY_EXISTS, DB_ERROR_RECORD_ALREADY_EXISTS...)
+	 */
+	function errno()
+	{
+		if (! $this->connected) {
+			// Si il y a eu echec de connexion, $this->db n'est pas valide.
+			return 'DB_ERROR_FAILED_TO_CONNECT';
+		}
+		else {
+			// Constants to convert a MySql error code to a generic Dolibarr error code
+			$errorcode_map = array(
+			1004 => 'DB_ERROR_CANNOT_CREATE',
+			1005 => 'DB_ERROR_CANNOT_CREATE',
+			1006 => 'DB_ERROR_CANNOT_CREATE',
+			1007 => 'DB_ERROR_ALREADY_EXISTS',
+			1008 => 'DB_ERROR_CANNOT_DROP',
+			1025 => 'DB_ERROR_NO_FOREIGN_KEY_TO_DROP',
+			1044 => 'DB_ERROR_ACCESSDENIED',
+			1046 => 'DB_ERROR_NODBSELECTED',
+			1048 => 'DB_ERROR_CONSTRAINT',
+			1050 => 'DB_ERROR_TABLE_ALREADY_EXISTS',
+			1051 => 'DB_ERROR_NOSUCHTABLE',
+			1054 => 'DB_ERROR_NOSUCHFIELD',
+			1060 => 'DB_ERROR_COLUMN_ALREADY_EXISTS',
+			1061 => 'DB_ERROR_KEY_NAME_ALREADY_EXISTS',
+			1062 => 'DB_ERROR_RECORD_ALREADY_EXISTS',
+			1064 => 'DB_ERROR_SYNTAX',
+			1068 => 'DB_ERROR_PRIMARY_KEY_ALREADY_EXISTS',
+			1075 => 'DB_ERROR_CANT_DROP_PRIMARY_KEY',
+			1091 => 'DB_ERROR_NOSUCHFIELD',
+			1100 => 'DB_ERROR_NOT_LOCKED',
+			1136 => 'DB_ERROR_VALUE_COUNT_ON_ROW',
+			1146 => 'DB_ERROR_NOSUCHTABLE',
+			1216 => 'DB_ERROR_NO_PARENT',
+			1217 => 'DB_ERROR_CHILD_EXISTS',
+			1451 => 'DB_ERROR_CHILD_EXISTS'
+		     );
+			
+			if (isset($this->errorcode_map[mysql_errno($this->db)]))
+			{
+				return $this->errorcode_map[mysql_errno($this->db)];
+			}
+			$errno=mysql_errno($this->db);
+			return ($errno?'DB_ERROR_'.$errno:'0');
+		}
+	}
+
+	/**
+	 \brief     Renvoie le texte de l'erreur mysql de l'operation precedente.
+	 \return    error_text
+	 */
+	function error()
+	{
+		if (! $this->connected) {
+			// Si il y a eu echec de connexion, $this->db n'est pas valide pour mysql_error.
+			return 'Not connected. Check setup parameters in conf/conf.php file and your mysql client and server versions';
+		}
+		else {
+			return mysql_error($this->db);
+		}
+	}
+
+	/**
+	 \brief     R�cup�re l'id gen�r� par le dernier INSERT.
+	 \param     tab     Nom de la table concern�e par l'insert. Ne sert pas sous MySql mais requis pour compatibilit� avec Postgresql
+	 \return    int     id
+	 */
+	function last_insert_id($tab)
+	{
+		return mysql_insert_id($this->db);
+	}
+
 
 
 	// Next function are not required. Only minor features use them.
@@ -661,7 +659,7 @@ class DoliDb
 	/**
 		\brief          Renvoie l'id de la connexion
 		\return	        string      Id connexion
-	*/
+		*/
 	function DDLGetConnectId()
 	{
 		$resql=$this->query('SELECT CONNECTION_ID()');
@@ -671,12 +669,12 @@ class DoliDb
 
 
 	/**
-		\brief          Cr�ation d'une nouvelle base de donn�e
-		\param	        database		nom de la database � cr�er
-		\return	        resource		resource d�finie si ok, null si ko
+		\brief          Cr�ation d'une nouvelle base de donn�e
+		\param	        database		nom de la database � cr�er
+		\return	        resource		resource d�finie si ok, null si k
 		\remarks        Ne pas utiliser les fonctions xxx_create_db (xxx=mysql, ...) car elles sont deprecated
 		On force creation de la base avec le charset forcecharset
-	*/
+		*/
 	function DDLCreateDb($database)
 	{
 		// ALTER DATABASE dolibarr_db DEFAULT CHARACTER SET latin DEFAULT COLLATE latin1_swedish_ci
@@ -685,23 +683,23 @@ class DoliDb
 		$ret=$this->query($sql);
 		if (! $ret)
 		{
-			// On r�essaie pour compatibilit� avec Mysql < 4.1.1
+			// On r�essaie pour compatibilit� avec Mysql < 4.1.1
 			$sql = 'CREATE DATABASE '.$database;
 			$ret=$this->query($sql);
 		}
 		return $ret;
 	}
-  
+
 	/**
 		\brief     	Liste des tables dans une database.
 		\param	    database		Nom de la database
-		\param	    table   		Filtre sur tables � rechercher
+		\param	    table   		Filtre sur tables � rechercher
 		\return	    array			Tableau des tables de la base
-	*/
-    function DDLListTables($database, $table='')
-    {
+		*/
+	function DDLListTables($database, $table='')
+	{
 		$listtables=array();
-		
+
 		$like = '';
 		if ($table) $like = "LIKE '".$table."'";
 		$sql="SHOW TABLES FROM ".$database." ".$like.";";
@@ -712,22 +710,22 @@ class DoliDb
 			$listtables[] = $row[0];
 		}
 		return $listtables;
-    }
-  
-	/**
-     \brief      Cr�e une table
-     \param	    table 			Nom de la table
-     \param	    fields 			Tableau associatif [nom champ][tableau des descriptions]
-     \param	    primary_key 	Nom du champ qui sera la clef primaire
-     \param	    unique_keys 	Tableau associatifs Nom de champs qui seront clef unique => valeur
-     \param	    fulltext 		Tableau des Nom de champs qui seront index�s en fulltext
-     \param	    key 			Tableau des champs cl�s noms => valeur
-     \param	    type 			Type de la table
-     \return	    int				<0 si KO, >=0 si OK
-	*/
+	}
+
+	/**
+	 \brief      Cr�e une table
+	 \param	    table 			Nom de la table
+	 \param	    fields 			Tableau associatif [nom champ][tableau des descriptions]
+	 \param	    primary_key 	Nom du champ qui sera la clef primaire
+	 \param	    unique_keys 	Tableau associatifs Nom de champs qui seront clef unique => valeur
+	 \param	    fulltext 		Tableau des Nom de champs qui seront index�s en fulltext
+	 \param	    key 			Tableau des champs cl�s noms => valeur
+	 \param	    type 			Type de la table
+	 \return	    int				<0 si KO, >=0 si OK
+	 */
 	function DDLCreateTable($table,$fields,$primary_key,$type,$unique_keys="",$fulltext_keys="",$keys="")
 	{
-		// cl�s recherch�es dans le tableau des descriptions (fields) : type,value,attribute,null,default,extra
+		// cl�s recherch�es dans le tableau des descriptions (fields) : type,value,attribute,null,default,extra
 		// ex. : $fields['rowid'] = array('type'=>'int','value'=>'11','null'=>'not null','extra'=> 'auto_increment');
 		$sql = "create table ".$table."(";
 		$i=0;
@@ -748,14 +746,14 @@ class DoliDb
 			}
 			else if( eregi("^[^ ]",$field_desc['null']))
 			$sqlfields[$i]  .= " ".$field_desc['null'];
-	
+
 			else if( eregi("^[^ ]",$field_desc['extra']))
 			$sqlfields[$i]  .= " ".$field_desc['extra'];
 			$i++;
 		}
 		if($primary_key != "")
 		$pk = "primary key(".$primary_key.")";
-	
+
 		if($unique_keys != "")
 		{
 			$i = 0;
@@ -782,92 +780,92 @@ class DoliDb
 		if($keys != "")
 		$sql .= ",".implode(',',$sqlk);
 		$sql .=") type=".$type;
-	
+
 		dolibarr_syslog($sql,LOG_DEBUG);
 		if(! $this -> query($sql))
-			return -1;
+		return -1;
 		else
-			return 1;
+		return 1;
 	}
 
 	/**
-        \brief      d�crit une table dans une database.
+	 \brief      d�crit une table dans une database.
 		\param	    table	Nom de la table
 		\param	    field	Optionnel : Nom du champ si l'on veut la desc d'un champ
-        \return	    resource
-    */
+		\return	    resource
+		*/
 	function DDLDescTable($table,$field="")
-    {
+	{
 		$sql="DESC ".$table." ".$field;
 
 		dolibarr_syslog($sql,LOG_DEBUG);
 		$this->results = $this->query($sql);
 		return $this->results;
-    }
+	}
 
 	/**
-		\brief      Ins�re un nouveau champ dans une table
+		\brief      Ins�re un nouveau champ dans une table
 		\param	    table 			Nom de la table
-		\param		field_name 		Nom du champ � ins�rer
-		\param	    field_desc 		Tableau associatif de description duchamp � ins�rer[nom du param�tre][valeur du param�tre]
+		\param		field_name 		Nom du champ � ins�rer
+		\param	    field_desc 		Tableau associatif de description duchamp � ins�rer[nom du param�tre][valeur du param�tre]
 		\param	    field_position 	Optionnel ex.: "after champtruc"
 		\return	    int				<0 si KO, >0 si OK
-    */
+		*/
 	function DDLAddField($table,$field_name,$field_desc,$field_position="")
 	{
-		// cl�s recherch�es dans le tableau des descriptions (field_desc) : type,value,attribute,null,default,extra
+		// cl�s recherch�es dans le tableau des descriptions (field_desc) : type,value,attribute,null,default,extra
 		// ex. : $field_desc = array('type'=>'int','value'=>'11','null'=>'not null','extra'=> 'auto_increment');
 		$sql= "ALTER TABLE ".$table." ADD ".$field_name." ";
 		$sql .= $field_desc['type'];
 		if( eregi("^[^ ]",$field_desc['value']))
-			$sql  .= "(".$field_desc['value'].")";
+		$sql  .= "(".$field_desc['value'].")";
 		if( eregi("^[^ ]",$field_desc['attribute']))
-			$sql  .= " ".$field_desc['attribute'];
+		$sql  .= " ".$field_desc['attribute'];
 		if( eregi("^[^ ]",$field_desc['null']))
-			$sql  .= " ".$field_desc['null'];
+		$sql  .= " ".$field_desc['null'];
 		if( eregi("^[^ ]",$field_desc['default']))
-			if(eregi("null",$field_desc['default']))
-				$sql  .= " default ".$field_desc['default'];
-			else
-				$sql  .= " default '".$field_desc['default']."'";
+		if(eregi("null",$field_desc['default']))
+		$sql  .= " default ".$field_desc['default'];
+		else
+		$sql  .= " default '".$field_desc['default']."'";
 		if( eregi("^[^ ]",$field_desc['extra']))
-			$sql  .= " ".$field_desc['extra'];
+		$sql  .= " ".$field_desc['extra'];
 		$sql .= " ".$field_position;
 
 		dolibarr_syslog($sql,LOG_DEBUG);
 		if(! $this -> query($sql))
-			return -1;
+		return -1;
 		else
-			return 1;
+		return 1;
 	}
-	
+
 	/**
-			\brief      Create a user
-			\param	    dolibarr_main_db_host 		Ip serveur
-			\param	    dolibarr_main_db_user 		Nom user � cr�er
-			\param	    dolibarr_main_db_pass 		Mot de passe user � cr�er
-			\param		dolibarr_main_db_name		Database name where user must be granted
-			\return	    int							<0 si KO, >=0 si OK
-	*/
+	 \brief      Create a user
+	 \param	    dolibarr_main_db_host 		Ip serveur
+	 \param	    dolibarr_main_db_user 		Nom user � cr�er
+	 \param	    dolibarr_main_db_pass 		Mot de passe user � cr�er
+	 \param		dolibarr_main_db_name		Database name where user must be granted
+	 \return	    int							<0 si KO, >=0 si OK
+	 */
 	function DDLCreateUser($dolibarr_main_db_host,$dolibarr_main_db_user,$dolibarr_main_db_pass,$dolibarr_main_db_name)
 	{
 		$sql = "INSERT INTO user ";
 		$sql.= "(Host,User,password,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Index_Priv,Alter_priv)";
 		$sql.= " VALUES ('$dolibarr_main_db_host','$dolibarr_main_db_user',password('$dolibarr_main_db_pass')";
 		$sql.= ",'Y','Y','Y','Y','Y','Y','Y','Y');";
-		
+
 		dolibarr_syslog("mysql.lib::DDLCreateUser sql=".$sql);
 		$resql=$this->query($sql);
 		if (! $resql)
 		{
 			return -1;
 		}
-		
+
 		$sql = "INSERT INTO db ";
 		$sql.= "(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Index_Priv,Alter_priv)";
 		$sql.= " VALUES ('$dolibarr_main_db_host','$dolibarr_main_db_name','$dolibarr_main_db_user'";
 		$sql.= ",'Y','Y','Y','Y','Y','Y','Y','Y');";
-		
+
 		dolibarr_syslog("mysql.lib::DDLCreateUser sql=".$sql,LOG_DEBUG);
 		$resql=$this->query($sql);
 		if (! $resql)
@@ -879,80 +877,80 @@ class DoliDb
 
 		dolibarr_syslog("mysql.lib::DDLCreateUser sql=".$sql,LOG_DEBUG);
 		$resql=$this->query($sql);
-	
+
 		return 1;
 	}
-	
+
 	/**
-	*	\brief		Return charset used to store data in database
-	*	\return		string		Charset
-	*/
+	 *	\brief		Return charset used to store data in database
+	 *	\return		string		Charset
+	 */
 	function getDefaultCharacterSetDatabase()
 	{
-		 $resql=$this->query('SHOW VARIABLES LIKE \'character_set_database\'');
-		  if (!$resql)
-	      {
+		$resql=$this->query('SHOW VARIABLES LIKE \'character_set_database\'');
+		if (!$resql)
+		{
 			// version Mysql < 4.1.1
 			return $this->forcecharset;
-	      }
-	    $liste=$this->fetch_array($resql);
-	    return $liste['Value'];
+		}
+		$liste=$this->fetch_array($resql);
+		return $liste['Value'];
 	}
-	
+
 	function getListOfCharacterSet()
 	{
 		$resql=$this->query('SHOW CHARSET');
 		$liste = array();
-		if ($resql) 
-			{
+		if ($resql)
+		{
 			$i = 0;
 			while ($obj = $this->fetch_object($resql) )
 			{
 				$liste[$i]['charset'] = $obj->Charset;
 				$liste[$i]['description'] = $obj->Description;
-				$i++;           
-			}   
-	    	$this->free($resql);
-	  	} else {
-	  		// version Mysql < 4.1.1
-	   		return null;
-	  	}
-    	return $liste;
-	}
-	
-	/**
-	*	\brief		Return collation used in database
-	*	\return		string		Collation value
-	*/
+				$i++;
+			}
+			$this->free($resql);
+		} else {
+			// version Mysql < 4.1.1
+			return null;
+		}
+		return $liste;
+	}
+
+	/**
+	 *	\brief		Return collation used in database
+	 *	\return		string		Collation value
+	 */
 	function getDefaultCollationDatabase()
 	{
 		$resql=$this->query('SHOW VARIABLES LIKE \'collation_database\'');
-		 if (!$resql)
-	      {
+		if (!$resql)
+		{
 			// version Mysql < 4.1.1
 			return $this->forcecollate;
-	      }
-	    $liste=$this->fetch_array($resql);
-	    return $liste['Value'];
+		}
+		$liste=$this->fetch_array($resql);
+		return $liste['Value'];
 	}
-	
+
 	function getListOfCollation(){
-		 $resql=$this->query('SHOW COLLATION');
+		$resql=$this->query('SHOW COLLATION');
 		$liste = array();
-		if ($resql) 
-			{
+		if ($resql)
+		{
 			$i = 0;
 			while ($obj = $this->fetch_object($resql) )
 			{
 				$liste[$i]['collation'] = $obj->Collation;
-				$i++;           
-			}   
-	    	$this->free($resql);
-	  	} else {
-	  		// version Mysql < 4.1.1
-	   		return null;
-	  	}
-    	return $liste;
+				$i++;
+			}
+			$this->free($resql);
+		} else {
+			// version Mysql < 4.1.1
+			return null;
+		}
+		return $liste;
 	}
 
 }
diff --git a/htdocs/lib/databases/mysqli.lib.php b/htdocs/lib/databases/mysqli.lib.php
index e341d4b90308a4f81bbcf951cb951611c4693f8c..93cc13568c2ba604e3d2982a81e186850132dcc9 100644
--- a/htdocs/lib/databases/mysqli.lib.php
+++ b/htdocs/lib/databases/mysqli.lib.php
@@ -21,502 +21,471 @@
  */
 
 /**
-        \file       htdocs/lib/databases/mysqli.lib.php
-        \brief      Fichier de la classe permettant de g�rer une base mysql
-		\version	$Id$
-*/
-// Pour compatibilit� lors de l'upgrade
+ \file       htdocs/lib/databases/mysqli.lib.php
+ \brief      Fichier de la classe permettant de g�rer une base mysql
+ \version	$Id$
+ */
+// Pour compatibilit� lors de l'upgrade
 if (! defined('DOL_DOCUMENT_ROOT'))	 define('DOL_DOCUMENT_ROOT', '../..');
 if (! defined('ADODB_DATE_VERSION')) include_once(DOL_DOCUMENT_ROOT."/includes/adodbtime/adodb-time.inc.php");
 
 
 /**
-        \class      DoliDb
-        \brief      Classe permettant de g�r�r la database de dolibarr
-*/
+ \class      DoliDb
+ \brief      Classe permettant de g�r�r la database de dolibarr
+ */
 class DoliDb
 {
 	//! Handler de base
-  var $db;
-  //! Nom du gestionnaire
-  var $type='mysqli';          
-  //! Charset
-  var $forcecharset='latin1';
-  //! Collate
-  var $forcecollate='latin1_swedish_ci';
-  //! Version min database
-  var $versionmin=array(4,1,0);	
-  //! Resultset de la derni�re requete  
-  var $results;
-  //! 1 si connect�, 0 sinon  
-  var $connected;             
-  //! 1 si base s�lectionn�, 0 sinon
-  var $database_selected; 
-  //! Nom base s�lectionn�e
-  var $database_name;
-  //! Nom user base
-  var $database_user;	   
-  //! 1 si une transaction est en cours, 0 sinon
-  var $transaction_opened;	
-  //! Derniere requete ex�cut�e
-  var $lastquery;			
-  //! Derniere requete ex�cut�e avec echec
-  var $lastqueryerror;		
-  //! Message erreur mysql
-  var $lasterror;		
-  //! Message erreur mysql
-  var $lasterrno;
-  
-  var $ok;
-  var $error;
-
-    // Constantes pour conversion code erreur MySql en code erreur g�n�rique
-    var $errorcode_map = array(
-	    1004 => 'DB_ERROR_CANNOT_CREATE',
-	    1005 => 'DB_ERROR_CANNOT_CREATE',
-	    1006 => 'DB_ERROR_CANNOT_CREATE',
-	    1007 => 'DB_ERROR_ALREADY_EXISTS',
-	    1008 => 'DB_ERROR_CANNOT_DROP',
-	    1025 => 'DB_ERROR_NO_FOREIGN_KEY_TO_DROP',
-		  1044 => 'DB_ERROR_ACCESSDENIED',
-	    1046 => 'DB_ERROR_NODBSELECTED',
-	    1048 => 'DB_ERROR_CONSTRAINT',
-	    1050 => 'DB_ERROR_TABLE_ALREADY_EXISTS',
-	    1051 => 'DB_ERROR_NOSUCHTABLE',
-	    1054 => 'DB_ERROR_NOSUCHFIELD',
-	    1060 => 'DB_ERROR_COLUMN_ALREADY_EXISTS',
-	    1061 => 'DB_ERROR_KEY_NAME_ALREADY_EXISTS',
-	    1062 => 'DB_ERROR_RECORD_ALREADY_EXISTS',
-	    1064 => 'DB_ERROR_SYNTAX',
-	    1068 => 'DB_ERROR_PRIMARY_KEY_ALREADY_EXISTS',
-	    1075 => 'DB_ERROR_CANT_DROP_PRIMARY_KEY',
-	    1091 => 'DB_ERROR_NOSUCHFIELD',
-	    1100 => 'DB_ERROR_NOT_LOCKED',
-	    1136 => 'DB_ERROR_VALUE_COUNT_ON_ROW',
-	    1146 => 'DB_ERROR_NOSUCHTABLE',
-	    1216 => 'DB_ERROR_NO_PARENT',
-		  1217 => 'DB_ERROR_CHILD_EXISTS',
-		  1451 => 'DB_ERROR_CHILD_EXISTS'
-    );
-
-
-    /**
-            \brief      Ouverture d'une connexion vers le serveur et �ventuellement une database.
-            \param      type		Type de base de donn�es (mysql ou pgsql)
-            \param	    host		Addresse de la base de donn�es
-    	    \param	    user		Nom de l'utilisateur autoris�
-            \param	    pass		Mot de passe
-            \param	    name		Nom de la database
-			\param	    port		Port of database server
-            \return     int			1 en cas de succ�s, 0 sinon
-    */
-    function DoliDb($type='mysqli', $host, $user, $pass, $name='', $port=0)
-    {
-        global $conf,$langs;
-        
-        /* Ce test est inutile. En effet, si DOL_DOCUMENT_ROOT est d�fini, cela signifie      */
-		/* obligatoirement que le fichier conf a deja �t� charg�e puisque cette constante est */
-		/* definie a partir du contenu du fichier conf.php                                    */
-		/* Et toutes les infos sont charg�s dans l'objet conf                                 */
-		/*
-        if (file_exists($conffile)) {
-	    	include($conffile);
-	    	$this->forcecharset=$character_set_database;
-	    	$this->forcecollate=$dolibarr_main_db_collation;
-	    	$this->db_user=$dolibarr_main_db_user;
-		}
-		*/
+	var $db;
+	//! Nom du gestionnaire
+	var $type='mysqli';
+	//! Charset
+	var $forcecharset='latin1';
+	//! Collate
+	var $forcecollate='latin1_swedish_ci';
+	//! Version min database
+	var $versionmin=array(4,1,0);
+	//! Resultset de la derni�re requete  
+	var $results;
+	//! 1 si connect�, 0 sinon  
+	var $connected;
+	//! 1 si base s�lectionn�, 0 sinon
+	var $database_selected;
+	//! Nom base s�lectionn�e
+	var $database_name;
+	//! Nom user base
+	var $database_user;
+	//! 1 si une transaction est en cours, 0 sinon
+	var $transaction_opened;
+	//! Derniere requete ex�cut�e
+	var $lastquery;
+	//! Derniere requete ex�cut�e avec echec
+	var $lastqueryerror;
+	//! Message erreur mysql
+	var $lasterror;
+	//! Message erreur mysql
+	var $lasterrno;
+
+	var $ok;
+	var $error;
+
+
+	/**
+	 \brief      Ouverture d'une connexion vers le serveur et �ventuellement une database.
+	 \param      type		Type de base de donn�es (mysql ou pgsql)
+	 \param	    host		Addresse de la base de donn�es
+	 \param	    user		Nom de l'utilisateur autoris�
+	 \param	    pass		Mot de passe
+	 \param	    name		Nom de la database
+	 \param	    port		Port of database server
+	 \return     int			1 en cas de succ�s, 0 sinon
+	 */
+	function DoliDb($type='mysqli', $host, $user, $pass, $name='', $port=0)
+	{
+		global $conf,$langs;
+
 		if (isset($conf->db->character_set) && $conf->db->character_set) {
 			$this->forcecharset=$conf->db->character_set;
-  		}
-  		if (isset($conf->db->dolibarr_main_db_collation) && $conf->db->dolibarr_main_db_collation) {
-	    	$this->forcecollate=$conf->db->dolibarr_main_db_collation;
-  		}
-	    $this->database_user=$user;
-
-        $this->transaction_opened=0;
-
-        //print "Name DB: $host,$user,$pass,$name<br>";
-
-        if (! function_exists("mysqli_connect"))
-        {
-        	$this->connected = 0;
-        	$this->ok = 0;
-            $this->error="Mysqli PHP functions are not available in this version of PHP. Try to use another driver.";
-        	dolibarr_syslog("DoliDB::DoliDB : Mysql PHP functions are not available in this version of PHP. Try to use another driver.",LOG_ERR);
-            return $this->ok;
-        }
-
-        if (! $host)
-        {
-        	$this->connected = 0;
-        	$this->ok = 0;
-            $this->error=$langs->trans("ErrorWrongHostParameter");
-        	dolibarr_syslog("DoliDB::DoliDB : Erreur Connect, wrong host parameters",LOG_ERR);
-            return $this->ok;
-        }
-
-        // Essai connexion serveur
-        $this->db = $this->connect($host, $user, $pass, '', $port);
-
-        if ($this->db)
-        {
-            $this->connected = 1;
-            $this->ok = 1;
-        }
-        else
-        {
-            // host, login ou password incorrect
-            $this->connected = 0;
-            $this->ok = 0;
+		}
+		if (isset($conf->db->dolibarr_main_db_collation) && $conf->db->dolibarr_main_db_collation) {
+			$this->forcecollate=$conf->db->dolibarr_main_db_collation;
+		}
+		$this->database_user=$user;
+
+		$this->transaction_opened=0;
+
+		//print "Name DB: $host,$user,$pass,$name<br>";
+
+		if (! function_exists("mysqli_connect"))
+		{
+			$this->connected = 0;
+			$this->ok = 0;
+			$this->error="Mysqli PHP functions are not available in this version of PHP. Try to use another driver.";
+			dolibarr_syslog("DoliDB::DoliDB : Mysql PHP functions are not available in this version of PHP. Try to use another driver.",LOG_ERR);
+			return $this->ok;
+		}
+
+		if (! $host)
+		{
+			$this->connected = 0;
+			$this->ok = 0;
+			$this->error=$langs->trans("ErrorWrongHostParameter");
+			dolibarr_syslog("DoliDB::DoliDB : Erreur Connect, wrong host parameters",LOG_ERR);
+			return $this->ok;
+		}
+
+		// Essai connexion serveur
+		$this->db = $this->connect($host, $user, $pass, '', $port);
+
+		if ($this->db)
+		{
+			$this->connected = 1;
+			$this->ok = 1;
+		}
+		else
+		{
+			// host, login ou password incorrect
+			$this->connected = 0;
+			$this->ok = 0;
 			$this->error=mysqli_connect_error();
 			dolibarr_syslog("DoliDB::DoliDB : Erreur Connect mysqli_connect_error=".$this->error,LOG_ERR);
-        }
-
-        // Si connexion serveur ok et si connexion base demand�e, on essaie connexion base
-        if ($this->connected && $name)
-        {
-            if ($this->select_db($name))
-            {
-                $this->database_selected = 1;
-                $this->database_name = $name;
-                $this->ok = 1;
-
-				// Si client connect� avec charset different de celui de Dolibarr
+		}
+
+		// Si connexion serveur ok et si connexion base demand�e, on essaie connexion base
+		if ($this->connected && $name)
+		{
+			if ($this->select_db($name))
+			{
+				$this->database_selected = 1;
+				$this->database_name = $name;
+				$this->ok = 1;
+
+				// Si client connect� avec charset different de celui de Dolibarr
 				/*if (mysqli_client_encoding ( $this->db ) != $this->getDefaultCharacterSetDatabase())
 				{
-					$this->query("SET NAMES '".$this->forcecharset."'", $this->db);
-					$this->query("SET CHARACTER SET '".$this->forcecharset."'", $this->db);
-	            }*/
-            }
-            else
-            {
-                $this->database_selected = 0;
-                $this->database_name = '';
-                $this->ok = 0;
-                $this->error=$this->error();
-                dolibarr_syslog("DoliDB::DoliDB : Erreur Select_db");
-            }
-        }
-        else
-        {
-            // Pas de selection de base demand�e, ok ou ko
-            $this->database_selected = 0;
-        }
-
-        return $this->ok;
-    }
-
-
-    /**
-            \brief      Selectionne une database.
-            \param	    database		Nom de la database
-            \return	    boolean         true si ok, false si ko
-    */
-    function select_db($database)
-    {
-        return mysqli_select_db($this->db,$database);
-    }
-
-
-    /**
-            \brief      Connection vers le serveur
-            \param	    host		addresse de la base de donn�es
-            \param	    login		nom de l'utilisateur autoris�
-            \param	    passwd		mot de passe
-            \param		name		nom de la database (ne sert pas sous mysql, sert sous pgsql)
-			\param		port		Port of database server
-            \return		resource	handler d'acc�s � la base
-	        \seealso	close
-    */
-    function connect($host, $login, $passwd, $name, $port=0)
-    {
+				$this->query("SET NAMES '".$this->forcecharset."'", $this->db);
+				$this->query("SET CHARACTER SET '".$this->forcecharset."'", $this->db);
+				}*/
+			}
+			else
+			{
+				$this->database_selected = 0;
+				$this->database_name = '';
+				$this->ok = 0;
+				$this->error=$this->error();
+				dolibarr_syslog("DoliDB::DoliDB : Erreur Select_db");
+			}
+		}
+		else
+		{
+			// Pas de selection de base demandee, ok ou ko
+			$this->database_selected = 0;
+		}
+
+		return $this->ok;
+	}
+
+
+	/**
+	 *	\brief		Convert a SQL request in mysql syntax to database syntax
+	 * 	\param		request		SQL request to convert
+	 * 	\return		string		SQL request converted
+	 */
+	function convertSQLFromMysql($request)
+	{
+		return $request;
+	}
+
+	/**
+	 \brief      Selectionne une database.
+	 \param	    database		Nom de la database
+	 \return	    boolean         true si ok, false si ko
+	 */
+	function select_db($database)
+	{
+		return mysqli_select_db($this->db,$database);
+	}
+
+
+	/**
+	 \brief      Connection vers le serveur
+	 \param	    host		addresse de la base de donn�es
+	 \param	    login		nom de l'utilisateur autoris�
+	 \param	    passwd		mot de passe
+	 \param		name		nom de la database (ne sert pas sous mysql, sert sous pgsql)
+	 \param		port		Port of database server
+	 \return		resource	handler d'acc�s � la bas
+	 \seealso	close
+	 */
+	function connect($host, $login, $passwd, $name, $port=0)
+	{
 		dolibarr_syslog("DoliDB::connect host=$host, port=$port, login=$login, passwd=--hidden--, name=$name");
 
 		$newhost=$host;
 		$newport=$port;
-		
+
 		// With mysqli, port must be in connect parameters
 		if (! $newport) $newport=3306;
 
-        $this->db  = @mysqli_connect($newhost, $login, $passwd, $name, $newport);
-	    //force les enregistrement en latin1 si la base est en utf8 par d�faut
-	    // Supprim� car plante sur mon PHP-Mysql. De plus, la base est forcement en latin1 avec
-		// les nouvelles version de Dolibarr car forc� par l'install Dolibarr.
+		$this->db  = @mysqli_connect($newhost, $login, $passwd, $name, $newport);
+		//force les enregistrement en latin1 si la base est en utf8 par d�faut
+		// Supprim� car plante sur mon PHP-Mysql. De plus, la base est forcement en latin1 avec
+		// les nouvelles version de Dolibarr car forc� par l'install Dolibarr.
 		//$this->query('SET NAMES '.$this->forcecharset);
-        //print "Resultat fonction connect: ".$this->db;
+		//print "Resultat fonction connect: ".$this->db;
 		if ($this->db)
 		{
 			$this->query("SET NAMES '".$this->forcecharset."'", $this->db);
 			$this->query("SET CHARACTER SET '".$this->forcecharset."'", $this->db);
 		}
 		return $this->db;
-    }
-
-    /**
-            \brief          Renvoie la version du serveur
-            \return	        string      Chaine version
-    */
-    function getVersion()
-    {
-//        $resql=$this->query('SELECT VERSION()');
-//        $row=$this->fetch_row($resql);
-//        return $row[0];
+	}
+
+	/**
+	 \brief          Renvoie la version du serveur
+	 \return	        string      Chaine version
+	 */
+	function getVersion()
+	{
+		//        $resql=$this->query('SELECT VERSION()');
+		//        $row=$this->fetch_row($resql);
+		//        return $row[0];
 		return mysqli_get_server_info($this->db);
-    }
-
-    /**
-     \brief          Renvoie la version du serveur sous forme de nombre
-     \return	        string      Chaine version
-	  */
-	  function getIntVersion()
-	  {
-			$version=	$this->getVersion();
-			$vlist=split('[.-]',$version);
-			if (strlen($vlist[1])==1){
-				$vlist[1]="0".$vlist[1];
-			}
-			if (strlen($vlist[2])==1){
-				$vlist[2]="0".$vlist[2];
-			}
-			return $vlist[0].$vlist[1].$vlist[2];
-	  }
-
-    /**
-            \brief          Renvoie la version du serveur dans un tableau
-            \return	        array  		Tableau de chaque niveau de version
-    */
-    function getVersionArray()
-    {
-        return split('\.',$this->getVersion());
-    }
-
-
-    /**
-        \brief      Fermeture d'une connexion vers une database.
-        \return	    resource
-        \seealso	connect
-    */
-    function close()
-    {
-        return mysqli_close($this->db);
-    }
-
-
-    /**
-        \brief      Debut d'une transaction.
-        \return	    int         1 si ouverture transaction ok ou deja ouverte, 0 en cas d'erreur
-    */
-    function begin()
-    {
-        if (! $this->transaction_opened)
-        {
-            $ret=$this->query("BEGIN");
-            if ($ret)
+	}
+
+	/**
+	 \brief          Renvoie la version du serveur sous forme de nombre
+	 \return	        string      Chaine version
+	 */
+	function getIntVersion()
+	{
+		$version=	$this->getVersion();
+		$vlist=split('[.-]',$version);
+		if (strlen($vlist[1])==1){
+			$vlist[1]="0".$vlist[1];
+		}
+		if (strlen($vlist[2])==1){
+			$vlist[2]="0".$vlist[2];
+		}
+		return $vlist[0].$vlist[1].$vlist[2];
+	}
+
+	/**
+	 \brief          Renvoie la version du serveur dans un tableau
+	 \return	        array  		Tableau de chaque niveau de version
+	 */
+	function getVersionArray()
+	{
+		return split('\.',$this->getVersion());
+	}
+
+
+	/**
+	 \brief      Fermeture d'une connexion vers une database.
+	 \return	    resource
+	 \seealso	connect
+	 */
+	function close()
+	{
+		return mysqli_close($this->db);
+	}
+
+
+	/**
+	 \brief      Debut d'une transaction.
+	 \return	    int         1 si ouverture transaction ok ou deja ouverte, 0 en cas d'erreur
+	 */
+	function begin()
+	{
+		if (! $this->transaction_opened)
+		{
+			$ret=$this->query("BEGIN");
+			if ($ret)
 			{
 				$this->transaction_opened++;
 				dolibarr_syslog("BEGIN Transaction",LOG_DEBUG);
 			}
-            return $ret;
-        }
-        else
-        {
-            $this->transaction_opened++;
-            return 1;
-        }
-    }
-
-    /**
-        \brief      Validation d'une transaction
-        \return	    int         1 si validation ok ou niveau de transaction non ouverte, 0 en cas d'erreur
-    */
-    function commit()
-    {
-        if ($this->transaction_opened<=1)
-        {
-            $ret=$this->query("COMMIT");
-			if ($ret) 
+			return $ret;
+		}
+		else
+		{
+			$this->transaction_opened++;
+			return 1;
+		}
+	}
+
+	/**
+	 \brief      Validation d'une transaction
+	 \return	    int         1 si validation ok ou niveau de transaction non ouverte, 0 en cas d'erreur
+	 */
+	function commit()
+	{
+		if ($this->transaction_opened<=1)
+		{
+			$ret=$this->query("COMMIT");
+			if ($ret)
 			{
 				$this->transaction_opened=0;
 				dolibarr_syslog("COMMIT Transaction",LOG_DEBUG);
 			}
-            return $ret;
-        }
-        else
-        {
-            $this->transaction_opened--;
-            return 1;
-        }
-    }
-
-    /**
-        \brief      Annulation d'une transaction et retour aux anciennes valeurs
-        \return	    int         1 si annulation ok ou transaction non ouverte, 0 en cas d'erreur
-    */
-    function rollback()
-    {
-        if ($this->transaction_opened<=1)
-        {
-            $ret=$this->query("ROLLBACK");
-            $this->transaction_opened=0;
+			return $ret;
+		}
+		else
+		{
+			$this->transaction_opened--;
+			return 1;
+		}
+	}
+
+	/**
+	 \brief      Annulation d'une transaction et retour aux anciennes valeurs
+	 \return	    int         1 si annulation ok ou transaction non ouverte, 0 en cas d'erreur
+	 */
+	function rollback()
+	{
+		if ($this->transaction_opened<=1)
+		{
+			$ret=$this->query("ROLLBACK");
+			$this->transaction_opened=0;
 			dolibarr_syslog("ROLLBACK Transaction",LOG_DEBUG);
-            return $ret;
-        }
-        else
-        {
-            $this->transaction_opened--;
-            return 1;
-        }
-    }
-
-    /**
-        \brief      Effectue une requete et renvoi le resultset de r�ponse de la base
-        \param	    query	    Contenu de la query
-        \return	    resource    Resultset de la reponse
-    */
-    function query($query)
-    {
-        $query = trim($query);
-        if (! $this->database_name)
-        {
-            // Ordre SQL ne n�cessitant pas de connexion � une base (exemple: CREATE DATABASE
-            $ret = mysqli_query($this->db,$query);
-        }
-        else
-        {
-            $ret = mysqli_query($this->db,$query);
-        }
-
-        if (! eregi("^COMMIT",$query) && ! eregi("^ROLLBACK",$query))
-        {
-            // Si requete utilisateur, on la sauvegarde ainsi que son resultset
+			return $ret;
+		}
+		else
+		{
+			$this->transaction_opened--;
+			return 1;
+		}
+	}
+
+	/**
+	 \brief      Effectue une requete et renvoi le resultset de r�ponse de la base
+	 \param	    query	    Contenu de la query
+	 \return	    resource    Resultset de la reponse
+	 */
+	function query($query)
+	{
+		$query = trim($query);
+		if (! $this->database_name)
+		{
+			// Ordre SQL ne n�cessitant pas de connexion � une base (exemple: CREATE DATABASE
+			$ret = mysqli_query($this->db,$query);
+		}
+		else
+		{
+			$ret = mysqli_query($this->db,$query);
+		}
+
+		if (! eregi("^COMMIT",$query) && ! eregi("^ROLLBACK",$query))
+		{
+			// Si requete utilisateur, on la sauvegarde ainsi que son resultset
 			if (! $ret)
 			{
 				$this->lastqueryerror = $query;
-            	$this->lasterror = $this->error();
-            	$this->lasterrno = $this->errno();
-            }
-            $this->lastquery=$query;
-            $this->results = $ret;
-        }
-
-        return $ret;
-    }
-
-    /**
-        \brief      Renvoie la ligne courante (comme un objet) pour le curseur resultset.
-        \param      resultset   Curseur de la requete voulue
-        \return	    resource
-    */
-    function fetch_object($resultset=0)
-    {
-        // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
-        if (! is_object($resultset)) { $resultset=$this->results; }
-        return mysqli_fetch_object($resultset);
-    }
-
-
-    /**
-        \brief      Renvoie les donn�es dans un tableau.
-        \param      resultset   Curseur de la requete voulue
-        \return	    array
-    */
-
-    function fetch_array($resultset=0)
-    {
-        // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
-        if (! is_object($resultset)) { $resultset=$this->results; }
-        return mysqli_fetch_array($resultset);
-    }
-
-    /**
-        \brief      Renvoie les donn�es comme un tableau.
-        \param      resultset   Curseur de la requete voulue
-        \return	    array
-    */
-
-    function fetch_row($resultset=0)
-    {
-        // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
-        if (! is_bool($resultset))
-        {
-        	if (! is_object($resultset)) { $resultset=$this->results; }
-        	return mysqli_fetch_row($resultset);
-        }
-        else
-        {
-        	// si le curseur est un bool�en on retourne la valeur 0
-        	return 0;
-        }
-    }
-
-    /**
-        \brief      Renvoie le nombre de lignes dans le resultat d'une requete SELECT
-        \see    	affected_rows
-        \param      resultset   Curseur de la requete voulue
-        \return     int		    Nombre de lignes
-    */
-    function num_rows($resultset=0)
-    {
-        // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
-        if (! is_object($resultset)) { $resultset=$this->results; }
-        return mysqli_num_rows($resultset);
-    }
-
-    /**
-        \brief      Renvoie le nombre de lignes dans le resultat d'une requete INSERT, DELETE ou UPDATE
-        \see    	num_rows
-        \param      resultset   Curseur de la requete voulue
-        \return     int		    Nombre de lignes
-    */
-
-    function affected_rows($resultset=0)
-    {
-        // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
-        if (! is_object($resultset)) { $resultset=$this->results; }
-        // mysql necessite un link de base pour cette fonction contrairement
-        // a pqsql qui prend un resultset
-        return mysqli_affected_rows($this->db);
-    }
-
-
-    /**
-        \brief      Lib�re le dernier resultset utilis� sur cette connexion.
-        \param      resultset   Curseur de la requete voulue
-    */
-    function free($resultset=0)
-    {
-        // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
-        if (! is_object($resultset)) { $resultset=$this->results; }
-        // Si resultset en est un, on libere la m�moire
-        if (is_object($resultset)) mysqli_free_result($resultset);
-    }
-
-
-    /**
-        \brief      D�fini les limites de la requ�te.
-        \param	    limit       nombre maximum de lignes retourn�es
-        \param	    offset      num�ro de la ligne � partir de laquelle recup�rer les lignes
-        \return	    string      chaine exprimant la syntax sql de la limite
-    */
-    function plimit($limit=0,$offset=0)
-    {
-        global $conf;
-        if (! $limit) $limit=$conf->liste_limit;
-        if ($offset > 0) return " LIMIT $offset,$limit ";
-        else return " LIMIT $limit ";
-    }
-
-
-	/**
-        \brief      D�fini le tri de la requ�te.
-        \param	    sortfield   liste des champ de tri
-        \param	    sortorder   ordre du tri
-        \return	    string      chaine exprimant la syntax sql de l'ordre de tri
+				$this->lasterror = $this->error();
+				$this->lasterrno = $this->errno();
+			}
+			$this->lastquery=$query;
+			$this->results = $ret;
+		}
+
+		return $ret;
+	}
+
+	/**
+	 \brief      Renvoie la ligne courante (comme un objet) pour le curseur resultset.
+	 \param      resultset   Curseur de la requete voulue
+	 \return	    resource
+	 */
+	function fetch_object($resultset=0)
+	{
+		// Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
+		if (! is_object($resultset)) { $resultset=$this->results; }
+		return mysqli_fetch_object($resultset);
+	}
+
+
+	/**
+	 \brief      Renvoie les donn�es dans un tableau.
+	 \param      resultset   Curseur de la requete voulue
+	 \return	    array
+	 */
+
+	function fetch_array($resultset=0)
+	{
+		// Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
+		if (! is_object($resultset)) { $resultset=$this->results; }
+		return mysqli_fetch_array($resultset);
+	}
+
+	/**
+	 \brief      Renvoie les donn�es comme un tableau.
+	 \param      resultset   Curseur de la requete voulue
+	 \return	    array
+	 */
+
+	function fetch_row($resultset=0)
+	{
+		// Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
+		if (! is_bool($resultset))
+		{
+			if (! is_object($resultset)) { $resultset=$this->results; }
+			return mysqli_fetch_row($resultset);
+		}
+		else
+		{
+			// si le curseur est un bool�en on retourne la valeur 0
+			return 0;
+		}
+	}
+
+	/**
+	 \brief      Renvoie le nombre de lignes dans le resultat d'une requete SELECT
+	 \see    	affected_rows
+	 \param      resultset   Curseur de la requete voulue
+	 \return     int		    Nombre de lignes
+	 */
+	function num_rows($resultset=0)
+	{
+		// Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
+		if (! is_object($resultset)) { $resultset=$this->results; }
+		return mysqli_num_rows($resultset);
+	}
+
+	/**
+	 \brief      Renvoie le nombre de lignes dans le resultat d'une requete INSERT, DELETE ou UPDATE
+	 \see    	num_rows
+	 \param      resultset   Curseur de la requete voulue
+	 \return     int		    Nombre de lignes
+	 */
+
+	function affected_rows($resultset=0)
+	{
+		// Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
+		if (! is_object($resultset)) { $resultset=$this->results; }
+		// mysql necessite un link de base pour cette fonction contrairement
+		// a pqsql qui prend un resultset
+		return mysqli_affected_rows($this->db);
+	}
+
+
+	/**
+	 \brief      Lib�re le dernier resultset utilis� sur cette connexion.
+	 \param      resultset   Curseur de la requete voulue
+	 */
+	function free($resultset=0)
+	{
+		// Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
+		if (! is_object($resultset)) { $resultset=$this->results; }
+		// Si resultset en est un, on libere la m�moire
+		if (is_object($resultset)) mysqli_free_result($resultset);
+	}
+
+
+	/**
+	 \brief      D�fini les limites de la requ�te.
+	 \param	    limit       nombre maximum de lignes retourn�es
+	 \param	    offset      num�ro de la ligne � partir de laquelle recup�rer les ligne
+	 \return	    string      chaine exprimant la syntax sql de la limite
+	 */
+	function plimit($limit=0,$offset=0)
+	{
+		global $conf;
+		if (! $limit) $limit=$conf->liste_limit;
+		if ($offset > 0) return " LIMIT $offset,$limit ";
+		else return " LIMIT $limit ";
+	}
+
+
+	/**
+	 \brief      D�fini le tri de la requ�te.
+	 \param	    sortfield   liste des champ de tri
+	 \param	    sortorder   ordre du tri
+	 \return	    string      chaine exprimant la syntax sql de l'ordre de tri
 		\TODO		A mutualiser dans classe mere
-    */
-    function order($sortfield=0,$sortorder=0)
-    {
+		*/
+	function order($sortfield=0,$sortorder=0)
+	{
 		if ($sortfield)
 		{
 			$return='';
@@ -525,7 +494,7 @@ class DoliDb
 			{
 				if (! $return) $return.=' ORDER BY ';
 				else $return.=',';
-				
+
 				$return.=$val;
 				if ($sortorder) $return.=' '.$sortorder;
 			}
@@ -535,137 +504,167 @@ class DoliDb
 		{
 			return '';
 		}
-    }
-	
-	
+	}
+
+
 	/**
-        \brief      Escape a string to insert data.
-        \param	    stringtoencode		String to escape
-        \return	    string				String escaped
-    */
-    function escape($stringtoencode)
+	 \brief      Escape a string to insert data.
+	 \param	    stringtoencode		String to escape
+	 \return	    string				String escaped
+	 */
+	function escape($stringtoencode)
 	{
 		return addslashes($stringtoencode);
 	}
 
 
-    /**
-    *   \brief      Formatage (par la base de donn�es) d'un champ de la base au format tms ou Date (YYYY-MM-DD HH:MM:SS)
-    *               afin de retourner une donn�e toujours au format universel date tms unix.
-    *               Fonction � utiliser pour g�n�rer les SELECT.
-    *   \param	    param       Date au format text � convertir
-    *   \return	    date        Date au format tms.
-	*	\TODO		Remove unix_timestamp functions
-    */
-    function pdate($param)
-    {
-        return "unix_timestamp(".$param.")";
-    }
-
-    /**
-     *   \brief     Formatage (par PHP) d'une date vers format texte pour insertion dans champ date.
-     *              Fonction � utiliser pour g�n�rer les INSERT, UPDATE ou les clauses WHERE.
-     *   \param	    param       Date tms � convertir
-     *   \return	date        Date au format text YYYYMMDDHHMMSS.
-    */
-    function idate($param)
-    {
-        return adodb_strftime("%Y%m%d%H%M%S",$param);
-    }
-
-
-    /**
-        \brief      Formatage d'un if SQL
-        \param		test            chaine test
-        \param		resok           resultat si test egal
-        \param		resko           resultat si test non egal
-        \return		string          chaine format� SQL
-    */
-    function ifsql($test,$resok,$resko)
-    {
-        return 'IF('.$test.','.$resok.','.$resko.')';
-    }
-
-
-    /**
-        \brief      Renvoie la derniere requete soumise par la methode query()
-        \return	    lastquery
-    */
-    function lastquery()
-    {
-        return $this->lastquery;
-    }
-
-    /**
-        \brief      Renvoie la derniere requete en erreur
-        \return	    string	lastqueryerror
-    */
+	/**
+	 *   \brief      Formatage (par la base de donn�es) d'un champ de la base au format tms ou Date (YYYY-MM-DD HH:MM:SS)
+	 *               afin de retourner une donn�e toujours au format universel date tms unix.
+	 *               Fonction � utiliser pour g�n�rer les SELECT.
+	 *   \param	    param       Date au format text � convertir
+	 *   \return	    date        Date au format tms.
+	 *	\TODO		Remove unix_timestamp functions
+	 */
+	function pdate($param)
+	{
+		return "unix_timestamp(".$param.")";
+	}
+
+	/**
+	 *   \brief     Formatage (par PHP) d'une date vers format texte pour insertion dans champ date.
+	 *              Fonction � utiliser pour g�n�rer les INSERT, UPDATE ou les clauses WHERE
+	 *   \param	    param       Date tms � convertir
+	 *   \return	date        Date au format text YYYYMMDDHHMMSS.
+	 */
+	function idate($param)
+	{
+		return adodb_strftime("%Y%m%d%H%M%S",$param);
+	}
+
+
+	/**
+	 \brief      Formatage d'un if SQL
+	 \param		test            chaine test
+	 \param		resok           resultat si test egal
+	 \param		resko           resultat si test non egal
+	 \return		string          chaine format� SQL
+	 */
+	function ifsql($test,$resok,$resko)
+	{
+		return 'IF('.$test.','.$resok.','.$resko.')';
+	}
+
+
+	/**
+	 \brief      Renvoie la derniere requete soumise par la methode query()
+	 \return	    lastquery
+	 */
+	function lastquery()
+	{
+		return $this->lastquery;
+	}
+
+	/**
+	 \brief      Renvoie la derniere requete en erreur
+	 \return	    string	lastqueryerror
+	 */
 	function lastqueryerror()
 	{
 		return $this->lastqueryerror;
 	}
 
-    /**
-        \brief      Renvoie le libelle derniere erreur
-        \return	    string	lasterror
-    */
+	/**
+	 \brief      Renvoie le libelle derniere erreur
+	 \return	    string	lasterror
+	 */
 	function lasterror()
 	{
 		return $this->lasterror;
 	}
 
-    /**
-        \brief      Renvoie le code derniere erreur
-        \return	    string	lasterrno
-    */
+	/**
+	 \brief      Renvoie le code derniere erreur
+	 \return	    string	lasterrno
+	 */
 	function lasterrno()
 	{
 		return $this->lasterrno;
 	}
 
-    /**
-        \brief     Renvoie le code erreur generique de l'operation precedente.
-        \return    error_num       (Exemples: DB_ERROR_TABLE_ALREADY_EXISTS, DB_ERROR_RECORD_ALREADY_EXISTS...)
-    */
-    function errno()
-    {
-        if (! $this->connected) {
-            // Si il y a eu echec de connexion, $this->db n'est pas valide.
-            return 'DB_ERROR_FAILED_TO_CONNECT';
-        }
-        else {
-            if (isset($this->errorcode_map[mysqli_errno($this->db)])) {
-                return $this->errorcode_map[mysqli_errno($this->db)];
-            }
-            $errno=mysqli_errno($this->db);
-            return ($errno?'DB_ERROR_'.$errno:'0');
-        }
-    }
-
-    /**
-        \brief     Renvoie le texte de l'erreur mysql de l'operation precedente.
-        \return    error_text
-    */
-    function error()
-    {
-        if (! $this->connected) {
-            // Si il y a eu echec de connexion, $this->db n'est pas valide pour mysqli_error.
-            return 'Not connected. Check setup parameters in conf/conf.php file and your mysql client and server versions';
-        }
-        else {
-            return mysqli_error($this->db);
-        }
-    }
-
-    /**
-        \brief     R�cup�re l'id gen�r� par le dernier INSERT.
-        \param     tab     Nom de la table concern�e par l'insert. Ne sert pas sous MySql mais requis pour compatibilit� avec Postgresql
-        \return    int     id
-    */
-    function last_insert_id($tab)
-    {
-        return mysqli_insert_id($this->db);
-    }
+	/**
+	 \brief     Renvoie le code erreur generique de l'operation precedente.
+	 \return    error_num       (Exemples: DB_ERROR_TABLE_ALREADY_EXISTS, DB_ERROR_RECORD_ALREADY_EXISTS...)
+	 */
+	function errno()
+	{
+		if (! $this->connected) {
+			// Si il y a eu echec de connexion, $this->db n'est pas valide.
+			return 'DB_ERROR_FAILED_TO_CONNECT';
+		}
+		else {
+			// Constants to convert a MySql error code to a generic Dolibarr error code
+			$errorcode_map = array(
+			1004 => 'DB_ERROR_CANNOT_CREATE',
+			1005 => 'DB_ERROR_CANNOT_CREATE',
+			1006 => 'DB_ERROR_CANNOT_CREATE',
+			1007 => 'DB_ERROR_ALREADY_EXISTS',
+			1008 => 'DB_ERROR_CANNOT_DROP',
+			1025 => 'DB_ERROR_NO_FOREIGN_KEY_TO_DROP',
+			1044 => 'DB_ERROR_ACCESSDENIED',
+			1046 => 'DB_ERROR_NODBSELECTED',
+			1048 => 'DB_ERROR_CONSTRAINT',
+			1050 => 'DB_ERROR_TABLE_ALREADY_EXISTS',
+			1051 => 'DB_ERROR_NOSUCHTABLE',
+			1054 => 'DB_ERROR_NOSUCHFIELD',
+			1060 => 'DB_ERROR_COLUMN_ALREADY_EXISTS',
+			1061 => 'DB_ERROR_KEY_NAME_ALREADY_EXISTS',
+			1062 => 'DB_ERROR_RECORD_ALREADY_EXISTS',
+			1064 => 'DB_ERROR_SYNTAX',
+			1068 => 'DB_ERROR_PRIMARY_KEY_ALREADY_EXISTS',
+			1075 => 'DB_ERROR_CANT_DROP_PRIMARY_KEY',
+			1091 => 'DB_ERROR_NOSUCHFIELD',
+			1100 => 'DB_ERROR_NOT_LOCKED',
+			1136 => 'DB_ERROR_VALUE_COUNT_ON_ROW',
+			1146 => 'DB_ERROR_NOSUCHTABLE',
+			1216 => 'DB_ERROR_NO_PARENT',
+			1217 => 'DB_ERROR_CHILD_EXISTS',
+			1451 => 'DB_ERROR_CHILD_EXISTS'
+		     );
+		
+			if (isset($this->errorcode_map[mysqli_errno($this->db)]))
+			{
+				return $this->errorcode_map[mysqli_errno($this->db)];
+			}
+			$errno=mysqli_errno($this->db);
+			return ($errno?'DB_ERROR_'.$errno:'0');
+		}
+	}
+
+	/**
+	 \brief     Renvoie le texte de l'erreur mysql de l'operation precedente.
+	 \return    error_text
+	 */
+	function error()
+	{
+		if (! $this->connected) {
+			// Si il y a eu echec de connexion, $this->db n'est pas valide pour mysqli_error.
+			return 'Not connected. Check setup parameters in conf/conf.php file and your mysql client and server versions';
+		}
+		else {
+			return mysqli_error($this->db);
+		}
+	}
+
+	/**
+	 \brief     R�cup�re l'id gen�r� par le dernier INSERT.
+	 \param     tab     Nom de la table concern�e par l'insert. Ne sert pas sous MySql mais requis pour compatibilit� avec Postgresql
+	 \return    int     id
+	 */
+	function last_insert_id($tab)
+	{
+		return mysqli_insert_id($this->db);
+	}
 
 
 
@@ -674,49 +673,49 @@ class DoliDb
 
 
 
-    /**
-            \brief          Renvoie l'id de la connexion
-            \return	        string      Id connexion
-    */
-    function DDLGetConnectId()
-    {
-        $resql=$this->query('SELECT CONNECTION_ID()');
-        $row=$this->fetch_row($resql);
-        return $row[0];
-    }
+	/**
+	 \brief          Renvoie l'id de la connexion
+	 \return	        string      Id connexion
+	 */
+	function DDLGetConnectId()
+	{
+		$resql=$this->query('SELECT CONNECTION_ID()');
+		$row=$this->fetch_row($resql);
+		return $row[0];
+	}
 
 
-    /**
-            \brief          Cr�ation d'une nouvelle base de donn�e
-            \param	        database		nom de la database � cr�er
-            \return	        resource		resource d�finie si ok, null si ko
-            \remarks        Ne pas utiliser les fonctions xxx_create_db (xxx=mysql, ...) car elles sont deprecated
-    */
+	/**
+	 \brief          Cr�ation d'une nouvelle base de donn�e
+	 \param	        database		nom de la database � cr�er
+	 \return	        resource		resource d�finie si ok, null si k
+	 \remarks        Ne pas utiliser les fonctions xxx_create_db (xxx=mysql, ...) car elles sont deprecated
+	 */
 	function DDLCreateDb($database)
 	{
-	    // ALTER DATABASE dolibarr_db DEFAULT CHARACTER SET latin DEFAULT COLLATE latin1_swedish_ci
-	    $sql = 'CREATE DATABASE '.$database;
-	    $sql.= ' DEFAULT CHARACTER SET '.$this->forcecharset.' DEFAULT COLLATE '.$this->forcecollate;
-	    $ret=$this->query($sql);
+		// ALTER DATABASE dolibarr_db DEFAULT CHARACTER SET latin DEFAULT COLLATE latin1_swedish_ci
+		$sql = 'CREATE DATABASE '.$database;
+		$sql.= ' DEFAULT CHARACTER SET '.$this->forcecharset.' DEFAULT COLLATE '.$this->forcecollate;
+		$ret=$this->query($sql);
 		if (! $ret)
-			{
-			// On r�essaie pour compatibilit� avec Mysql < 4.1.1
+		{
+			// On r�essaie pour compatibilit� avec Mysql < 4.1.1
 			$sql = 'CREATE DATABASE '.$database;
 			$ret=$this->query($sql);
-			}
-	    return $ret;
+		}
+		return $ret;
 	}
 
 	/**
 		\brief     	Liste des tables dans une database.
 		\param	    database		Nom de la database
-		\param	    table   		Filtre sur tables � rechercher
+		\param	    table   		Filtre sur tables � rechercher
 		\return	    array			Tableau des tables de la base
-	*/
-    function DDLListTables($database, $table='')
-    {
+		*/
+	function DDLListTables($database, $table='')
+	{
 		$listtables=array();
-		
+
 		$like = '';
 		if ($table) $like = "LIKE '".$table."'";
 		$sql="SHOW TABLES FROM ".$database." ".$like.";";
@@ -727,22 +726,22 @@ class DoliDb
 			$listtables[] = $row[0];
 		}
 		return $listtables;
-    }
+	}
 
 	/**
-		\brief      Cr�e une table
+		\brief      Cr�e une table
 		\param	    table 			Nom de la table
 		\param	    fields 			Tableau associatif [nom champ][tableau des descriptions]
 		\param	    primary_key 	Nom du champ qui sera la clef primaire
 		\param	    unique_keys 	Tableau associatifs Nom de champs qui seront clef unique => valeur
-		\param	    fulltext 		Tableau des Nom de champs qui seront index�s en fulltext
-		\param	    key 			Tableau des champs cl�s noms => valeur
+		\param	    fulltext 		Tableau des Nom de champs qui seront index�s en fulltext
+		\param	    key 			Tableau des champs cl�s noms => valeur
 		\param	    type 			Type de la table
 		\return	    int				<0 si KO, >=0 si OK
-    */
+		*/
 	function DDLCreateTable($table,$fields,$primary_key,$type,$unique_keys="",$fulltext_keys="",$keys="")
 	{
-		// cl�s recherch�es dans le tableau des descriptions (fields) : type,value,attribute,null,default,extra
+		// cl�s recherch�es dans le tableau des descriptions (fields) : type,value,attribute,null,default,extra
 		// ex. : $fields['rowid'] = array('type'=>'int','value'=>'11','null'=>'not null','extra'=> 'auto_increment');
 		$sql = "create table ".$table."(";
 		$i=0;
@@ -763,14 +762,14 @@ class DoliDb
 			}
 			else if( eregi("^[^ ]",$field_desc['null']))
 			$sqlfields[$i]  .= " ".$field_desc['null'];
-	
+
 			else if( eregi("^[^ ]",$field_desc['extra']))
 			$sqlfields[$i]  .= " ".$field_desc['extra'];
 			$i++;
 		}
 		if($primary_key != "")
 		$pk = "primary key(".$primary_key.")";
-	
+
 		if($unique_keys != "")
 		{
 			$i = 0;
@@ -800,88 +799,88 @@ class DoliDb
 
 		dolibarr_syslog($sql);
 		if(! $this -> query($sql))
-			return -1;
+		return -1;
 		else
-			return 1;
+		return 1;
 	}
 
 	/**
-		\brief      d�crit une table dans une database.
+		\brief      d�crit une table dans une database.
 		\param	    table	Nom de la table
 		\param	    field	Optionnel : Nom du champ si l'on veut la desc d'un champ
 		\return	    resource
-	*/
+		*/
 	function DDLDescTable($table,$field="")
-    {
+	{
 		$sql="DESC ".$table." ".$field;
 
 		dolibarr_syslog($sql);
 		$this->results = $this->query($sql);
 		return $this->results;
-    }
+	}
 
 	/**
-		\brief      Ins�re un nouveau champ dans une table
+		\brief      Ins�re un nouveau champ dans une table
 		\param	    table 			Nom de la table
-		\param		field_name 		Nom du champ � ins�rer
-		\param	    field_desc 		Tableau associatif de description duchamp � ins�rer[nom du param�tre][valeur du param�tre]
+		\param		field_name 		Nom du champ � ins�rer
+		\param	    field_desc 		Tableau associatif de description duchamp � ins�rer[nom du param�tre][valeur du param�tre]
 		\param	    field_position 	Optionnel ex.: "after champtruc"
 		\return	    int				<0 si KO, >0 si OK
-    */
+		*/
 	function DDLAddField($table,$field_name,$field_desc,$field_position="")
 	{
-		// cl�s recherch�es dans le tableau des descriptions (field_desc) : type,value,attribute,null,default,extra
+		// cl�s recherch�es dans le tableau des descriptions (field_desc) : type,value,attribute,null,default,extra
 		// ex. : $field_desc = array('type'=>'int','value'=>'11','null'=>'not null','extra'=> 'auto_increment');
 		$sql= "ALTER TABLE ".$table." ADD ".$field_name." ";
 		$sql .= $field_desc['type'];
 		if( eregi("^[^ ]",$field_desc['value']))
-			$sql  .= "(".$field_desc['value'].")";
+		$sql  .= "(".$field_desc['value'].")";
 		if( eregi("^[^ ]",$field_desc['attribute']))
-			$sql  .= " ".$field_desc['attribute'];
+		$sql  .= " ".$field_desc['attribute'];
 		if( eregi("^[^ ]",$field_desc['null']))
-			$sql  .= " ".$field_desc['null'];
+		$sql  .= " ".$field_desc['null'];
 		if( eregi("^[^ ]",$field_desc['default']))
-			if(eregi("null",$field_desc['default']))
-				$sql  .= " default ".$field_desc['default'];
-			else
-				$sql  .= " default '".$field_desc['default']."'";
+		if(eregi("null",$field_desc['default']))
+		$sql  .= " default ".$field_desc['default'];
+		else
+		$sql  .= " default '".$field_desc['default']."'";
 		if( eregi("^[^ ]",$field_desc['extra']))
-			$sql  .= " ".$field_desc['extra'];
+		$sql  .= " ".$field_desc['extra'];
 		$sql .= " ".$field_position;
 
 		if(! $this -> query($sql))
-			return -1;
+		return -1;
 		else
-			return 1;
+		return 1;
 	}
 
 	/**
-			\brief      Create a user
-			\param	    dolibarr_main_db_host 		Ip serveur
-			\param	    dolibarr_main_db_user 		Nom user � cr�er
-			\param	    dolibarr_main_db_pass 		Mot de passe user � cr�er
-			\param		dolibarr_main_db_name		Database name where user must be granted
-			\return	    int							<0 si KO, >=0 si OK
-	*/
+	 \brief      Create a user
+	 \param	    dolibarr_main_db_host 		Ip serveur
+	 \param	    dolibarr_main_db_user 		Nom user � cr�er
+	 \param	    dolibarr_main_db_pass 		Mot de passe user � cr�er
+	 \param		dolibarr_main_db_name		Database name where user must be granted
+	 \return	    int							<0 si KO, >=0 si OK
+	 */
 	function DDLCreateUser($dolibarr_main_db_host,$dolibarr_main_db_user,$dolibarr_main_db_pass,$dolibarr_main_db_name)
 	{
 		$sql = "INSERT INTO user ";
 		$sql.= "(Host,User,password,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Index_Priv,Alter_priv)";
 		$sql.= " VALUES ('$dolibarr_main_db_host','$dolibarr_main_db_user',password('$dolibarr_main_db_pass')";
 		$sql.= ",'Y','Y','Y','Y','Y','Y','Y','Y');";
-		
+
 		dolibarr_syslog("mysqli.lib::DDLCreateUser sql=".$sql);
 		$resql=$this->query($sql);
 		if (! $resql)
 		{
 			return -1;
 		}
-		
+
 		$sql = "INSERT INTO db ";
 		$sql.= "(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Index_Priv,Alter_priv)";
 		$sql.= " VALUES ('$dolibarr_main_db_host','$dolibarr_main_db_name','$dolibarr_main_db_user'";
 		$sql.= ",'Y','Y','Y','Y','Y','Y','Y','Y');";
-		
+
 		dolibarr_syslog("mysqli.lib::DDLCreateUser sql=".$sql);
 		$resql=$this->query($sql);
 		if (! $resql)
@@ -893,77 +892,77 @@ class DoliDb
 
 		dolibarr_syslog("mysqli.lib::DDLCreateUser sql=".$sql);
 		$resql=$this->query($sql);
-	
+
 		return 1;
 	}
-	
+
 	/**
-	*	\brief		Return charset used to store data in database
-	*	\return		string		Charset
-	*/
+	 *	\brief		Return charset used to store data in database
+	 *	\return		string		Charset
+	 */
 	function getDefaultCharacterSetDatabase(){
-		 $resql=$this->query('SHOW VARIABLES LIKE \'character_set_database\'');
-		  if (!$resql)
-	      {
+		$resql=$this->query('SHOW VARIABLES LIKE \'character_set_database\'');
+		if (!$resql)
+		{
 			// version Mysql < 4.1.1
 			return $this->forcecharset;
-	      }
-	    $liste=$this->fetch_array($resql);
-	    return $liste['Value'];
+		}
+		$liste=$this->fetch_array($resql);
+		return $liste['Value'];
 	}
-	
+
 	function getListOfCharacterSet(){
-		 $resql=$this->query('SHOW CHARSET');
+		$resql=$this->query('SHOW CHARSET');
 		$liste = array();
-		if ($resql) 
-			{
+		if ($resql)
+		{
 			$i = 0;
 			while ($obj = $this->fetch_object($resql) )
 			{
 				$liste[$i]['charset'] = $obj->Charset;
 				$liste[$i]['description'] = $obj->Description;
-				$i++;           
-			}   
-	    	$this->free($resql);
-	  	} else {
-	  		// version Mysql < 4.1.1
-	   		return null;
-	  	}
-    	return $liste;
-	}
-	
-	/**
-	*	\brief		Return collation used in database
-	*	\return		string		Collation value
-	*/
+				$i++;
+			}
+			$this->free($resql);
+		} else {
+			// version Mysql < 4.1.1
+			return null;
+		}
+		return $liste;
+	}
+
+	/**
+	 *	\brief		Return collation used in database
+	 *	\return		string		Collation value
+	 */
 	function getDefaultCollationDatabase(){
 		$resql=$this->query('SHOW VARIABLES LIKE \'collation_database\'');
-		 if (!$resql)
-	      {
+		if (!$resql)
+		{
 			// version Mysql < 4.1.1
 			return $this->forcecollate;
-	      }
-	    $liste=$this->fetch_array($resql);
-	    return $liste['Value'];
+		}
+		$liste=$this->fetch_array($resql);
+		return $liste['Value'];
 	}
-	
+
 	function getListOfCollation(){
-		 $resql=$this->query('SHOW COLLATION');
+		$resql=$this->query('SHOW COLLATION');
 		$liste = array();
-		if ($resql) 
-			{
+		if ($resql)
+		{
 			$i = 0;
 			while ($obj = $this->fetch_object($resql) )
 			{
 				$liste[$i]['collation'] = $obj->Collation;
-				$i++;           
-			}   
-	    	$this->free($resql);
-	  	} else {
-	  		// version Mysql < 4.1.1
-	   		return null;
-	  	}
-    	return $liste;
+				$i++;
+			}
+			$this->free($resql);
+		} else {
+			// version Mysql < 4.1.1
+			return null;
+		}
+		return $liste;
 	}
 }
 
diff --git a/htdocs/lib/databases/pgsql.lib.php b/htdocs/lib/databases/pgsql.lib.php
index 5e7809564d6868ced349d6b7f88ac83a55c09511..18f9f7324e0807560afb07ade6253a07ecb150e6 100644
--- a/htdocs/lib/databases/pgsql.lib.php
+++ b/htdocs/lib/databases/pgsql.lib.php
@@ -22,17 +22,17 @@
 
 /**
 	    \file       htdocs/lib/databases/pgsql.lib.php
-		\brief      Fichier de la classe permettant de g�r�r une base pgsql
+		\brief      Fichier de la classe permettant de g�r�r une base pgsql
 		\version	$Id$
 */
-// Pour compatibilit� lors de l'upgrade
+// For compatibility during upgrade
 if (! defined('DOL_DOCUMENT_ROOT'))	 define('DOL_DOCUMENT_ROOT', '../..');
 if (! defined('ADODB_DATE_VERSION')) include_once(DOL_DOCUMENT_ROOT."/includes/adodbtime/adodb-time.inc.php");
 
 
 /**
         \class      DoliDb
-        \brief      Classe permettant de g�r�r la database de dolibarr
+        \brief      Classe permettant de g�r�r la database de dolibarr
 */
 class DoliDb
 {
@@ -42,11 +42,11 @@ class DoliDb
     var $forcecharset='latin1';
 	var $versionmin=array(8,1,0);	// Version min database
 
-    var $results;                 // Resultset de la derni�re requete
+    var $results;                 // Resultset de la derni�re requete
 
-    var $connected;               // 1 si connect�, 0 sinon
-    var $database_selected;       // 1 si base s�lectionn�, 0 sinon
-    var $database_name;			  // Nom base s�lectionn�e
+    var $connected;               // 1 si connect�, 0 sinon
+    var $database_selected;       // 1 si base s�lectionn�, 0 sinon
+    var $database_name;			  // Nom base s�lectionn�e
     var $database_user;	   //! Nom user base
     var $transaction_opened;      // 1 si une transaction est en cours, 0 sinon
     var $lastquery;
@@ -60,30 +60,18 @@ class DoliDb
 
     /**
         \brief      Ouverture d'une connexion vers le serveur et une database.
-        \param		type		type de base de donn�es (mysql ou pgsql)
-        \param		host		addresse de la base de donn�es
-    	\param	    user		nom de l'utilisateur autoris�
+        \param		type		type de base de donn�es (mysql ou pgsql)
+        \param		host		addresse de la base de donn�es
+    	\param	    user		nom de l'utilisateur autoris�
         \param		pass		mot de passe
         \param		name		nom de la database
 		\param	    port		Port of database server
-        \return		int			1 en cas de succ�s, 0 sinon
+        \return		int			1 en cas de succ�s, 0 sinon
     */
     function DoliDb($type='pgsql', $host, $user, $pass, $name='', $port=0)
     {
     	global $conf,$langs;
 
-        /* Ce test est inutile. En effet, si DOL_DOCUMENT_ROOT est d�fini, cela signifie      */
-		/* obligatoirement que le fichier conf a deja �t� charg�e puisque cette constante est */
-		/* definie a partir du contenu du fichier conf.php                                    */
-		/* Et toutes les infos sont charg�s dans l'objet conf                                 */
-		/*
-        if (file_exists($conffile)) {
-	    	include($conffile);
-	    	$this->forcecharset=$character_set_database;
-	    	$this->forcecollate=$dolibarr_main_db_collation;
-	    	$this->db_user=$dolibarr_main_db_user;
-		}
-		*/
 		$this->forcecharset=$conf->character_set_client;
 	    $this->forcecollate=$conf->db->dolibarr_main_db_collation;
 	    $this->database_user=$user;
@@ -127,7 +115,7 @@ class DoliDb
             dolibarr_syslog("DoliDB::DoliDB : Erreur Connect ".$this->error,LOG_ERR);
         }
 
-        // Si connexion serveur ok et si connexion base demand�e, on essaie connexion base
+        // Si connexion serveur ok et si connexion base demand�e, on essaie connexion base
         if ($this->connected && $name)
         {
             if ($this->select_db($name))
@@ -147,19 +135,30 @@ class DoliDb
         }
         else
         {
-            // Pas de selection de base demand�e, ok ou ko
+            // Pas de selection de base demandee, ok ou ko
             $this->database_selected = 0;
         }
 
         return $this->ok;
     }
 
+    
+    /**
+	 *	\brief		Convert a SQL request in mysql syntax to database syntax
+	 * 	\param		request		SQL request to convert
+	 * 	\return		string		SQL request converted
+	 */
+	function convertSQLFromMysql($request)
+	{
+		return $request;
+	}
+        
     /**
         \brief      Selectionne une database.
         \param		database		nom de la database
         \return		boolean         true si ok, false si ko
         \remarks 	Ici postgresql n'a aucune fonction equivalente de mysql_select_db
-        \remarks 	On compare juste manuellement si la database choisie est bien celle activ�e par la connexion
+        \remarks 	On compare juste manuellement si la database choisie est bien celle activ�e par la connexion
     */
     function select_db($database)
     {
@@ -171,12 +170,12 @@ class DoliDb
 
     /**
         \brief      Connection vers le serveur
-        \param		host		addresse de la base de donn�es
+        \param		host		addresse de la base de donn�es
         \param		login		nom de l'utilisateur autoris
         \param		passwd		mot de passe
         \param		name		nom de la database (ne sert pas sous mysql, sert sous pgsql)
 		\param		port		Port of database server
-        \return		resource	handler d'acc�s � la base
+        \return		resource	handler d'acc�s � la base
     */
     function connect($host, $login, $passwd, $name, $port=0)
     {
@@ -308,7 +307,7 @@ class DoliDb
 
 
     /**
-        \brief      Effectue une requete et renvoi le resultset de r�ponse de la base
+        \brief      Effectue une requete et renvoi le resultset de r�ponse de la base
         \param		query		Contenu de la query
         \return	    resource    Resultset de la reponse
     */
@@ -343,31 +342,31 @@ class DoliDb
     */
     function fetch_object($resultset=0)
     {
-        // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
+        // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
         if (! is_resource($resultset)) { $resultset=$this->results; }
         return pg_fetch_object($resultset);
     }
 
     /**
-        \brief      Renvoie les donn�es dans un tableau.
+        \brief      Renvoie les donn�es dans un tableau.
         \param      resultset   Curseur de la requete voulue
         \return		array
     */
     function fetch_array($resultset=0)
     {
-        // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
+        // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
         if (! is_resource($resultset)) { $resultset=$this->results; }
         return pg_fetch_array($resultset);
     }
 
     /**
-        \brief      Renvoie les donn�es comme un tableau.
+        \brief      Renvoie les donn�es comme un tableau.
         \param      resultset   Curseur de la requete voulue
         \return	    array
     */
     function fetch_row($resultset=0)
     {
-        // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
+        // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
         if (! is_resource($resultset)) { $resultset=$this->results; }
         return pg_fetch_row($resultset);
     }
@@ -380,7 +379,7 @@ class DoliDb
     */
     function num_rows($resultset=0)
     {
-        // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
+        // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
         if (! is_resource($resultset)) { $resultset=$this->results; }
         return pg_num_rows($resultset);
     }
@@ -393,7 +392,7 @@ class DoliDb
     */
     function affected_rows($resultset=0)
     {
-        // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
+        // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
         if (! is_resource($resultset)) { $resultset=$this->results; }
         // pgsql necessite un resultset pour cette fonction contrairement
         // a mysql qui prend un link de base
@@ -402,22 +401,22 @@ class DoliDb
 
 
     /**
-        \brief      Lib�re le dernier resultset utilis� sur cette connexion.
+        \brief      Lib�re le dernier resultset utilis� sur cette connexion.
         \param      resultset   Curseur de la requete voulue
     */
     function free($resultset=0)
     {
-        // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
+        // Si le resultset n'est pas fourni, on prend le dernier utilis� sur cette connexion
         if (! is_resource($resultset)) { $resultset=$this->results; }
-        // Si resultset en est un, on libere la m�moire
+        // Si resultset en est un, on libere la m�moire
         if (is_resource($resultset)) pg_free_result($resultset);
     }
 
 
     /**
-        \brief      D�fini les limites de la requ�te.
-        \param	    limit       nombre maximum de lignes retourn�es
-        \param	    offset      num�ro de la ligne � partir de laquelle recup�rer les lignes
+        \brief      D�fini les limites de la requ�te.
+        \param	    limit       nombre maximum de lignes retourn�es
+        \param	    offset      num�ro de la ligne � partir de laquelle recup�rer les lignes
         \return	    string      chaine exprimant la syntax sql de la limite
     */
     function plimit($limit=0,$offset=0)
@@ -430,7 +429,7 @@ class DoliDb
 
 
 	/**
-        \brief      D�fini le tri de la requ�te.
+        \brief      D�fini le tri de la requ�te.
         \param	    sortfield   liste des champ de tri
         \param	    sortorder   ordre du tri
         \return	    string      chaine exprimant la syntax sql de l'ordre de tri
@@ -471,10 +470,10 @@ class DoliDb
 
 
     /**
-    *   \brief      Formatage (par la base de donn�es) d'un champ de la base au format tms ou Date (YYYY-MM-DD HH:MM:SS)
-    *               afin de retourner une donn�e toujours au format universel date tms unix.
-    *               Fonction � utiliser pour g�n�rer les SELECT.
-    *   \param	    param       Date au format text � convertir
+    *   \brief      Formatage (par la base de donn�es) d'un champ de la base au format tms ou Date (YYYY-MM-DD HH:MM:SS)
+    *               afin de retourner une donn�e toujours au format universel date tms unix.
+    *               Fonction � utiliser pour g�n�rer les SELECT.
+    *   \param	    param       Date au format text � convertir
     *   \return	    date        Date au format tms.
     */
     function pdate($param)
@@ -484,8 +483,8 @@ class DoliDb
 
     /**
         \brief      Formatage (par PHP) de la date en texte qui s'insere dans champ date.
-                    Fonction � utiliser pour g�n�rer les INSERT.
-        \param	    param       Date tms � convertir
+                    Fonction � utiliser pour g�n�rer les INSERT.
+        \param	    param       Date tms � convertir
         \return	    date        Date au format text YYYYMMDDHHMMSS.
     */
     function idate($param)
@@ -499,7 +498,7 @@ class DoliDb
         \param		test            chaine test
         \param		resok           resultat si test egal
         \param		resko           resultat si test non egal
-        \return		string          chaine format� SQL
+        \return		string          chaine format� SQL
     */
     function ifsql($test,$resok,$resko)
     {
@@ -549,8 +548,8 @@ class DoliDb
     */
     function errno()
     {
-        static $error_regexps;
-        if (empty($error_regexps)) {
+        if (empty($error_regexps))
+        {
             $error_regexps = array(
                 '/(Table does not exist\.|Relation [\"\'].*[\"\'] does not exist|sequence does not exist|class ".+" not found)$/' => 'DB_ERROR_NOSUCHTABLE',
                 '/table [\"\'].*[\"\'] does not exist/' => 'DB_ERROR_NOSUCHTABLE',
@@ -581,8 +580,8 @@ class DoliDb
     }
 
     /**
-        \brief      R�cup�re l'id gen�r� par le dernier INSERT.
-        \param     	tab     Nom de la table concern�e par l'insert. Ne sert pas sous MySql mais requis pour compatibilit� avec Postgresql
+        \brief      R�cup�re l'id gen�r� par le dernier INSERT.
+        \param     	tab     Nom de la table concern�e par l'insert. Ne sert pas sous MySql mais requis pour compatibilit� avec Postgresql
         \return     int     id
     */
     function last_insert_id($tab)
@@ -609,9 +608,9 @@ class DoliDb
 
 
     /**
-            \brief          Cr�ation d'une nouvelle base de donn�e
-            \param	        database		nom de la database � cr�er
-            \return	        resource		resource d�finie si ok, null si ko
+            \brief          Cr�ation d'une nouvelle base de donn�e
+            \param	        database		nom de la database � cr�er
+            \return	        resource		resource d�finie si ok, null si ko
             \remarks        Ne pas utiliser les fonctions xxx_create_db (xxx=mysql, ...) car elles sont deprecated
     */
     function DDLCreateDb($database)
@@ -635,8 +634,8 @@ class DoliDb
 	/**
 			\brief      Create a user
 			\param	    dolibarr_main_db_host 		Ip serveur
-			\param	    dolibarr_main_db_user 		Nom user � cr�er
-			\param	    dolibarr_main_db_pass 		Mot de passe user � cr�er
+			\param	    dolibarr_main_db_user 		Nom user � cr�er
+			\param	    dolibarr_main_db_pass 		Mot de passe user � cr�er
 			\param		dolibarr_main_db_name		Database name where user must be granted
 			\return	    int							<0 si KO, >=0 si OK
 	*/