docs: function _fnDrawHead( oSettings, aoSource, bIncludeHidden )
  		{
  			var i, iLen, j, jLen, k, kLen, n, nLocalTr;
  			var aoLocal = [];
  			var aApplied = [];
  			var iColumns = oSettings.aoColumns.length;
  			var iRowspan, iColspan;
  		
  			if (  bIncludeHidden === undefined )
  			{
  				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 )
  					{
  						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 &&
  						        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 &&
  						        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.rowSpan = iRowspan;
  						aoLocal[i][j].cell.colSpan = iColspan;
  					}
  				}
  			}
  		}