docs: function _fnAddData ( oSettings, aDataSupplied )
  		{
  			var oCol;
  			
  			/* Take an independent copy of the data source so we can bash it about as we wish */
  			var aDataIn = ($.isArray(aDataSupplied)) ?
  				aDataSupplied.slice() :
  				$.extend( true, {}, aDataSupplied );
  			
  			/* Create the object for storing information about this new row */
  			var iRow = oSettings.aoData.length;
  			var oData = $.extend( true, {}, DataTable.models.oRow );
  			oData._aData = aDataIn;
  			oSettings.aoData.push( oData );
  		
  			/* Create the cells */
  			var nTd, sThisType;
  			for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
  			{
  				oCol = oSettings.aoColumns[i];
  		
  				/* Use rendered data for filtering/sorting */
  				if ( typeof oCol.fnRender === 'function' && oCol.bUseRendered && oCol.mDataProp !== null )
  				{
  					_fnSetCellData( oSettings, iRow, i, _fnRender(oSettings, iRow, i) );
  				}
  				else
  				{
  					_fnSetCellData( oSettings, iRow, i, _fnGetCellData( oSettings, iRow, i ) );
  				}
  				
  				/* See if we should auto-detect the column type */
  				if ( oCol._bAutoType && oCol.sType != 'string' )
  				{
  					/* Attempt to auto detect the type - same as _fnGatherData() */
  					var sVarType = _fnGetCellData( oSettings, iRow, i, 'type' );
  					if ( sVarType !== null && sVarType !== '' )
  					{
  						sThisType = _fnDetectType( sVarType );
  						if ( oCol.sType === null )
  						{
  							oCol.sType = sThisType;
  						}
  						else if ( oCol.sType != sThisType && oCol.sType != "html" )
  						{
  							/* String is always the 'fallback' option */
  							oCol.sType = 'string';
  						}
  					}
  				}
  			}
  			
  			/* Add to the display array */
  			oSettings.aiDisplayMaster.push( iRow );
  		
  			/* Create the DOM imformation */
  			if ( !oSettings.oFeatures.bDeferRender )
  			{
  				_fnCreateTr( oSettings, iRow );
  			}
  		
  			return iRow;
  		}