docs: function _fnFilter( oSettings, sInput, iForce, bRegex, bSmart, bCaseInsensitive )
  		{
  			var i;
  			var rpSearch = _fnFilterCreateSearch( sInput, bRegex, bSmart, bCaseInsensitive );
  			var oPrevSearch = oSettings.oPreviousSearch;
  			
  			/* Check if we are forcing or not - optional parameter */
  			if ( !iForce )
  			{
  				iForce = 0;
  			}
  			
  			/* Need to take account of custom filtering functions - always filter */
  			if ( DataTable.ext.afnFiltering.length !== 0 )
  			{
  				iForce = 1;
  			}
  			
  			/*
  			 * If the input is blank - we want the full data set
  			 */
  			if ( sInput.length <= 0 )
  			{
  				oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length);
  				oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
  			}
  			else
  			{
  				/*
  				 * We are starting a new search or the new search string is smaller 
  				 * then the old one (i.e. delete). Search from the master array
  			 	 */
  				if ( oSettings.aiDisplay.length == oSettings.aiDisplayMaster.length ||
  					   oPrevSearch.sSearch.length > sInput.length || iForce == 1 ||
  					   sInput.indexOf(oPrevSearch.sSearch) !== 0 )
  				{
  					/* Nuke the old display array - we are going to rebuild it */
  					oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length);
  					
  					/* Force a rebuild of the search array */
  					_fnBuildSearchArray( oSettings, 1 );
  					
  					/* Search through all records to populate the search array
  					 * The the oSettings.aiDisplayMaster and asDataSearch arrays have 1 to 1 
  					 * mapping
  					 */
  					for ( i=0 ; i<oSettings.aiDisplayMaster.length ; i++ )
  					{
  						if ( rpSearch.test(oSettings.asDataSearch[i]) )
  						{
  							oSettings.aiDisplay.push( oSettings.aiDisplayMaster[i] );
  						}
  					}
  			  }
  			  else
  				{
  			  	/* Using old search array - refine it - do it this way for speed
  			  	 * Don't have to search the whole master array again
  					 */
  			  	var iIndexCorrector = 0;
  			  	
  			  	/* Search the current results */
  			  	for ( i=0 ; i<oSettings.asDataSearch.length ; i++ )
  					{
  			  		if ( ! rpSearch.test(oSettings.asDataSearch[i]) )
  						{
  			  			oSettings.aiDisplay.splice( i-iIndexCorrector, 1 );
  			  			iIndexCorrector++;
  			  		}
  			  	}
  			  }
  			}
  		}