function _fnScrollDraw(settings) {
		// Given that this is such a monster function, a lot of variables are use
		// to try and keep the minimised size as small as possible
		var
			scroll = settings.oScroll,
			barWidth = scroll.iBarWidth,
			divHeader = $(settings.nScrollHead),
			divHeaderInner = divHeader.children('div'),
			divHeaderTable = divHeaderInner.children('table'),
			divBodyEl = settings.nScrollBody,
			divBody = $(divBodyEl),
			divFooter = $(settings.nScrollFoot),
			divFooterInner = divFooter.children('div'),
			divFooterTable = divFooterInner.children('table'),
			header = $(settings.nTHead),
			table = $(settings.nTable),
			footer = settings.nTFoot && $('th, td', settings.nTFoot).length ? $(settings.nTFoot) : null,
			browser = settings.oBrowser,
			headerCopy, footerCopy;

		// If the scrollbar visibility has changed from the last draw, we need to
		// adjust the column sizes as the table width will have changed to account
		// for the scrollbar
		var scrollBarVis = divBodyEl.scrollHeight > divBodyEl.clientHeight;

		if (settings.scrollBarVis !== scrollBarVis && settings.scrollBarVis !== undefined) {
			settings.scrollBarVis = scrollBarVis;
			_fnAdjustColumnSizing(settings);
			return; // adjust column sizing will call this function again
		}
		else {
			settings.scrollBarVis = scrollBarVis;
		}

		// 1. Re-create the table inside the scrolling div
		// Remove the old minimised thead and tfoot elements in the inner table
		table.children('thead, tfoot').remove();

		// Clone the current header and footer elements and then place it into the inner table
		headerCopy = header.clone().prependTo(table);
		headerCopy.find('th, td').removeAttr('tabindex');
		headerCopy.find('[id]').removeAttr('id');

		if (footer) {
			footerCopy = footer.clone().prependTo(table);
			footerCopy.find('[id]').removeAttr('id');
		}

		// 2. Correct colgroup > col values if needed
		// It is possible that the cell sizes are smaller than the content, so we need to
		// correct colgroup>col for such cases. This can happen if the auto width detection
		// uses a cell which has a longer string, but isn't the widest! For example
		// "Chief Executive Officer (CEO)" is the longest string in the demo, but
		// "Systems Administrator" is actually the widest string since it doesn't collapse.
		if (settings.aiDisplay.length) {
			// Get the column sizes from the first row in the table
			var colSizes = table.find('tbody tr').eq(0).find('th, td').map(function () {
				return $(this).outerWidth();
			});

			// Check against what the colgroup > col is set to and correct if needed
			$('col', settings.colgroup).each(function (i) {
				var colWidth = this.style.width.replace('px', '');

				if (colWidth !== colSizes[i]) {
					this.style.width = colSizes[i] + 'px';
				}
			});
		}

		// 3. Copy the colgroup over to the header and footer
		divHeaderTable
			.find('colgroup')
			.remove();

		divHeaderTable.append(settings.colgroup.clone());

		if (footer) {
			divFooterTable
				.find('colgroup')
				.remove();

			divFooterTable.append(settings.colgroup.clone());
		}

		// "Hide" the header and footer that we used for the sizing. We need to keep
		// the content of the cell so that the width applied to the header and body
		// both match, but we want to hide it completely.
		$('th, td', headerCopy).each(function () {
			$(this).children().wrapAll('<div class="dt-scroll-sizing">');
		});

		if (footer) {
			$('th, td', footerCopy).each(function () {
				$(this).children().wrapAll('<div class="dt-scroll-sizing">');
			});
		}

		// 4. Clean up
		// Figure out if there are scrollbar present - if so then we need a the header and footer to
		// provide a bit more space to allow "overflow" scrolling (i.e. past the scrollbar)
		var isScrolling = Math.floor(table.height()) > divBodyEl.clientHeight || divBody.css('overflow-y') == "scroll";
		var paddingSide = 'padding' + (browser.bScrollbarLeft ? 'Left' : 'Right');

		// Set the width's of the header and footer tables
		var outerWidth = table.outerWidth();

		divHeaderTable.css('width', _fnStringToCss(outerWidth));
		divHeaderInner
			.css('width', _fnStringToCss(outerWidth))
			.css(paddingSide, isScrolling ? barWidth + "px" : "0px");

		if (footer) {
			divFooterTable.css('width', _fnStringToCss(outerWidth));
			divFooterInner
				.css('width', _fnStringToCss(outerWidth))
				.css(paddingSide, isScrolling ? barWidth + "px" : "0px");
		}

		// Correct DOM ordering for colgroup - comes before the thead
		table.children('colgroup').prependTo(table);

		// Adjust the position of the header in case we loose the y-scrollbar
		divBody.trigger('scroll');

		// If sorting or filtering has occurred, jump the scrolling back to the top
		// only if we aren't holding the position
		if ((settings.bSorted || settings.bFiltered) && !settings._drawHold) {
			divBodyEl.scrollTop = 0;
		}
	}
Update the header, footer and body tables for resizing - i.e. column
alignment.

Welcome to the most horrible function DataTables. The process that this
function follows is basically:
  1. Re-create the table inside the scrolling div
  2. Correct colgroup > col values if needed
  3. Copy colgroup > col over to header and footer
  4. Clean up

 @param {object} settings dataTables settings object
 @memberof DataTable#oApi