docs: function _fnCreateTr ( oSettings, iRow )
  		{
  			var oData = oSettings.aoData[iRow];
  			var nTd;
  		
  			if ( oData.nTr === null )
  			{
  				oData.nTr = document.createElement('tr');
  		
  				/* Use a private property on the node to allow reserve mapping from the node
  				 * to the aoData array for fast look up
  				 */
  				oData.nTr._DT_RowIndex = iRow;
  		
  				/* Special parameters can be given by the data source to be used on the row */
  				if ( oData._aData.DT_RowId )
  				{
  					oData.nTr.id = oData._aData.DT_RowId;
  				}
  		
  				if ( oData._aData.DT_RowClass )
  				{
  					$(oData.nTr).addClass( oData._aData.DT_RowClass );
  				}
  		
  				/* Process each column */
  				for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
  				{
  					var oCol = oSettings.aoColumns[i];
  					nTd = document.createElement( oCol.sCellType );
  		
  					/* Render if needed - if bUseRendered is true then we already have the rendered
  					 * value in the data source - so can just use that
  					 */
  					nTd.innerHTML = (typeof oCol.fnRender === 'function' && (!oCol.bUseRendered || oCol.mDataProp === null)) ?
  						_fnRender( oSettings, iRow, i ) :
  						_fnGetCellData( oSettings, iRow, i, 'display' );
  				
  					/* Add user defined class */
  					if ( oCol.sClass !== null )
  					{
  						nTd.className = oCol.sClass;
  					}
  					
  					if ( oCol.bVisible )
  					{
  						oData.nTr.appendChild( nTd );
  						oData._anHidden[i] = null;
  					}
  					else
  					{
  						oData._anHidden[i] = nTd;
  					}
  		
  					if ( oCol.fnCreatedCell )
  					{
  						oCol.fnCreatedCell.call( oSettings.oInstance,
  							nTd, _fnGetCellData( oSettings, iRow, i, 'display' ), oData._aData, iRow, i
  						);
  					}
  				}
  		
  				_fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [oData.nTr, oData._aData, iRow] );
  			}
  		}