diff --git a/htdocs/ajaxbox.php b/htdocs/ajaxbox.php
new file mode 100644
index 0000000000000000000000000000000000000000..12b6adfde7397eb54df0c7f5d9f57f04a6a423e3
--- /dev/null
+++ b/htdocs/ajaxbox.php
@@ -0,0 +1,46 @@
+<?php
+/* Copyright (C) 2005-2007 Regis Houssin        <regis.houssin@cap-networks.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id$
+ * $Source$
+ */
+
+/**
+        \file       htdocs/ajaxbox.php
+        \brief      Fichier de reponse sur evenement Ajax
+        \version    $Revision$
+*/
+
+require('master.inc.php');
+require_once(DOL_DOCUMENT_ROOT."/boxes.php");
+
+// Enregistrement de la position des boxes
+if((isset($_GET['boxorder']) && !empty($_GET['boxorder'])) && (isset($_GET['boxid']) && !empty($_GET['boxid'])) && (isset($_GET['userid']) && !empty($_GET['userid'])))
+{
+	$infobox=new InfoBox($db);
+	
+	dolibarr_syslog("InfoBox::Ajax.Request list=".$_GET['boxorder']." boxid=".$_GET['boxid']." userid=".$_GET['userid'], LOG_DEBUG);
+	
+	$boxid = explode(',',$_GET['boxid']);
+	$boxorder = explode(',',$_GET['boxorder']);
+	
+	$infobox->saveboxorder("0",$boxid,$boxorder,$_GET['userid']);
+
+}
+
+
+?>
diff --git a/htdocs/boxes.php b/htdocs/boxes.php
index 8726fe8e324160e037c9b01490ff13f58883953f..86b3c58efab05bcd7e3f8992487a141ce89ac26d 100644
--- a/htdocs/boxes.php
+++ b/htdocs/boxes.php
@@ -147,18 +147,21 @@ class InfoBox
     /**
      *      \brief      Sauvegarde sequencement des boites pour la zone et le user
      *      \param      $zone       ID de la zone (0 pour la Homepage, ...)
-     *      \param      $boxarray	Tableau des boites dans le bon ordre
-     *      \param      $user		Objet user
-     *      \return     int			<0 si ko, >= 0 si ok
+     *      \param      $boxid      Id des boites
+     *      \param      $boxorder  Liste des boites dans le bon ordre
+     *      \param      $userid     Id du user
+     *      \return     int         <0 si ko, >= 0 si ok
      */
-	function saveboxorder($zone,$boxarray,$user)
+	function saveboxorder($zone,$boxid,$boxorder,$userid=0)
 	{
-		dolibarr_syslog("InfoBoxes::saveboxorder zone=".$zone." user=".$user->id);
+		dolibarr_syslog("InfoBoxes::saveboxorder zone=".$zone." user=".$userid);
 
-		if (! is_object($user) || ! $user->id) return 0;
+		if (! $userid || $userid == 0) return 0;
+		
+		$user = new User($this->db,$userid);
 
 		$this->db->begin();
-		
+
 		// Sauve parametre indiquant que le user a une 
 		$confuserzone='MAIN_BOXES_'.$zone;
 		$tab[$confuserzone]=1;
@@ -170,24 +173,22 @@ class InfoBox
  		}
 		
 		$sql ="DELETE FROM ".MAIN_DB_PREFIX."boxes";
-		$sql.=" WHERE fk_user = ".$user->id;
+		$sql.=" WHERE fk_user = ".$userid;
 		$sql.=" AND position = ".$zone;
 		$result = $this->db->query($sql);
 		if ($result)
 		{
-			for ($ii=0, $ni=sizeof($boxarray); $ii < $ni; $ii++)
+			for ($ii=0, $ni=sizeof($boxid); $ii < $ni; $ii++)
 			{
-				//print "box_id".$boxarray[$ii]->box_id.'<br>';
-				//print "box_order".$boxarray[$ii]->box_order.'<br>';
-		        $sql = "INSERT INTO ".MAIN_DB_PREFIX."boxes";
-		        $sql.= "(box_id, position, box_order, fk_user)";
-		        $sql.= " values (";
-		        $sql.= " ".$boxarray[$ii]->box_id.",";
-		        $sql.= " ".$zone.",";
-		        $sql.= " ".$boxarray[$ii]->box_order.",";
-		        $sql.= " ".$user->id;
-		        $sql.= ")";
-		        $result = $this->db->query($sql);
+				$sql = "INSERT INTO ".MAIN_DB_PREFIX."boxes";
+		    $sql.= "(box_id, position, box_order, fk_user)";
+		    $sql.= " values (";
+		    $sql.= " ".$boxid[$ii].",";
+		    $sql.= " ".$zone.",";
+		    $sql.= " ".$boxorder[$ii].",";
+		    $sql.= " ".$userid;
+		    $sql.= ")";
+		    $result = $this->db->query($sql);
 				if ($result < 0)
 				{
 					$error++;
diff --git a/htdocs/index.php b/htdocs/index.php
index a11c06db02a875d63b9eddaa44de3d68a32dad72..92f9da443ae0d9d706898ace620ffc22febfa4bf 100644
--- a/htdocs/index.php
+++ b/htdocs/index.php
@@ -539,109 +539,100 @@ print '</td></tr></table>';
  *
  */
 $boxarray=$infobox->listboxes("0",$user);       // 0=valeur pour la page accueil
-$boxjavascriptids=array();
-//print_r($boxarray);
-
-// Gestion deplacement des boxes
-if (eregi('boxobject_([0-9]+)',$_GET["switchfrom"],$regfrom)
-	&& eregi('boxto_([0-9]+)',$_GET["switchto"],$regto))
-{
-	/*
-	print "Modif ordre box: ";
-	print $boxarray[$regfrom[1]]->box_id."(".$boxarray[$regfrom[1]]->box_order.")";
-	print " <-> ";
-	print $boxarray[$regto[1]]->box_id."(".$boxarray[$regto[1]]->box_order.")";
-	print "<br>\n";
-	*/
-	
-	// Permutation boites
-	$switchii=$boxarray[$regto[1]];
-	$boxarray[$regto[1]]=$boxarray[$regfrom[1]];
-	$boxarray[$regfrom[1]]=$switchii;
-
-	// Permutation box_order
-	$switchbox_order=$boxarray[$regto[1]]->box_order;
-	$boxarray[$regto[1]]->box_order=$boxarray[$regfrom[1]]->box_order;
-	$boxarray[$regfrom[1]]->box_order=$switchbox_order;
-
-	/*
-	print "Modif ordre box: ";
-	print $boxarray[$regfrom[1]]->box_id."(".$boxarray[$regfrom[1]]->box_order.")";
-	print " <-> ";
-	print $boxarray[$regto[1]]->box_id."(".$boxarray[$regto[1]]->box_order.")";
-	print "<br>\n";
-	*/
-	
-	// Sauvegarde nouvel ordre pour l'utilisateur
-	$result=$infobox->saveboxorder("0",$boxarray,$user);
-	if ($result < 0)
-	{
-		dolibarr_print_error($db,$infobox->error);	
-	}
-}
-
-
-$NBCOLS=2;      // Nombre de colonnes pour les boites
 
 if (sizeof($boxarray))
 {
 	print '<br>';
 	print_fiche_titre($langs->trans("OtherInformationsBoxes"));
 	print '<table width="100%" class="notopnoleftnoright">';
+	print '<td>'."\n";
+	
+	$box_id = Array();
+	
+	// Cr�ation de la liste des id
 	for ($ii=0, $ni=sizeof($boxarray); $ii < $ni; $ii++)
 	{
-		$boxjavascriptids[$ii]='"box_'.$ii.'"';
-	
-		if ($ii % $NBCOLS == 0) print "<tr>\n";
-		print '<td valign="top" width="50%">';
-		print '<div id="boxto_'.$ii.'">';
+		//print 'box_id '.$boxarray[$ii]->box_id.' ';
+		//print 'box_order '.$boxarray[$ii]->box_order.'<br>';
 		
-		if ($conf->use_ajax && $conf->browser->firefox)
+		$box_id[$ii] = $boxarray[$ii]->box_id;
+	}
+	$boxid = join(',',$box_id);
+	
+	// Affichage colonne gauche (boites paires)
+	print '<div id="left"  style="width: 50%; padding: 0px; margin: 0px; float: left;">'."\n";
+	for ($ii=0, $ni=sizeof($boxarray); $ii < $ni; $ii++)
+	{
+		if ($ii%2 != 1)
 		{
-			print '<ul class="nocellnopadd" height="100px" id="box_'.$ii.'">';
-			print '<li class="nocellnopadd" height="100px">';
-		}
-		// Affichage boite ii
-		$box=$boxarray[$ii];
-		$box->loadBox();
-		$box->boxid="$ii";
-		$box->showBox();
-		if ($conf->use_ajax && $conf->browser->firefox)
+			print '<div id="boxto_'.$ii.'">';
+			
+			// Affichage boite ii
+			$box=$boxarray[$ii];
+			$box->loadBox();
+			$box->boxid="$ii";
+			$box->showBox();
+			
+			print '</div>';
+    }
+	}
+  print '</div>';
+  print "\n";
+  
+  // Affichage colonne droite (boites impaires)
+  print '<div id="right" style="width: 50%; padding: 0px; margin: 0px; float: left;">'."\n";
+	for ($ii=0, $ni=sizeof($boxarray); $ii < $ni; $ii++)
+	{
+		if ($ii%2 == 1)
 		{
-			print '</li>';
-			print '</ul>';
-		}
-		
-		print '</div>';
-		print "</td>";
-		if ($ii % $NBCOLS == ($NBCOLS-1)) print "</tr>\n";
+			print '<div id="boxto_'.$ii.'">';
+			
+			// Affichage boite ii
+			$box=$boxarray[$ii];
+			$box->loadBox();
+			$box->boxid="$ii";
+			$box->showBox();
+			
+			print '</div>';
+    }
 	}
+  print '</div>';
+  print "\n";
 
-    if ($ii % $NBCOLS == ($NBCOLS-1)) print "</tr>\n";
-    print "</table>";
+  print "</td></tr>";
+  print "</table>";
 }
 
 if ($conf->use_ajax && $conf->browser->firefox)
 {
-	print '<script type="text/javascript" language="javascript">'."\n";
+	print '<script type="text/javascript" language="javascript">
+	function updateOrder(){
+    var left_list = cleanSerialize(Sortable.serialize(\'left\'));
+    var right_list = cleanSerialize(Sortable.serialize(\'right\'));
+    var boxid = \''.$boxid.'\';
+    var boxorder = left_list + \',\' + right_list;
+    var userid = \''.$user->id.'\';
+    var url = "ajaxbox.php";
+    o_options = new Object();
+    o_options = {asynchronous:true,method: \'get\',parameters: \'boxorder=\' + boxorder + \'&boxid=\' + boxid + \'&userid=\' + userid};
+    var myAjax = new Ajax.Request(url, o_options);
+  }'."\n";
 	print '// <![CDATA['."\n";
-	for ($ii=0, $ni=sizeof($boxarray); $ii < $ni; $ii++)
-	{
-		/*
-		print 'Sortable.create(';
-		print '\'box_'.$ii.'\', ';
-		print '{hoverclass:\'grey\', ';
-		print 'onUpdate:function(element, dropon, event){ alert( "X "+element+" Z " ); }, ';
-		print 'ghosting:true, dropOnEmpty:true, ';
-		print 'containment:['.join(',',$boxjavascriptids).'], ';
-		print 'constraint:false}';
-		print ");\n";
-		*/
-		print 'new Draggable(\'boxobject_'.$ii.'\', {revert:false});'."\n";
-		//print 'Droppables.add(\'boxto_'.$ii.'\', {onDrop:function(element,dropon){alert(\'From: \' + encodeURIComponent(element.id) + \' - To: \' + encodeURIComponent(dropon.id))}});'."\n";
-		print 'Droppables.add(\'boxto_'.$ii.'\', {onDrop:function(element,dropon){ window.location.href=\''.$_SERVER["PHP_SELF"].'?switchfrom=\'+encodeURIComponent(element.id)+\'&switchto=\'+encodeURIComponent(dropon.id); }});'."\n";
-		//print 'Droppables.add(\'box_'.$ii.'\', {onDrop:function(element,dropon){alert(\'w/o hoverclass, should be:\' + encodeURIComponent(element.id) )}});'."\n";
-	}
+
+	print 'Sortable.create(\'left\', {'."\n";
+	print 'tag:\'div\', '."\n";
+	print 'containment:["left","right"], '."\n";
+	print 'constraint:false, '."\n";
+	print 'onUpdate:updateOrder';
+	print "});\n";
+		
+	print 'Sortable.create(\'right\', {'."\n";
+	print 'tag:\'div\', '."\n";
+	print 'containment:["right","left"], '."\n";
+	print 'constraint:false, '."\n";
+	print 'onUpdate:updateOrder';
+	print "});\n";
+		
 	print '// ]]>'."\n";
 	print '</script>'."\n";
 }
@@ -656,14 +647,4 @@ if (! $conf->browser->firefox)
 $db->close();
 
 llxFooter('$Date$ - $Revision$');
-?>
-
-
-
-
-
-
-
-
-
-
+?>
\ No newline at end of file
diff --git a/htdocs/lib/lib_head.js b/htdocs/lib/lib_head.js
index eaab6dbf38fdca9c206636e7feca248351661ea8..3bc7543d9365c9c007bf999a04d58aae466160bd 100644
--- a/htdocs/lib/lib_head.js
+++ b/htdocs/lib/lib_head.js
@@ -634,4 +634,18 @@ function ac_return(field, item){
  function ac_delay(funct,delay) {
  	// d�lai exprim� en millisecondes avant le d�clenchement de l'action
   setTimeout(funct,delay);
+}
+
+/*=================================================================
+	Purpose:  Nettoie les valeurs d'un "Sortable.serialize"
+	Input:    expr
+	Author:   Regis Houssin
+	Licence:  GPL
+==================================================================*/
+function cleanSerialize(expr) {
+	var reg = new RegExp("(&)", "g");
+	var reg2 = new RegExp("[^0-9,]", "g");
+	var liste1 = expr.replace(reg, ",");
+	var liste = liste1.replace(reg2, "");
+	return liste;
 }
\ No newline at end of file