docs: function _fnFilterComplete ( oSettings, oInput, iForce )
  		{
  			var oPrevSearch = oSettings.oPreviousSearch;
  			var aoPrevSearch = oSettings.aoPreSearchCols;
  			var fnSaveFilter = function ( oFilter ) {
  				/* Save the filtering values */
  				oPrevSearch.sSearch = oFilter.sSearch;
  				oPrevSearch.bRegex = oFilter.bRegex;
  				oPrevSearch.bSmart = oFilter.bSmart;
  				oPrevSearch.bCaseInsensitive = oFilter.bCaseInsensitive;
  			};
  		
  			/* In server-side processing all filtering is done by the server, so no point hanging around here */
  			if ( !oSettings.oFeatures.bServerSide )
  			{
  				/* Global filter */
  				_fnFilter( oSettings, oInput.sSearch, iForce, oInput.bRegex, oInput.bSmart, oInput.bCaseInsensitive );
  				fnSaveFilter( oInput );
  		
  				/* Now do the individual column filter */
  				for ( var i=0 ; i<oSettings.aoPreSearchCols.length ; i++ )
  				{
  					_fnFilterColumn( oSettings, aoPrevSearch[i].sSearch, i, aoPrevSearch[i].bRegex, 
  						aoPrevSearch[i].bSmart, aoPrevSearch[i].bCaseInsensitive );
  				}
  				
  				/* Custom filtering */
  				_fnFilterCustom( oSettings );
  			}
  			else
  			{
  				fnSaveFilter( oInput );
  			}
  			
  			/* Tell the draw function we have been filtering */
  			oSettings.bFiltered = true;
  			$(oSettings.oInstance).trigger('filter', oSettings);
  			
  			/* Redraw the table */
  			oSettings._iDisplayStart = 0;
  			_fnCalculateEnd( oSettings );
  			_fnDraw( oSettings );
  			
  			/* Rebuild search array 'offline' */
  			_fnBuildSearchArray( oSettings, 0 );
  		}