function _fnFeatureHtmlTable ( settings )
		{
			var table = $(settings.nTable);
		
			// Scrolling from here on in
			var scroll = settings.oScroll;
		
			if ( scroll.sX === '' && scroll.sY === '' ) {
				return settings.nTable;
			}
		
			var scrollX = scroll.sX;
			var scrollY = scroll.sY;
			var classes = settings.oClasses;
			var caption = table.children('caption');
			var captionSide = caption.length ? caption[0]._captionSide : null;
			var headerClone = $( table[0].cloneNode(false) );
			var footerClone = $( table[0].cloneNode(false) );
			var footer = table.children('tfoot');
			var _div = '<div/>';
			var size = function ( s ) {
				return !s ? null : _fnStringToCss( s );
			};
		
			if ( ! footer.length ) {
				footer = null;
			}
		
			/*
			 * The HTML structure that we want to generate in this function is:
			 *  div - scroller
			 *    div - scroll head
			 *      div - scroll head inner
			 *        table - scroll head table
			 *          thead - thead
			 *    div - scroll body
			 *      table - table (master table)
			 *        thead - thead clone for sizing
			 *        tbody - tbody
			 *    div - scroll foot
			 *      div - scroll foot inner
			 *        table - scroll foot table
			 *          tfoot - tfoot
			 */
			var scroller = $( _div, { 'class': classes.sScrollWrapper } )
				.append(
					$(_div, { 'class': classes.sScrollHead } )
						.css( {
							overflow: 'hidden',
							position: 'relative',
							border: 0,
							width: scrollX ? size(scrollX) : '100%'
						} )
						.append(
							$(_div, { 'class': classes.sScrollHeadInner } )
								.css( {
									'box-sizing': 'content-box',
									width: scroll.sXInner || '100%'
								} )
								.append(
									headerClone
										.removeAttr('id')
										.css( 'margin-left', 0 )
										.append( captionSide === 'top' ? caption : null )
										.append(
											table.children('thead')
										)
								)
						)
				)
				.append(
					$(_div, { 'class': classes.sScrollBody } )
						.css( {
							position: 'relative',
							overflow: 'auto',
							width: size( scrollX )
						} )
						.append( table )
				);
		
			if ( footer ) {
				scroller.append(
					$(_div, { 'class': classes.sScrollFoot } )
						.css( {
							overflow: 'hidden',
							border: 0,
							width: scrollX ? size(scrollX) : '100%'
						} )
						.append(
							$(_div, { 'class': classes.sScrollFootInner } )
								.append(
									footerClone
										.removeAttr('id')
										.css( 'margin-left', 0 )
										.append( captionSide === 'bottom' ? caption : null )
										.append(
											table.children('tfoot')
										)
								)
						)
				);
			}
		
			var children = scroller.children();
			var scrollHead = children[0];
			var scrollBody = children[1];
			var scrollFoot = footer ? children[2] : null;
		
			// When the body is scrolled, then we also want to scroll the headers
			if ( scrollX ) {
				$(scrollBody).on( 'scroll.DT', function (e) {
					var scrollLeft = this.scrollLeft;
		
					scrollHead.scrollLeft = scrollLeft;
		
					if ( footer ) {
						scrollFoot.scrollLeft = scrollLeft;
					}
				} );
			}
		
			$(scrollBody).css('max-height', scrollY);
			if (! scroll.bCollapse) {
				$(scrollBody).css('height', scrollY);
			}
		
			settings.nScrollHead = scrollHead;
			settings.nScrollBody = scrollBody;
			settings.nScrollFoot = scrollFoot;
		
			// On redraw - align columns
			settings.aoDrawCallback.push( {
				"fn": _fnScrollDraw,
				"sName": "scrolling"
			} );
		
			return scroller[0];
		}
/**
		 * Add any control elements for the table - specifically scrolling
		 *  @param {object} settings dataTables settings object
		 *  @returns {node} Node to add to the DOM
		 *  @memberof DataTable#oApi
		 */
Add any control elements for the table - specifically scrolling
@param {object} settings dataTables settings object
@returns {node} Node to add to the DOM
@memberof DataTable#oApi
Add any control elements for the table - specifically scrolling @param { object } settings dataTables settings object @returns { node } Node to add to the DOM @memberof DataTable#oApi
function _fnFeatureHtmlTable ( settings )
		{
			var table = $(settings.nTable);
			var scroll = settings.oScroll;
			if ( scroll.sX === '' && scroll.sY === '' ) {
				return settings.nTable;
			}
			var scrollX = scroll.sX;
			var scrollY = scroll.sY;
			var classes = settings.oClasses;
			var caption = table.children('caption');
			var captionSide = caption.length ? caption[0]._captionSide : null;
			var headerClone = $( table[0].cloneNode(false) );
			var footerClone = $( table[0].cloneNode(false) );
			var footer = table.children('tfoot');
			var _div = '<div/>';
			var size = function ( s ) {
				return !s ? null : _fnStringToCss( s );
			};
			if ( ! footer.length ) {
				footer = null;
			}
			var scroller = $( _div, { 'class': classes.sScrollWrapper } )
				.append(
					$(_div, { 'class': classes.sScrollHead } )
						.css( {
							overflow: 'hidden',
							position: 'relative',
							border: 0,
							width: scrollX ? size(scrollX) : '100%'
						} )
						.append(
							$(_div, { 'class': classes.sScrollHeadInner } )
								.css( {
									'box-sizing': 'content-box',
									width: scroll.sXInner || '100%'
								} )
								.append(
									headerClone
										.removeAttr('id')
										.css( 'margin-left', 0 )
										.append( captionSide === 'top' ? caption : null )
										.append(
											table.children('thead')
										)
								)
						)
				)
				.append(
					$(_div, { 'class': classes.sScrollBody } )
						.css( {
							position: 'relative',
							overflow: 'auto',
							width: size( scrollX )
						} )
						.append( table )
				);
			if ( footer ) {
				scroller.append(
					$(_div, { 'class': classes.sScrollFoot } )
						.css( {
							overflow: 'hidden',
							border: 0,
							width: scrollX ? size(scrollX) : '100%'
						} )
						.append(
							$(_div, { 'class': classes.sScrollFootInner } )
								.append(
									footerClone
										.removeAttr('id')
										.css( 'margin-left', 0 )
										.append( captionSide === 'bottom' ? caption : null )
										.append(
											table.children('tfoot')
										)
								)
						)
				);
			}
			var children = scroller.children();
			var scrollHead = children[0];
			var scrollBody = children[1];
			var scrollFoot = footer ? children[2] : null;
			if ( scrollX ) {
				$(scrollBody).on( 'scroll.DT', function (e) {
					var scrollLeft = this.scrollLeft;
					scrollHead.scrollLeft = scrollLeft;
					if ( footer ) {
						scrollFoot.scrollLeft = scrollLeft;
					}
				} );
			}
			$(scrollBody).css('max-height', scrollY);
			if (! scroll.bCollapse) {
				$(scrollBody).css('height', scrollY);
			}
			settings.nScrollHead = scrollHead;
			settings.nScrollBody = scrollBody;
			settings.nScrollFoot = scrollFoot;
			settings.aoDrawCallback.push( {
				"fn": _fnScrollDraw,
				"sName": "scrolling"
			} );
			return scroller[0];
		}
function _fnFeatureHtmlTable ( settings ) { var table = $ ( settings . nTable ) ; var scroll = settings . oScroll ; if ( scroll . sX === '' && scroll . sY === '' ) { return settings . nTable ; } var scrollX = scroll . sX ; var scrollY = scroll . sY ; var classes = settings . oClasses ; var caption = table . children ( 'caption' ) ; var captionSide = caption . length ? caption [ 0 ] . _captionSide : null ; var headerClone = $ ( table [ 0 ] . cloneNode ( false ) ) ; var footerClone = $ ( table [ 0 ] . cloneNode ( false ) ) ; var footer = table . children ( 'tfoot' ) ; var _div = '<div/>' ; var size = function ( s ) { return ! s ? null : _fnStringToCss ( s ) ; } ; if ( ! footer . length ) { footer = null ; } var scroller = $ ( _div , { 'class' : classes . sScrollWrapper } ) . append ( $ ( _div , { 'class' : classes . sScrollHead } ) . css ( { overflow : 'hidden' , position : 'relative' , border : 0 , width : scrollX ? size ( scrollX ) : '100%' } ) . append ( $ ( _div , { 'class' : classes . sScrollHeadInner } ) . css ( { 'box-sizing' : 'content-box' , width : scroll . sXInner || '100%' } ) . append ( headerClone . removeAttr ( 'id' ) . css ( 'margin-left' , 0 ) . append ( captionSide === 'top' ? caption : null ) . append ( table . children ( 'thead' ) ) ) ) ) . append ( $ ( _div , { 'class' : classes . sScrollBody } ) . css ( { position : 'relative' , overflow : 'auto' , width : size ( scrollX ) } ) . append ( table ) ) ; if ( footer ) { scroller . append ( $ ( _div , { 'class' : classes . sScrollFoot } ) . css ( { overflow : 'hidden' , border : 0 , width : scrollX ? size ( scrollX ) : '100%' } ) . append ( $ ( _div , { 'class' : classes . sScrollFootInner } ) . append ( footerClone . removeAttr ( 'id' ) . css ( 'margin-left' , 0 ) . append ( captionSide === 'bottom' ? caption : null ) . append ( table . children ( 'tfoot' ) ) ) ) ) ; } var children = scroller . children ( ) ; var scrollHead = children [ 0 ] ; var scrollBody = children [ 1 ] ; var scrollFoot = footer ? children [ 2 ] : null ; if ( scrollX ) { $ ( scrollBody ) . on ( 'scroll.DT' , function ( e ) { var scrollLeft = this . scrollLeft ; scrollHead . scrollLeft = scrollLeft ; if ( footer ) { scrollFoot . scrollLeft = scrollLeft ; } } ) ; } $ ( scrollBody ) . css ( 'max-height' , scrollY ) ; if ( ! scroll . bCollapse ) { $ ( scrollBody ) . css ( 'height' , scrollY ) ; } settings . nScrollHead = scrollHead ; settings . nScrollBody = scrollBody ; settings . nScrollFoot = scrollFoot ; settings . aoDrawCallback . push ( { "fn" : _fnScrollDraw , "sName" : "scrolling" } ) ; return scroller [ 0 ] ; }
Add any control elements for the table - specifically scrolling
  @param {object} settings dataTables settings object
  @returns {node} Node to add to the DOM
  @memberof DataTable#oApi
Add any control elements for the table - specifically scrolling @param { object } settings dataTables settings object @returns { node } Node to add to the DOM @memberof DataTable#oApi
// Scrolling from here on in /*
			 * The HTML structure that we want to generate in this function is:
			 *  div - scroller
			 *    div - scroll head
			 *      div - scroll head inner
			 *        table - scroll head table
			 *          thead - thead
			 *    div - scroll body
			 *      table - table (master table)
			 *        thead - thead clone for sizing
			 *        tbody - tbody
			 *    div - scroll foot
			 *      div - scroll foot inner
			 *        table - scroll foot table
			 *          tfoot - tfoot
			 */ // When the body is scrolled, then we also want to scroll the headers // On redraw - align columns