function _fnDrawHead( oSettings, aoSource, bIncludeHidden )
		{
			var i, iLen, j, jLen, k, n, nLocalTr;
			var aoLocal = [];
			var aApplied = [];
			var iColumns = oSettings.aoColumns.length;
			var iRowspan, iColspan;
		
			if ( ! aoSource )
			{
				return;
			}
		
			if (  bIncludeHidden === undefined$1 )
			{
				bIncludeHidden = false;
			}
		
			/* Make a copy of the master layout array, but without the visible columns in it */
			for ( i=0, iLen=aoSource.length ; i<iLen ; i++ )
			{
				aoLocal[i] = aoSource[i].slice();
				aoLocal[i].nTr = aoSource[i].nTr;
		
				/* Remove any columns which are currently hidden */
				for ( j=iColumns-1 ; j>=0 ; j-- )
				{
					if ( !oSettings.aoColumns[j].bVisible && !bIncludeHidden )
					{
						aoLocal[i].splice( j, 1 );
					}
				}
		
				/* Prep the applied array - it needs an element for each row */
				aApplied.push( [] );
			}
		
			for ( i=0, iLen=aoLocal.length ; i<iLen ; i++ )
			{
				nLocalTr = aoLocal[i].nTr;
		
				/* All cells are going to be replaced, so empty out the row */
				if ( nLocalTr )
				{
					while( (n = nLocalTr.firstChild) )
					{
						nLocalTr.removeChild( n );
					}
				}
		
				for ( j=0, jLen=aoLocal[i].length ; j<jLen ; j++ )
				{
					iRowspan = 1;
					iColspan = 1;
		
					/* Check to see if there is already a cell (row/colspan) covering our target
					 * insert point. If there is, then there is nothing to do.
					 */
					if ( aApplied[i][j] === undefined$1 )
					{
						nLocalTr.appendChild( aoLocal[i][j].cell );
						aApplied[i][j] = 1;
		
						/* Expand the cell to cover as many rows as needed */
						while ( aoLocal[i+iRowspan] !== undefined$1 &&
						        aoLocal[i][j].cell == aoLocal[i+iRowspan][j].cell )
						{
							aApplied[i+iRowspan][j] = 1;
							iRowspan++;
						}
		
						/* Expand the cell to cover as many columns as needed */
						while ( aoLocal[i][j+iColspan] !== undefined$1 &&
						        aoLocal[i][j].cell == aoLocal[i][j+iColspan].cell )
						{
							/* Must update the applied array over the rows for the columns */
							for ( k=0 ; k<iRowspan ; k++ )
							{
								aApplied[i+k][j+iColspan] = 1;
							}
							iColspan++;
						}
		
						/* Do the actual expansion in the DOM */
						$(aoLocal[i][j].cell)
							.attr('rowspan', iRowspan)
							.attr('colspan', iColspan);
					}
				}
			}
		}
/**
		 * Draw the header (or footer) element based on the column visibility states. The
		 * methodology here is to use the layout array from _fnDetectHeader, modified for
		 * the instantaneous column visibility, to construct the new layout. The grid is
		 * traversed over cell at a time in a rows x columns grid fashion, although each
		 * cell insert can cover multiple elements in the grid - which is tracks using the
		 * aApplied array. Cell inserts in the grid will only occur where there isn't
		 * already a cell in that position.
		 *  @param {object} oSettings dataTables settings object
		 *  @param array {objects} aoSource Layout array from _fnDetectHeader
		 *  @param {boolean} [bIncludeHidden=false] If true then include the hidden columns in the calc,
		 *  @memberof DataTable#oApi
		 */
Draw the header (or footer) element based on the column visibility states. The
methodology here is to use the layout array from _fnDetectHeader, modified for
the instantaneous column visibility, to construct the new layout. The grid is
traversed over cell at a time in a rows x columns grid fashion, although each
cell insert can cover multiple elements in the grid - which is tracks using the
aApplied array. Cell inserts in the grid will only occur where there isn't
already a cell in that position.
@param {object} oSettings dataTables settings object
@param array {objects} aoSource Layout array from _fnDetectHeader
@param {boolean} [bIncludeHidden=false] If true then include the hidden columns in the calc,
@memberof DataTable#oApi
Draw the header ( or footer ) element based on the column visibility states . The methodology here is to use the layout array from _fnDetectHeader modified for the instantaneous column visibility to construct the new layout . The grid is traversed over cell at a time in a rows x columns grid fashion although each cell insert can cover multiple elements in the grid - which is tracks using the aApplied array . Cell inserts in the grid will only occur where there isn ' t already a cell in that position . @param { object } oSettings dataTables settings object @param array { objects } aoSource Layout array from _fnDetectHeader @param { boolean } [ bIncludeHidden = false ] If true then include the hidden columns in the calc @memberof DataTable#oApi
function _fnDrawHead( oSettings, aoSource, bIncludeHidden )
		{
			var i, iLen, j, jLen, k, n, nLocalTr;
			var aoLocal = [];
			var aApplied = [];
			var iColumns = oSettings.aoColumns.length;
			var iRowspan, iColspan;
			if ( ! aoSource )
			{
				return;
			}
			if (  bIncludeHidden === undefined$1 )
			{
				bIncludeHidden = false;
			}
			for ( i=0, iLen=aoSource.length ; i<iLen ; i++ )
			{
				aoLocal[i] = aoSource[i].slice();
				aoLocal[i].nTr = aoSource[i].nTr;
				for ( j=iColumns-1 ; j>=0 ; j-- )
				{
					if ( !oSettings.aoColumns[j].bVisible && !bIncludeHidden )
					{
						aoLocal[i].splice( j, 1 );
					}
				}
				aApplied.push( [] );
			}
			for ( i=0, iLen=aoLocal.length ; i<iLen ; i++ )
			{
				nLocalTr = aoLocal[i].nTr;
				if ( nLocalTr )
				{
					while( (n = nLocalTr.firstChild) )
					{
						nLocalTr.removeChild( n );
					}
				}
				for ( j=0, jLen=aoLocal[i].length ; j<jLen ; j++ )
				{
					iRowspan = 1;
					iColspan = 1;
					if ( aApplied[i][j] === undefined$1 )
					{
						nLocalTr.appendChild( aoLocal[i][j].cell );
						aApplied[i][j] = 1;
						while ( aoLocal[i+iRowspan] !== undefined$1 &&
						        aoLocal[i][j].cell == aoLocal[i+iRowspan][j].cell )
						{
							aApplied[i+iRowspan][j] = 1;
							iRowspan++;
						}
						while ( aoLocal[i][j+iColspan] !== undefined$1 &&
						        aoLocal[i][j].cell == aoLocal[i][j+iColspan].cell )
						{
							for ( k=0 ; k<iRowspan ; k++ )
							{
								aApplied[i+k][j+iColspan] = 1;
							}
							iColspan++;
						}
						$(aoLocal[i][j].cell)
							.attr('rowspan', iRowspan)
							.attr('colspan', iColspan);
					}
				}
			}
		}
function _fnDrawHead ( oSettings , aoSource , bIncludeHidden ) { var i , iLen , j , jLen , k , n , nLocalTr ; var aoLocal = [ ] ; var aApplied = [ ] ; var iColumns = oSettings . aoColumns . length ; var iRowspan , iColspan ; if ( ! aoSource ) { return ; } if ( bIncludeHidden === undefined$1 ) { bIncludeHidden = false ; } for ( i = 0 , iLen = aoSource . length ; i < iLen ; i ++ ) { aoLocal [ i ] = aoSource [ i ] . slice ( ) ; aoLocal [ i ] . nTr = aoSource [ i ] . nTr ; for ( j = iColumns - 1 ; j >= 0 ; j -- ) { if ( ! oSettings . aoColumns [ j ] . bVisible && ! bIncludeHidden ) { aoLocal [ i ] . splice ( j , 1 ) ; } } aApplied . push ( [ ] ) ; } for ( i = 0 , iLen = aoLocal . length ; i < iLen ; i ++ ) { nLocalTr = aoLocal [ i ] . nTr ; if ( nLocalTr ) { while ( ( n = nLocalTr . firstChild ) ) { nLocalTr . removeChild ( n ) ; } } for ( j = 0 , jLen = aoLocal [ i ] . length ; j < jLen ; j ++ ) { iRowspan = 1 ; iColspan = 1 ; if ( aApplied [ i ] [ j ] === undefined$1 ) { nLocalTr . appendChild ( aoLocal [ i ] [ j ] . cell ) ; aApplied [ i ] [ j ] = 1 ; while ( aoLocal [ i + iRowspan ] !== undefined$1 && aoLocal [ i ] [ j ] . cell == aoLocal [ i + iRowspan ] [ j ] . cell ) { aApplied [ i + iRowspan ] [ j ] = 1 ; iRowspan ++ ; } while ( aoLocal [ i ] [ j + iColspan ] !== undefined$1 && aoLocal [ i ] [ j ] . cell == aoLocal [ i ] [ j + iColspan ] . cell ) { for ( k = 0 ; k < iRowspan ; k ++ ) { aApplied [ i + k ] [ j + iColspan ] = 1 ; } iColspan ++ ; } $ ( aoLocal [ i ] [ j ] . cell ) . attr ( 'rowspan' , iRowspan ) . attr ( 'colspan' , iColspan ) ; } } } }
Draw the header (or footer) element based on the column visibility states.
Draw the header ( or footer ) element based on the column visibility states .
/* Make a copy of the master layout array, but without the visible columns in it */ /* Remove any columns which are currently hidden */ /* Prep the applied array - it needs an element for each row */ /* All cells are going to be replaced, so empty out the row */ /* Check to see if there is already a cell (row/colspan) covering our target
					 * insert point. If there is, then there is nothing to do.
					 */ /* Expand the cell to cover as many rows as needed */ /* Expand the cell to cover as many columns as needed */ /* Must update the applied array over the rows for the columns */ /* Do the actual expansion in the DOM */