function _fnBuildHead(settings, side) {
		var classes = settings.oClasses;
		var columns = settings.aoColumns;
		var i, ien, row;
		var target = side === 'header'
			? settings.nTHead
			: settings.nTFoot;
		var titleProp = side === 'header' ? 'sTitle' : side;

		// Footer might be defined
		if (!target) {
			return;
		}

		// If no cells yet and we have content for them, then create
		if (side === 'header' || _pluck(settings.aoColumns, titleProp).join('')) {
			row = $('tr', target);

			// Add a row if needed
			if (!row.length) {
				row = $('<tr/>').appendTo(target)
			}

			// Add the number of cells needed to make up to the number of columns
			if (row.length === 1) {
				var cells = $('td, th', row);

				for (i = cells.length, ien = columns.length; i < ien; i++) {
					$('<th/>')
						.html(columns[i][titleProp] || '')
						.appendTo(row);
				}
			}
		}

		var detected = _fnDetectHeader(settings, target, true);

		if (side === 'header') {
			settings.aoHeader = detected;
		}
		else {
			settings.aoFooter = detected;
		}

		// ARIA role for the rows
		$(target).children('tr').attr('role', 'row');

		// Every cell needs to be passed through the renderer
		$(target).children('tr').children('th, td')
			.each(function () {
				_fnRenderer(settings, side)(
					settings, $(this), classes
				);
			});
	}
Create the HTML header for the table
 @param {object} oSettings dataTables settings object
 @memberof DataTable#oApi