(function($){ "use strict"; var selector = '.aws-container'; var instance = 0; var pluginPfx = 'aws_opts'; $.fn.aws_search = function( options ) { instance++; var self = $(this), $searchForm = self.find('.aws-search-form'), $searchField = self.find('.aws-search-field'), haveResults = false, requests = Array(), searchFor = '', cachedResponse = new Array(); var ajaxUrl = ( self.data('url') !== undefined ) ? self.data('url') : false; //var siteUrl = ( self.data('siteurl') !== undefined ) ? self.data('siteurl') : false; self.data( pluginPfx, { minChars : ( self.data('min-chars') !== undefined ) ? self.data('min-chars') : 1, showLoader: ( self.data('show-loader') !== undefined ) ? self.data('show-loader') : true, instance: instance, resultBlock: '#aws-search-result-' + instance }); var d = self.data(pluginPfx); var methods = { init: function() { $('body').append(''); setTimeout(function() { methods.resultLayout(); }, 500) }, 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 === '' ) { $(d.resultBlock).html(''); return; } if ( typeof cachedResponse[searchFor] != 'undefined') { methods.showResults( cachedResponse[searchFor] ); return; } if ( searchFor.length < d.minChars ) { $(d.resultBlock).html(''); return; } if ( d.showLoader ) { $searchForm.addClass('processing'); } var data = { action: 'aws_action', keyword : searchFor, page: 0 }; requests.push( $.ajax({ type: 'POST', url: ajaxUrl, data: data, success: function( response ) { var response = $.parseJSON( response ); cachedResponse[searchFor] = response; methods.showResults( response ); $(d.resultBlock).show(); }, error: function (data, dummy) { } }) ); }, showResults: function( response ) { var html = ''; $searchForm.removeClass('processing'); $(d.resultBlock).html( html ); $(d.resultBlock).show(); }, onFocus: function( event ) { if ( searchFor !== '' ) { $(d.resultBlock).show(); } }, hideResults: function( event ) { if ( ! $(event.target).closest( ".aws-container" ).length ) { $(d.resultBlock).hide(); } }, resultLayout: function () { var offset = self.offset(); if ( offset ) { var width = self.outerWidth(); var top = offset.top + $(self).innerHeight(); var left = offset.left; $( d.resultBlock ).css({ width : width, top : top, left: left }); } } }; if ( $searchForm.length > 0 ) { methods.init.call(this); } $searchField.on( 'keyup', function(e) { methods.onKeyup(e); }); $searchField.on( 'focus', function (e) { methods.onFocus(e); }); $(document).on( 'click', function (e) { methods.hideResults(e); }); $(window).on( 'resize', function(e) { methods.resultLayout(); }); }; // Call plugin method $(document).ready(function() { $(selector).each( function() { $(this).aws_search(); }); }); })( jQuery );