function _fnCreateTr(oSettings, iRow, nTrIn, anTds) {
		var
			row = oSettings.aoData[iRow],
			rowData = row._aData,
			cells = [],
			nTr, nTd, oCol,
			i, iLen, create,
			trClass = oSettings.oClasses.tbody.row;

		if (row.nTr === null) {
			nTr = nTrIn || document.createElement('tr');

			row.nTr = nTr;
			row.anCells = cells;

			_addClass(nTr, trClass);

			/* Use a private property on the node to allow reserve mapping from the node
			 * to the aoData array for fast look up
			 */
			nTr._DT_RowIndex = iRow;

			/* Special parameters can be given by the data source to be used on the row */
			_fnRowAttributes(oSettings, row);

			/* Process each column */
			for (i = 0, iLen = oSettings.aoColumns.length; i < iLen; i++) {
				oCol = oSettings.aoColumns[i];
				create = nTrIn && anTds[i] ? false : true;

				nTd = create ? document.createElement(oCol.sCellType) : anTds[i];

				if (!nTd) {
					_fnLog(oSettings, 0, 'Incorrect column count', 18);
				}

				nTd._DT_CellIndex = {
					row: iRow,
					column: i
				};

				cells.push(nTd);

				var display = _fnGetRowDisplay(oSettings, iRow);

				// Need to create the HTML if new, or if a rendering function is defined
				if (
					create ||
					(
						(oCol.mRender || oCol.mData !== i) &&
						(!$.isPlainObject(oCol.mData) || oCol.mData._ !== i + '.display')
					)
				) {
					_fnWriteCell(nTd, display[i]);
				}

				// Visibility - add or remove as required
				if (oCol.bVisible && create) {
					nTr.appendChild(nTd);
				}
				else if (!oCol.bVisible && !create) {
					nTd.parentNode.removeChild(nTd);
				}

				if (oCol.fnCreatedCell) {
					oCol.fnCreatedCell.call(oSettings.oInstance,
						nTd, _fnGetCellData(oSettings, iRow, i), rowData, iRow, i
					);
				}
			}

			_fnCallbackFire(oSettings, 'aoRowCreatedCallback', 'row-created', [nTr, rowData, iRow, cells]);
		}
		else {
			_addClass(row.nTr, trClass);
		}
	}
Create a new TR element (and it's TD children) for a row
 @param {object} oSettings dataTables settings object
 @param {int} iRow Row to consider
 @param {node} [nTrIn] 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.
 @memberof DataTable#oApi