Index: /FCKeditor/trunk/editor/plugins/dragresizetable/fckplugin.js
===================================================================
--- /FCKeditor/trunk/editor/plugins/dragresizetable/fckplugin.js	(revision 695)
+++ /FCKeditor/trunk/editor/plugins/dragresizetable/fckplugin.js	(revision 696)
@@ -10,4 +10,5 @@
 	"_MaximumX" : null,
 	"_LastX" : null,
+	"_TableMap" : null,
 	"_IsInsideNode" : function( w, domNode, pos )
 	{
@@ -21,5 +22,5 @@
 		return false;
 	},
-	"_GetBorderCells" : function( w, tableNode, mouse )
+	"_GetBorderCells" : function( w, tableNode, tableMap, mouse )
 	{
 		// Enumerate all the cells in the table.
@@ -56,4 +57,5 @@
 			}
 		}
+		/*
 		var rowNode = FCKTools.GetElementAscensor( rbCell, "tr" ) ;
 		var cellIndex = rbCell.cellIndex + 1 ;
@@ -61,4 +63,12 @@
 			return null ;
 		lbCell = rowNode.cells.item( cellIndex ) ;
+		*/
+		var rowIdx = rbCell.parentNode.rowIndex ;
+		var colIdx = FCKTableHandler._GetCellIndexSpan( tableMap, rowIdx, rbCell ) ;
+		var colSpan = isNaN( rbCell.colSpan ) ? 1 : rbCell.colSpan ;
+		lbCell = tableMap[rowIdx][colIdx + colSpan] ;
+		
+		if ( ! lbCell )
+			return null ;
 
 		// Abort if too far from the border.
@@ -73,14 +83,6 @@
 	"_GetResizeBarPosition" : function()
 	{
-		var row = FCKTools.GetElementAscensor( this._LeftCell, "tr" ) ;
-		var colIndex = 0 ;
-		for ( var i = 0 ; i <= this._LeftCell.cellIndex ; i++ )
-		{
-			var colSpan = row.cells.item( i ).colSpan ;
-			if ( isNaN( colSpan ) )
-				colSpan = 1 ;
-			colIndex += colSpan ;
-		}
-		return colIndex ;
+		var row = FCKTools.GetElementAscensor( this._RightCell, "tr" ) ;
+		return FCKTableHandler._GetCellIndexSpan( this._TableMap, row.rowIndex, this._RightCell ) ;
 	},
 	"_ResizeBarMouseDownListener" : function( evt )
@@ -102,28 +104,18 @@
 		var minX = null ;
 		var maxX = null ;
-		for ( var r = 0 ; r < table.rows.length ; r++ )
-		{
-			var row = table.rows.item( r ) ;
-			var colIndex = 0 ;
-			for ( var c = 0 ; c < row.cells.length ; c++ )
-			{
-				var cell = row.cells.item( c ) ;
-				var cellPosition = FCKTools.GetWindowPosition( FCK.EditorWindow, cell ) ;
-				var cellPadding = FCKDragTableHandler._GetCellPadding( table, cell ) ;
-				var cellMinX = cellPosition.x + cellPadding ;
-				var cellMaxX = cellPosition.x + cell.clientWidth - cellPadding ;
-				if ( colIndex < borderIndex )
-				{
-					if ( minX == null || cellMinX > minX )
-						minX = cellMinX ;
-				}
-				else
-				{
-					if ( maxX == null || cellMaxX < maxX )
-						maxX = cellMaxX ;
-				}
-				colIndex += cell.colSpan ;
-			}
-		}
+		for ( var r = 0 ; r < FCKDragTableHandler._TableMap.length ; r++ )
+		{
+			var leftCell = FCKDragTableHandler._TableMap[r][borderIndex - 1] ;
+			var rightCell = FCKDragTableHandler._TableMap[r][borderIndex] ;
+			var leftPosition = FCKTools.GetWindowPosition( FCK.EditorWindow, leftCell ) ;
+			var rightPosition = FCKTools.GetWindowPosition( FCK.EditorWindow, rightCell ) ;
+			var leftPadding = FCKDragTableHandler._GetCellPadding( table, leftCell ) ;
+			var rightPadding = FCKDragTableHandler._GetCellPadding( table, rightCell ) ;
+			if ( minX == null || leftPosition.x + leftPadding > minX )
+				minX = leftPosition.x + leftPadding ;
+			if ( maxX == null || rightPosition.x + rightCell.clientWidth - rightPadding < maxX )
+				maxX = rightPosition.x + rightCell.clientWidth - rightPadding ;
+		}
+
 		FCKDragTableHandler._MinimumX = minX + offset.x ;
 		FCKDragTableHandler._MaximumX = maxX + offset.x ;
@@ -147,33 +139,23 @@
 		var table = FCKTools.GetElementAscensor( FCKDragTableHandler._LeftCell, "table" ) ;
 		var colArray = [] ;
-		for ( var r = 0 ; r < table.rows.length ; r++ )
-		{
-			var colIndex = 0 ;
-			var row = table.rows.item( r ) ;
-			for ( var c = 0 ; c < row.cells.length ; c++ )
-			{
-				var cell = row.cells.item( c ) ;
+		var tableMap = FCKDragTableHandler._TableMap ;
+		for ( var i = 0 ; i < tableMap.length ; i++ )
+		{
+			for ( var j = 0 ; j < tableMap[i].length ; j++ )
+			{
+				var cell = tableMap[i][j] ;
 				var width = FCKDragTableHandler._GetCellWidth( table, cell ) ;
-				var colSpan = cell.colSpan ;
-				if ( isNaN( colSpan ) )
-					colSpan = 1 ;
-				if ( colArray.length < colIndex + colSpan )
-				{
-					for ( var i = 0 ; i < colSpan ; i++ )
-						colArray.push( { "width" : width / colSpan, "colSpan" : colSpan } ) ;
-				}
+				var colSpan = isNaN( cell.colSpan) ? 1 : cell.colSpan ;
+				if ( colArray.length <= j )
+					colArray.push( { width : width / colSpan, colSpan : colSpan } ) ;
 				else
 				{
-					for ( var i = colIndex ; i < colIndex + colSpan ; i++ )
+					var guessItem = colArray[j] ;
+					if ( guessItem.colSpan > colSpan )
 					{
-						var guessItem = colArray[i] ;
-						if ( guessItem.colSpan > colSpan )
-						{
-							guessItem.width = width / colSpan ;
-							guessItem.colSpan = colSpan ;
-						}
+						guessItem.width = width / colSpan ;
+						guessItem.colSpan = colSpan ;
 					}
 				}
-				colIndex += colSpan ;
 			}
 		}
@@ -205,26 +187,29 @@
 
 		// Set new cell widths.
-		for ( var r = 0 ; r < table.rows.length ; r++ )
-		{
-			var row = table.rows.item( r ) ;
-			var colIndex = 0 ;
-			for ( var c = 0 ; c < row.cells.length ; c++ )
-			{
-				var cell = row.cells.item( c ) ;
-				var colSpan = cell.colSpan ;
-				if ( isNaN( colSpan ) )
-					colSpan = 1 ;
-				var cellWidth = 0 ;
-				for ( var i = colIndex ; i < colIndex + colSpan ; i++ )
-					cellWidth += colArray[i].width ;
-				try
+		var processedCells = [] ;
+		for ( var i = 0 ; i < tableMap.length ; i++ )
+		{
+			for ( var j = 0 ; j < tableMap[i].length ; j++ )
+			{
+				var cell = tableMap[i][j] ;
+				if ( cell._Processed )
+					continue ;
+				if ( tableMap[i][j-1] != cell )
+					cell.width = colArray[j].width ;
+				else
+					cell.width = parseInt( cell.width ) + parseInt( colArray[j].width ) ;
+				if ( tableMap[i][j+1] != cell )
 				{
-					cell.width = cellWidth ;
+					processedCells.push( cell ) ;
+					cell._Processed = true ;
 				}
-				catch(e)	
-				{				
-				}
-				colIndex += colSpan ;
-			}
+			}
+		}
+		for ( var i = 0 ; i < processedCells.length ; i++ )
+		{
+			if ( FCKBrowserInfo.IsIE )
+				processedCells[i].removeAttribute( '_Processed' ) ;
+			else
+				delete processedCells[i]._Processed ;
 		}
 
@@ -357,15 +342,16 @@
 		{
 			if ( this._LeftCell )
-				this._LeftCell = this._RightCell = null ;
+				this._LeftCell = this._RightCell = this._TableMap = null ;
 			this._HideResizeBar() ;
 			return ;
 		}
 		node = FCKTools.GetElementAscensor( node, "table" ) ;
-		var cellTuple = this._GetBorderCells( FCK.EditorWindow, node, { "x" : mouseX, "y" : mouseY } ) ;
+		var tableMap = FCKTableHandler._CreateTableMap( node ) ;
+		var cellTuple = this._GetBorderCells( FCK.EditorWindow, node, tableMap, { "x" : mouseX, "y" : mouseY } ) ;
 
 		if ( cellTuple == null )
 		{
 			if ( this._LeftCell )
-				this._LeftCell = this._RightCell = null ;
+				this._LeftCell = this._RightCell = this._TableMap = null ;
 			this._HideResizeBar() ;
 		}
@@ -374,4 +360,5 @@
 			this._LeftCell = cellTuple["leftCell"] ;
 			this._RightCell = cellTuple["rightCell"] ;
+			this._TableMap = tableMap ;
 			this._ShowResizeBar( FCK.EditorWindow, 
 					FCKTools.GetElementAscensor( this._LeftCell, "table" ),
