(function($){ "use strict"; $.fn.aws_search = function( options ) { var self = $(this), $searchForm = self.find('.aws-search-form'), $searchField = self.find('.aws-search-field'), $searchResults = self.find('.aws-search-result'), haveResults = false, requests = Array(), searchFor = '', cachedResponse = new Array(); var opts = $.extend( { url : ( self.data('url') !== undefined ) ? self.data('url') : false, siteUrl : ( self.data('siteurl') !== undefined ) ? self.data('siteurl') : false, minChars : ( self.data('min-chars') !== undefined ) ? self.data('min-chars') : 1, showLoader: ( self.data('show-loader') !== undefined ) ? self.data('show-loader') : true }, options ); $searchField.on( 'keyup', function(e) { methods.onKeyup(e); }); $searchField.on( 'focus', function (e) { methods.onFocus(e); }); $(document).on( 'click', function (e) { methods.hideResults(e); }); var methods = { onKeyup: function(e) { searchFor = $searchField.val(); searchFor = searchFor.trim(); searchFor = searchFor.replace( /[`~!@#$%^&*()_|+\-=?;:'",.<>\{\}\[\]\\\/]/gi, '' ); searchFor = searchFor.replace( /\s\s+/g, ' ' ); for ( var i = 0; i < requests.length; i++ ) { requests[i].abort(); } if ( searchFor === '' ) { $searchResults.html(''); return; } if ( typeof cachedResponse[searchFor] != 'undefined') { methods.showResults( cachedResponse[searchFor] ); return; } if ( searchFor.length < opts.minChars ) { $searchResults.html(''); return; } if ( opts.showLoader ) { $searchForm.addClass('processing'); } var data = { action: 'aws_action', keyword : searchFor, page: 0 }; requests.push( $.ajax({ type: 'POST', url: opts.url, data: data, success: function( response ) { var response = $.parseJSON( response ); cachedResponse[searchFor] = response; methods.showResults( response ); $searchResults.show(); }, error: function (data, dummy) { } }) ); }, showResults: function( response ) { var html = ''; $searchForm.removeClass('processing'); $searchResults.html( html ); $searchResults.show(); }, onFocus: function( event ) { if ( searchFor !== '' ) { $searchResults.show(); } }, hideResults: function( event ) { if ( ! $(event.target).closest( ".aws-container" ).length ) { $searchResults.hide(); } } }; }; // Call plugin method $(document).ready(function() { $('.aws-container').each( function() { $(this).aws_search(); }); }); })( jQuery );