function _fnAddData ( oSettings, aDataIn, nTr, anTds )
	{
		/* Create the object for storing information about this new row */
		var iRow = oSettings.aoData.length;
		var oData = $.extend( true, {}, DataTable.models.oRow, {
			src: nTr ? 'dom' : 'data',
			idx: iRow
		} );
	
		oData._aData = aDataIn;
		oSettings.aoData.push( oData );
	
		/* Create the cells */
		var nTd, sThisType;
		var columns = oSettings.aoColumns;
	
		// Invalidate the column types as the new data needs to be revalidated
		for ( var i=0, iLen=columns.length ; i<iLen ; i++ )
		{
			columns[i].sType = null;
		}
	
		/* Add to the display array */
		oSettings.aiDisplayMaster.push( iRow );
	
		var id = oSettings.rowIdFn( aDataIn );
		if ( id !== undefined ) {
			oSettings.aIds[ id ] = oData;
		}
	
		/* Create the DOM information, or register it if already present */
		if ( nTr || ! oSettings.oFeatures.bDeferRender )
		{
			_fnCreateTr( oSettings, iRow, nTr, anTds );
		}
	
		return iRow;
	}
Add a data array to the table, creating DOM node etc. This is the parallel to
_fnGatherData, but for adding rows from a Javascript source, rather than a
DOM source.
 @param {object} oSettings dataTables settings object
 @param {array} aData data array to be added
 @param {node} [nTr] TR element to add to the table - optional. If not given,
   DataTables will create a row automatically
 @param {array} [anTds] Array of TD|TH elements for the row - must be given
   if nTr is.
 @returns {int} >=0 if successful (index of new aoData entry), -1 if failed
 @memberof DataTable#oApi