
jQuery.fn.wordFilter=function(words,options){var i,regEx,regExps,eStart,eEnd,exp,found,flags;options=jQuery.extend({useOr:false,invert:false,matchType:'prefix',ignoreCase:true,skipHidden:false},options);if(!words){return this;}
if(options.matchType=='prefix'){eStart='.*\\W';eEnd='.*';}else if(options.matchType=='contains'){eStart='.*';eEnd='.*';}else{eStart='.*\\W';eEnd='\\W.*';}
regExps=[];for(i=0;i<words.length;i++){exp=eStart+words[i]+eEnd;regEx=new RegExp();flag='m';if(options.ignoreCase){flags='im';}
regEx.compile(exp,flags);regExps.push(regEx);}
return this.filter(function(index){if(options.skipHidden&&$(this).is(':hidden')){return;}
var txt=' '+$(this).text()+' ';found=false;for(var i=0;i<regExps.length;i++){if(regExps[i].test(txt)){found=true;if(options.useOr){break;}}else{found=false;if(!options.useOr){break;}}}
return options.invert?!found:found;});};jQuery.fn.autoSearch=function(selector,options){var opts={useOr:false,invert:false,matchType:'prefix',ignoreCase:true,skipHidden:false,wait:750};if(options){opts=jQuery.extend(true,opts,options);}
if(opts.invert){opts.invert=!opts.invert;}else{opts.invert=true;}
opts.skipHidden=true;opts.lastSearch=String("");var doSearch=function(opts){var words,hidden,currentShown;var searchItems=jQuery(selector);opts.total=searchItems.size();var s=opts.search;if(!s){searchItems.show();words=[];currentShown=opts.total;hidden=0;}else{if(opts.useOr||opts.matchType=='whole'||opts.useOr||opts.lastSearch.length>s.length||s.indexOf(opts.lastSearch)!==0){searchItems.show();}
currentShown=searchItems.filter(selector+':visible').size();words=s.split(/\s+/);hidden=searchItems.wordFilter(words,opts).hide().size();}
opts.shown=currentShown-hidden;opts.lastSearch=s;opts.words=words;if(jQuery.isFunction(opts.searchCallback)){opts.searchCallback(opts);}};var keyPressTimer=null;var keyUpEventHandler=function(e){var opts=e.data;opts.search=jQuery.trim(jQuery(this).val());if(e.keyCode==13||e.keyCode==32){doSearch(opts);return;}
var timerSearchCall=function(){doSearch(opts);};clearTimeout(keyPressTimer);keyPressTimer=setTimeout(timerSearchCall,opts.wait);};return this.bind('keyup',opts,keyUpEventHandler).trigger('keyup',opts);};