You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

0 lines
7.5 KiB

  1. (function(e,t,n,o){e.fn.searchPrompt=function(n,i){var a,s=e.extend(!0,{},e.fn.searchPrompt.settings,i),r=arguments[0],c=[].slice.call(arguments,1);return e(this).each(function(){var i,l=e(this),u=l.find(s.selector.searchPrompt),d=l.find(s.selector.searchButton),m=l.find(s.selector.searchResults),f=(l.find(s.selector.result),l.find(s.selector.category),l.find(s.selector.emptyResult),l.find(s.selector.resultPage),this),p=(l.selector||"",l.data("module-"+s.namespace)),g=p!==o&&"string"==typeof r,h=s.className,v=s.namespace,b=s.errors;i={initialize:function(){var e=u[0],t=e.oninput!==o?"input":e.onpropertychange!==o?"propertychange":"keyup";u.on("focus."+v,i.event.focus).on("blur."+v,i.event.blur).on("keydown."+v,i.handleKeyboard),s.automatic&&u.on(t+"."+v,i.search.throttle),d.on("click."+v,i.search.query),m.on("click."+v,s.selector.result,i.results.select),l.data("module-"+v,i)},event:{focus:function(){l.addClass(h.focus),i.results.show()},blur:function(){i.search.cancel(),l.removeClass(h.focus),i.results.hide()}},handleKeyboard:function(t){var n,o=l.find(s.selector.result),a=l.find(s.selector.category),r=t.which,c={backspace:8,enter:13,escape:27,upArrow:38,downArrow:40},f=h.active,p=o.index(o.filter("."+f)),g=o.size();if(r==c.escape&&u.trigger("blur"),m.filter(":visible").size()>0)if(r==c.enter){if(o.filter("."+f).exists())return e.proxy(i.results.select,o.filter("."+f))(),t.preventDefault(),!1}else r==c.upArrow?(n=0>p-1?p:p-1,a.removeClass(f),o.removeClass(f).eq(n).addClass(f).closest(a).addClass(f),t.preventDefault()):r==c.downArrow&&(n=p+1>=g?p:p+1,a.removeClass(f),o.removeClass(f).eq(n).addClass(f).closest(a).addClass(f),t.preventDefault());else r==c.enter&&(i.search.query(),d.addClass(h.down),u.one("keyup",function(){d.removeClass(h.down)}))},search:{cancel:function(){var e=l.data("xhr")||!1;e&&"resolved"!=e.state()&&e.abort()},throttle:function(){var e,t=u.val(),n=t.length;clearTimeout(l.data("timer")),n>=s.minCharacters?(e=setTimeout(i.search.query,s.searchThrottle),l.data("timer",e)):i.results.hide()},query:function(){var t=u.val(),o=i.search.cache.read(t);o?(i.debug("Reading result for '"+t+"' from cache"),i.results.add(o)):(i.debug("Querying for '"+t+"'"),"object"==typeof n?i.search.local(t):i.search.remote(t),e.proxy(s.onSearchQuery,l)(t))},local:function(t){var o,a=[],r=[],c=e.isArray(s.searchFields)?s.searchFields:[s.searchFields],u=RegExp("(?:s|^)"+t,"i"),d=RegExp(t,"i");l.addClass(h.loading),e.each(c,function(t,o){e.each(n,function(t,n){"string"==typeof n[o]&&-1==e.inArray(n,a)&&-1==e.inArray(n,r)&&(u.test(n[o])?a.push(n):d.test(n[o])&&r.push(n))})}),o=i.results.generate({results:e.merge(a,r)}),l.removeClass(h.loading),i.search.cache.write(t,o),i.results.add(o)},remote:function(t){var a,r=l.data("xhr")!==o?l.data("xhr"):!1,c={stateContext:l,url:n,urlData:{query:t},success:function(e){a=i.results.generate(e),i.search.cache.write(t,a),i.results.add(a)},failure:i.error};r&&"resolved"!=r.state()&&r.abort(),e.extend(!0,c,s.apiSettings),e.api(c)},cache:{read:function(e){var t=l.data("cache");return s.cache&&"object"==typeof t&&t[e]!==o?t[e]:!1},write:function(e,t){var n=l.data("cache")!==o?l.data("cache"):{};n[e]=t,l.data("cache",n)}}},results:{generate:function(t){i.debug("Generating html from response",t);var n=s.templates[s.type],o="";return e.isPlainObject(t.results)&&!e.isEmptyObject(t.results)||e.isArray(t.results)&&t.results.length>0?(s.maxResults>0&&(t.results=e.makeArray(t.results).slice(0,s.maxResults)),t.results.length>0&&(e.isFunction(n)?o=n(t):i.error(b.noTemplate,!1))):o=i.message(b.noResults,"empty"),e.proxy(s.onSearchResults,l)(t),o},add:function(t){("default"==s.onResultsAdd||"default"==e.proxy(s.onResultsAdd,m)(t))&&m.html(t),i.results.show()},show:function(){0===m.filter(":visible").size()&&u.filter(":focus").size()>0&&""!==m.html()&&(m.stop().fadeIn(200),e.proxy(s.onResultsOpen,m)())},hide:function(){m.filter(":visible").size()>0&&(m.stop().fadeOut(200),e.proxy(s.onResultsClose,m)())},followLink:function(){},select:function(n){i.debug("Search result selected");var o=e(this),a=o.find(".title")