function _fnFeatureHtmlFilter ( settings )
		{
			var classes = settings.oClasses;
			var tableId = settings.sTableId;
			var language = settings.oLanguage;
			var previousSearch = settings.oPreviousSearch;
			var features = settings.aanFeatures;
			var input = '<input type="search" class="'+classes.sFilterInput+'"/>';
		
			var str = language.sSearch;
			str = str.match(/_INPUT_/) ?
				str.replace('_INPUT_', input) :
				str+input;
		
			var filter = $('<div/>', {
					'id': ! features.f ? tableId+'_filter' : null,
					'class': classes.sFilter
				} )
				.append( $('<label/>' ).append( str ) );
		
			var searchFn = function(event) {
				/* Update all other filter input elements for the new display */
				features.f;
				var val = !this.value ? "" : this.value; // mental IE8 fix :-(
				if(previousSearch.return && event.key !== "Enter") {
					return;
				}
				/* Now do the filter */
				if ( val != previousSearch.sSearch ) {
					_fnFilterComplete( settings, {
						"sSearch": val,
						"bRegex": previousSearch.bRegex,
						"bSmart": previousSearch.bSmart ,
						"bCaseInsensitive": previousSearch.bCaseInsensitive,
						"return": previousSearch.return
					} );
		
					// Need to redraw, without resorting
					settings._iDisplayStart = 0;
					_fnDraw( settings );
				}
			};
		
			var searchDelay = settings.searchDelay !== null ?
				settings.searchDelay :
				_fnDataSource( settings ) === 'ssp' ?
					400 :
					0;
		
			var jqFilter = $('input', filter)
				.val( previousSearch.sSearch )
				.attr( 'placeholder', language.sSearchPlaceholder )
				.on(
					'keyup.DT search.DT input.DT paste.DT cut.DT',
					searchDelay ?
						_fnThrottle( searchFn, searchDelay ) :
						searchFn
				)
				.on( 'mouseup', function(e) {
					// Edge fix! Edge 17 does not trigger anything other than mouse events when clicking
					// on the clear icon (Edge bug 17584515). This is safe in other browsers as `searchFn`
					// checks the value to see if it has changed. In other browsers it won't have.
					setTimeout( function () {
						searchFn.call(jqFilter[0], e);
					}, 10);
				} )
				.on( 'keypress.DT', function(e) {
					/* Prevent form submission */
					if ( e.keyCode == 13 ) {
						return false;
					}
				} )
				.attr('aria-controls', tableId);
		
			// Update the input elements whenever the table is filtered
			$(settings.nTable).on( 'search.dt.DT', function ( ev, s ) {
				if ( settings === s ) {
					// IE9 throws an 'unknown error' if document.activeElement is used
					// inside an iframe or frame...
					try {
						if ( jqFilter[0] !== document.activeElement ) {
							jqFilter.val( previousSearch.sSearch );
						}
					}
					catch ( e ) {}
				}
			} );
		
			return filter[0];
		}
/**
		 * Generate the node required for filtering text
		 *  @returns {node} Filter control element
		 *  @param {object} oSettings dataTables settings object
		 *  @memberof DataTable#oApi
		 */
Generate the node required for filtering text
@returns {node} Filter control element
@param {object} oSettings dataTables settings object
@memberof DataTable#oApi
Generate the node required for filtering text @returns { node } Filter control element @param { object } oSettings dataTables settings object @memberof DataTable#oApi
function _fnFeatureHtmlFilter ( settings )
		{
			var classes = settings.oClasses;
			var tableId = settings.sTableId;
			var language = settings.oLanguage;
			var previousSearch = settings.oPreviousSearch;
			var features = settings.aanFeatures;
			var input = '<input type="search" class="'+classes.sFilterInput+'"/>';
			var str = language.sSearch;
			str = str.match(/_INPUT_/) ?
				str.replace('_INPUT_', input) :
				str+input;
			var filter = $('<div/>', {
					'id': ! features.f ? tableId+'_filter' : null,
					'class': classes.sFilter
				} )
				.append( $('<label/>' ).append( str ) );
			var searchFn = function(event) {
				features.f;
				var val = !this.value ? "" : this.value; 
				if(previousSearch.return && event.key !== "Enter") {
					return;
				}
				if ( val != previousSearch.sSearch ) {
					_fnFilterComplete( settings, {
						"sSearch": val,
						"bRegex": previousSearch.bRegex,
						"bSmart": previousSearch.bSmart ,
						"bCaseInsensitive": previousSearch.bCaseInsensitive,
						"return": previousSearch.return
					} );
					settings._iDisplayStart = 0;
					_fnDraw( settings );
				}
			};
			var searchDelay = settings.searchDelay !== null ?
				settings.searchDelay :
				_fnDataSource( settings ) === 'ssp' ?
					400 :
					0;
			var jqFilter = $('input', filter)
				.val( previousSearch.sSearch )
				.attr( 'placeholder', language.sSearchPlaceholder )
				.on(
					'keyup.DT search.DT input.DT paste.DT cut.DT',
					searchDelay ?
						_fnThrottle( searchFn, searchDelay ) :
						searchFn
				)
				.on( 'mouseup', function(e) {
					setTimeout( function () {
						searchFn.call(jqFilter[0], e);
					}, 10);
				} )
				.on( 'keypress.DT', function(e) {
					if ( e.keyCode == 13 ) {
						return false;
					}
				} )
				.attr('aria-controls', tableId);
			$(settings.nTable).on( 'search.dt.DT', function ( ev, s ) {
				if ( settings === s ) {
					try {
						if ( jqFilter[0] !== document.activeElement ) {
							jqFilter.val( previousSearch.sSearch );
						}
					}
					catch ( e ) {}
				}
			} );
			return filter[0];
		}
function _fnFeatureHtmlFilter ( settings ) { var classes = settings . oClasses ; var tableId = settings . sTableId ; var language = settings . oLanguage ; var previousSearch = settings . oPreviousSearch ; var features = settings . aanFeatures ; var input = '<input type="search" class="' + classes . sFilterInput + '"/>' ; var str = language . sSearch ; str = str . match ( / _INPUT_ / ) ? str . replace ( '_INPUT_' , input ) : str + input ; var filter = $ ( '<div/>' , { 'id' : ! features . f ? tableId + '_filter' : null , 'class' : classes . sFilter } ) . append ( $ ( '<label/>' ) . append ( str ) ) ; var searchFn = function ( event ) { features . f ; var val = ! this . value ? "" : this . value ; if ( previousSearch . return && event . key !== "Enter" ) { return ; } if ( val != previousSearch . sSearch ) { _fnFilterComplete ( settings , { "sSearch" : val , "bRegex" : previousSearch . bRegex , "bSmart" : previousSearch . bSmart , "bCaseInsensitive" : previousSearch . bCaseInsensitive , "return" : previousSearch . return } ) ; settings . _iDisplayStart = 0 ; _fnDraw ( settings ) ; } } ; var searchDelay = settings . searchDelay !== null ? settings . searchDelay : _fnDataSource ( settings ) === 'ssp' ? 400 : 0 ; var jqFilter = $ ( 'input' , filter ) . val ( previousSearch . sSearch ) . attr ( 'placeholder' , language . sSearchPlaceholder ) . on ( 'keyup.DT search.DT input.DT paste.DT cut.DT' , searchDelay ? _fnThrottle ( searchFn , searchDelay ) : searchFn ) . on ( 'mouseup' , function ( e ) { setTimeout ( function ( ) { searchFn . call ( jqFilter [ 0 ] , e ) ; } , 10 ) ; } ) . on ( 'keypress.DT' , function ( e ) { if ( e . keyCode == 13 ) { return false ; } } ) . attr ( 'aria-controls' , tableId ) ; $ ( settings . nTable ) . on ( 'search.dt.DT' , function ( ev , s ) { if ( settings === s ) { try { if ( jqFilter [ 0 ] !== document . activeElement ) { jqFilter . val ( previousSearch . sSearch ) ; } } catch ( e ) { } } } ) ; return filter [ 0 ] ; }
Generate the node required for filtering text
  @returns {node} Filter control element
  @param {object} oSettings dataTables settings object
  @memberof DataTable#oApi
Generate the node required for filtering text @returns { node } Filter control element @param { object } oSettings dataTables settings object @memberof DataTable#oApi
/* Update all other filter input elements for the new display */ // mental IE8 fix :-( /* Now do the filter */ // Need to redraw, without resorting // Edge fix! Edge 17 does not trigger anything other than mouse events when clicking // on the clear icon (Edge bug 17584515). This is safe in other browsers as `searchFn` // checks the value to see if it has changed. In other browsers it won't have. /* Prevent form submission */ // Update the input elements whenever the table is filtered // IE9 throws an 'unknown error' if document.activeElement is used // inside an iframe or frame...