docs: function _fnSortingClasses( oSettings )
  		{
  			var i, iLen, j, jLen, iFound;
  			var aaSort, sClass;
  			var iColumns = oSettings.aoColumns.length;
  			var oClasses = oSettings.oClasses;
  			
  			for ( i=0 ; i<iColumns ; i++ )
  			{
  				if ( oSettings.aoColumns[i].bSortable )
  				{
  					$(oSettings.aoColumns[i].nTh).removeClass( oClasses.sSortAsc +" "+ oClasses.sSortDesc +
  						" "+ oSettings.aoColumns[i].sSortingClass );
  				}
  			}
  			
  			if ( oSettings.aaSortingFixed !== null )
  			{
  				aaSort = oSettings.aaSortingFixed.concat( oSettings.aaSorting );
  			}
  			else
  			{
  				aaSort = oSettings.aaSorting.slice();
  			}
  			
  			/* Apply the required classes to the header */
  			for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
  			{
  				if ( oSettings.aoColumns[i].bSortable )
  				{
  					sClass = oSettings.aoColumns[i].sSortingClass;
  					iFound = -1;
  					for ( j=0 ; j<aaSort.length ; j++ )
  					{
  						if ( aaSort[j][0] == i )
  						{
  							sClass = ( aaSort[j][1] == "asc" ) ?
  								oClasses.sSortAsc : oClasses.sSortDesc;
  							iFound = j;
  							break;
  						}
  					}
  					$(oSettings.aoColumns[i].nTh).addClass( sClass );
  					
  					if ( oSettings.bJUI )
  					{
  						/* jQuery UI uses extra markup */
  						var jqSpan = $("span."+oClasses.sSortIcon,  oSettings.aoColumns[i].nTh);
  						jqSpan.removeClass(oClasses.sSortJUIAsc +" "+ oClasses.sSortJUIDesc +" "+ 
  							oClasses.sSortJUI +" "+ oClasses.sSortJUIAscAllowed +" "+ oClasses.sSortJUIDescAllowed );
  						
  						var sSpanClass;
  						if ( iFound == -1 )
  						{
  						 	sSpanClass = oSettings.aoColumns[i].sSortingClassJUI;
  						}
  						else if ( aaSort[iFound][1] == "asc" )
  						{
  							sSpanClass = oClasses.sSortJUIAsc;
  						}
  						else
  						{
  							sSpanClass = oClasses.sSortJUIDesc;
  						}
  						
  						jqSpan.addClass( sSpanClass );
  					}
  				}
  				else
  				{
  					/* No sorting on this column, so add the base class. This will have been assigned by
  					 * _fnAddColumn
  					 */
  					$(oSettings.aoColumns[i].nTh).addClass( oSettings.aoColumns[i].sSortingClass );
  				}
  			}
  			
  			/* 
  			 * Apply the required classes to the table body
  			 * Note that this is given as a feature switch since it can significantly slow down a sort
  			 * on large data sets (adding and removing of classes is always slow at the best of times..)
  			 * Further to this, note that this code is admitadly fairly ugly. It could be made a lot 
  			 * simpiler using jQuery selectors and add/removeClass, but that is significantly slower
  			 * (on the order of 5 times slower) - hence the direct DOM manipulation here.
  			 * Note that for defered drawing we do use jQuery - the reason being that taking the first
  			 * row found to see if the whole column needs processed can miss classes since the first
  			 * column might be new.
  			 */
  			sClass = oClasses.sSortColumn;
  			
  			if ( oSettings.oFeatures.bSort && oSettings.oFeatures.bSortClasses )
  			{
  				var nTds = _fnGetTdNodes( oSettings );
  		
  				/* Remove the old classes */
  				if ( oSettings.oFeatures.bDeferRender )
  				{
  					$(nTds).removeClass(sClass+'1 '+sClass+'2 '+sClass+'3');
  				}
  				else if ( nTds.length >= iColumns )
  				{
  					for ( i=0 ; i<iColumns ; i++ )
  					{
  						if ( nTds[i].className.indexOf(sClass+"1") != -1 )
  						{
  							for ( j=0, jLen=(nTds.length/iColumns) ; j<jLen ; j++ )
  							{
  								nTds[(iColumns*j)+i].className = 
  									$.trim( nTds[(iColumns*j)+i].className.replace( sClass+"1", "" ) );
  							}
  						}
  						else if ( nTds[i].className.indexOf(sClass+"2") != -1 )
  						{
  							for ( j=0, jLen=(nTds.length/iColumns) ; j<jLen ; j++ )
  							{
  								nTds[(iColumns*j)+i].className = 
  									$.trim( nTds[(iColumns*j)+i].className.replace( sClass+"2", "" ) );
  							}
  						}
  						else if ( nTds[i].className.indexOf(sClass+"3") != -1 )
  						{
  							for ( j=0, jLen=(nTds.length/iColumns) ; j<jLen ; j++ )
  							{
  								nTds[(iColumns*j)+i].className = 
  									$.trim( nTds[(iColumns*j)+i].className.replace( " "+sClass+"3", "" ) );
  							}
  						}
  					}
  				}
  				
  				/* Add the new classes to the table */
  				var iClass = 1, iTargetCol;
  				for ( i=0 ; i<aaSort.length ; i++ )
  				{
  					iTargetCol = parseInt( aaSort[i][0], 10 );
  					for ( j=0, jLen=(nTds.length/iColumns) ; j<jLen ; j++ )
  					{
  						nTds[(iColumns*j)+iTargetCol].className += " "+sClass+iClass;
  					}
  					
  					if ( iClass < 3 )
  					{
  						iClass++;
  					}
  				}
  			}
  		}