function _fnBuildHead( oSettings )
		{
			var i, ien, cell, row, column;
			var thead = oSettings.nTHead;
			var tfoot = oSettings.nTFoot;
			var createHeader = $('th, td', thead).length === 0;
			var classes = oSettings.oClasses;
			var columns = oSettings.aoColumns;
		
			if ( createHeader ) {
				row = $('<tr/>').appendTo( thead );
			}
		
			for ( i=0, ien=columns.length ; i<ien ; i++ ) {
				column = columns[i];
				cell = $( column.nTh ).addClass( column.sClass );
		
				if ( createHeader ) {
					cell.appendTo( row );
				}
		
				// 1.11 move into sorting
				if ( oSettings.oFeatures.bSort ) {
					cell.addClass( column.sSortingClass );
		
					if ( column.bSortable !== false ) {
						cell
							.attr( 'tabindex', oSettings.iTabIndex )
							.attr( 'aria-controls', oSettings.sTableId );
		
						_fnSortAttachListener( oSettings, column.nTh, i );
					}
				}
		
				if ( column.sTitle != cell[0].innerHTML ) {
					cell.html( column.sTitle );
				}
		
				_fnRenderer( oSettings, 'header' )(
					oSettings, cell, column, classes
				);
			}
		
			if ( createHeader ) {
				_fnDetectHeader( oSettings.aoHeader, thead );
			}
		
			/* Deal with the footer - add classes if required */
			$(thead).children('tr').children('th, td').addClass( classes.sHeaderTH );
			$(tfoot).children('tr').children('th, td').addClass( classes.sFooterTH );
		
			// Cache the footer cells. Note that we only take the cells from the first
			// row in the footer. If there is more than one row the user wants to
			// interact with, they need to use the table().foot() method. Note also this
			// allows cells to be used for multiple columns using colspan
			if ( tfoot !== null ) {
				var cells = oSettings.aoFooter[0];
		
				for ( i=0, ien=cells.length ; i<ien ; i++ ) {
					column = columns[i];
					column.nTf = cells[i].cell;
		
					if ( column.sClass ) {
						$(column.nTf).addClass( column.sClass );
					}
				}
			}
		}
/**
		 * Create the HTML header for the table
		 *  @param {object} oSettings dataTables settings object
		 *  @memberof DataTable#oApi
		 */
Create the HTML header for the table
@param {object} oSettings dataTables settings object
@memberof DataTable#oApi
Create the HTML header for the table @param { object } oSettings dataTables settings object @memberof DataTable#oApi
function _fnBuildHead( oSettings )
		{
			var i, ien, cell, row, column;
			var thead = oSettings.nTHead;
			var tfoot = oSettings.nTFoot;
			var createHeader = $('th, td', thead).length === 0;
			var classes = oSettings.oClasses;
			var columns = oSettings.aoColumns;
			if ( createHeader ) {
				row = $('<tr/>').appendTo( thead );
			}
			for ( i=0, ien=columns.length ; i<ien ; i++ ) {
				column = columns[i];
				cell = $( column.nTh ).addClass( column.sClass );
				if ( createHeader ) {
					cell.appendTo( row );
				}
				if ( oSettings.oFeatures.bSort ) {
					cell.addClass( column.sSortingClass );
					if ( column.bSortable !== false ) {
						cell
							.attr( 'tabindex', oSettings.iTabIndex )
							.attr( 'aria-controls', oSettings.sTableId );
						_fnSortAttachListener( oSettings, column.nTh, i );
					}
				}
				if ( column.sTitle != cell[0].innerHTML ) {
					cell.html( column.sTitle );
				}
				_fnRenderer( oSettings, 'header' )(
					oSettings, cell, column, classes
				);
			}
			if ( createHeader ) {
				_fnDetectHeader( oSettings.aoHeader, thead );
			}
			$(thead).children('tr').children('th, td').addClass( classes.sHeaderTH );
			$(tfoot).children('tr').children('th, td').addClass( classes.sFooterTH );
			if ( tfoot !== null ) {
				var cells = oSettings.aoFooter[0];
				for ( i=0, ien=cells.length ; i<ien ; i++ ) {
					column = columns[i];
					column.nTf = cells[i].cell;
					if ( column.sClass ) {
						$(column.nTf).addClass( column.sClass );
					}
				}
			}
		}
function _fnBuildHead ( oSettings ) { var i , ien , cell , row , column ; var thead = oSettings . nTHead ; var tfoot = oSettings . nTFoot ; var createHeader = $ ( 'th, td' , thead ) . length === 0 ; var classes = oSettings . oClasses ; var columns = oSettings . aoColumns ; if ( createHeader ) { row = $ ( '<tr/>' ) . appendTo ( thead ) ; } for ( i = 0 , ien = columns . length ; i < ien ; i ++ ) { column = columns [ i ] ; cell = $ ( column . nTh ) . addClass ( column . sClass ) ; if ( createHeader ) { cell . appendTo ( row ) ; } if ( oSettings . oFeatures . bSort ) { cell . addClass ( column . sSortingClass ) ; if ( column . bSortable !== false ) { cell . attr ( 'tabindex' , oSettings . iTabIndex ) . attr ( 'aria-controls' , oSettings . sTableId ) ; _fnSortAttachListener ( oSettings , column . nTh , i ) ; } } if ( column . sTitle != cell [ 0 ] . innerHTML ) { cell . html ( column . sTitle ) ; } _fnRenderer ( oSettings , 'header' ) ( oSettings , cell , column , classes ) ; } if ( createHeader ) { _fnDetectHeader ( oSettings . aoHeader , thead ) ; } $ ( thead ) . children ( 'tr' ) . children ( 'th, td' ) . addClass ( classes . sHeaderTH ) ; $ ( tfoot ) . children ( 'tr' ) . children ( 'th, td' ) . addClass ( classes . sFooterTH ) ; if ( tfoot !== null ) { var cells = oSettings . aoFooter [ 0 ] ; for ( i = 0 , ien = cells . length ; i < ien ; i ++ ) { column = columns [ i ] ; column . nTf = cells [ i ] . cell ; if ( column . sClass ) { $ ( column . nTf ) . addClass ( column . sClass ) ; } } } }
Create the HTML header for the table
  @param {object} oSettings dataTables settings object
  @memberof DataTable#oApi
Create the HTML header for the table @param { object } oSettings dataTables settings object @memberof DataTable#oApi
// 1.11 move into sorting /* Deal with the footer - add classes if required */ // Cache the footer cells. Note that we only take the cells from the first // row in the footer. If there is more than one row the user wants to // interact with, they need to use the table().foot() method. Note also this // allows cells to be used for multiple columns using colspan