docs: function _fnAjaxUpdateDraw ( oSettings, json )
  		{
  			if ( json.sEcho !== undefined )
  			{
  				/* Protect against old returns over-writing a new one. Possible when you get
  				 * very fast interaction, and later queires are completed much faster
  				 */
  				if ( json.sEcho*1 < oSettings.iDraw )
  				{
  					return;
  				}
  				else
  				{
  					oSettings.iDraw = json.sEcho * 1;
  				}
  			}
  			
  			if ( !oSettings.oScroll.bInfinite ||
  				   (oSettings.oScroll.bInfinite && (oSettings.bSorted || oSettings.bFiltered)) )
  			{
  				_fnClearTable( oSettings );
  			}
  			oSettings._iRecordsTotal = parseInt(json.iTotalRecords, 10);
  			oSettings._iRecordsDisplay = parseInt(json.iTotalDisplayRecords, 10);
  			
  			/* Determine if reordering is required */
  			var sOrdering = _fnColumnOrdering(oSettings);
  			var bReOrder = (json.sColumns !== undefined && sOrdering !== "" && json.sColumns != sOrdering );
  			var aiIndex;
  			if ( bReOrder )
  			{
  				aiIndex = _fnReOrderIndex( oSettings, json.sColumns );
  			}
  			
  			var aData = _fnGetObjectDataFn( oSettings.sAjaxDataProp )( json );
  			for ( var i=0, iLen=aData.length ; i<iLen ; i++ )
  			{
  				if ( bReOrder )
  				{
  					/* If we need to re-order, then create a new array with the correct order and add it */
  					var aDataSorted = [];
  					for ( var j=0, jLen=oSettings.aoColumns.length ; j<jLen ; j++ )
  					{
  						aDataSorted.push( aData[i][ aiIndex[j] ] );
  					}
  					_fnAddData( oSettings, aDataSorted );
  				}
  				else
  				{
  					/* No re-order required, sever got it "right" - just straight add */
  					_fnAddData( oSettings, aData[i] );
  				}
  			}
  			oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
  			
  			oSettings.bAjaxDataGet = false;
  			_fnDraw( oSettings );
  			oSettings.bAjaxDataGet = true;
  			_fnProcessingDisplay( oSettings, false );
  		}