(function($){
"use strict";
var selector = '.aws-container';
var instance = 0;
var pluginPfx = 'aws_opts';
var translate = {
sale : aws_vars.sale,
noresults : aws_vars.noresults
};
$.fn.aws_search = function( options ) {
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('');
methods.hideLoader();
return;
}
if ( typeof cachedResponse[searchFor] != 'undefined') {
methods.showResults( cachedResponse[searchFor] );
return;
}
if ( searchFor.length < d.minChars ) {
$(d.resultBlock).html('');
methods.hideLoader();
return;
}
if ( d.showLoader ) {
methods.showLoader();
}
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 );
methods.showResultsBlock();
methods.analytics( searchFor );
},
error: function (data, dummy) {
}
})
);
},
showResults: function( response ) {
var html = '';
methods.hideLoader();
$(d.resultBlock).html( html );
methods.showResultsBlock();
},
showResultsBlock: function() {
methods.resultLayout();
$(d.resultBlock).show();
},
showLoader: function() {
$searchForm.addClass('processing');
},
hideLoader: function() {
$searchForm.removeClass('processing');
},
onFocus: function( event ) {
if ( searchFor !== '' ) {
methods.showResultsBlock();
}
},
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
});
}
},
analytics: function( label ) {
if ( d.useAnalytics ) {
try {
ga('send', 'event', 'AWS search', 'AWS Search Term', label);
}
catch (error) {
}
}
}
};
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;
if ( options === 'relayout' ) {
var d = self.data(pluginPfx);
methods.resultLayout();
return;
}
instance++;
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,
useAnalytics: ( self.data('use-analytics') !== undefined ) ? self.data('use-analytics') : false,
instance: instance,
resultBlock: '#aws-search-result-' + instance
});
var d = self.data(pluginPfx);
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();
});
$(window).on( 'scroll', function(e) {
if ( $( d.resultBlock ).css('display') == 'block' ) {
methods.resultLayout();
}
});
};
// Call plugin method
$(document).ready(function() {
$(selector).each( function() {
$(this).aws_search();
});
});
})( jQuery );