Files
galaxy/static/scripts/libs/jquery/jquery.autocomplete.js
T
2018-05-23 15:37:14 -04:00

1 line
14 KiB
JavaScript

!function(t){"use strict";t.fn.autocomplete_verheul=function(e){var s;arguments.length>1?(s=e,(e=arguments[1]).url=s):"string"==typeof e&&(e={url:s=e});var o=t.extend({},t.fn.autocomplete_verheul.defaults,e);return this.each(function(){var e=t(this);e.data("autocompleter",new t.Autocompleter(e,t.meta?t.extend({},o,e.data()):o))})},t.fn.autocomplete_verheul.defaults={inputClass:"acInput",loadingClass:"acLoading",resultsClass:"acResults",selectClass:"acSelect",queryParamName:"q",extraParams:{},remoteDataType:!1,lineSeparator:"\n",cellSeparator:"|",minChars:2,maxItemsToShow:10,delay:400,useCache:!0,maxCacheLength:10,matchSubset:!0,matchCase:!1,matchInside:!0,mustMatch:!1,selectFirst:!1,selectOnly:!1,showResult:null,preventDefaultReturn:1,preventDefaultTab:0,autoFill:!1,filterResults:!0,filter:!0,sortResults:!0,sortFunction:null,onItemSelect:null,onNoMatch:null,onFinish:null,matchStringConverter:null,beforeUseConverter:null,autoWidth:"min-width",useDelimiter:!1,delimiterChar:",",delimiterKeyCode:188,processData:null,onError:null,enabled:!0};var e=function(e){var s,o,i=typeof e;return"string"===i?(s=e,o={}):t.isArray(e)?(s=e[0],o=e.slice(1)):"object"===i&&(s=e.value,o=e.data),s=String(s),"object"!=typeof o&&(o={}),{value:s,data:o}},s=function(t,e,s){var o=parseInt(t,10);return s=s||{},(isNaN(o)||s.min&&o<s.min)&&(o=e),o},o=function(t,e){return[t,encodeURIComponent(e)].join("=")},i=function(e,s){var i=[];return t.each(s,function(t,e){i.push(o(t,e))}),i.length&&(e+=-1===e.indexOf("?")?"?":"&",e+=i.join("&")),e},a=function(t,e,s){return t=String(t.value),e=String(e.value),s||(t=t.toLowerCase(),e=e.toLowerCase()),t>e?1:t<e?-1:0},r=function(t,e,s){var o,i,a,r,n,l,u=[];for(l=String(t).replace("\r\n","\n").split(e),o=0;o<l.length;o++){for(r=l[o].split(s),a=[],i=0;i<r.length;i++)a.push(decodeURIComponent(r[i]));n=a.shift(),u.push({value:n,data:a})}return u};t.Autocompleter=function(e,o){if(!e||!(e instanceof t)||1!==e.length||"INPUT"!==e.get(0).tagName.toUpperCase()&&"TEXTAREA"!==e.get(0).tagName.toUpperCase())throw new Error("Invalid parameter for jquery.Autocompleter, jQuery object with one element with INPUT or TEXTAREA tag expected.");var i=this;this.options=o,this.cacheData_={},this.cacheLength_=0,this.selectClass_="jquery-autocomplete-selected-item",this.keyTimeout_=null,this.finishTimeout_=null,this.lastKeyPressed_=null,this.lastProcessedValue_=null,this.lastSelectedValue_=null,this.active_=!1,this.finishOnBlur_=!0,this.options.minChars=s(this.options.minChars,t.fn.autocomplete_verheul.defaults.minChars,{min:0}),this.options.maxItemsToShow=s(this.options.maxItemsToShow,t.fn.autocomplete_verheul.defaults.maxItemsToShow,{min:0}),this.options.maxCacheLength=s(this.options.maxCacheLength,t.fn.autocomplete_verheul.defaults.maxCacheLength,{min:1}),this.options.delay=s(this.options.delay,t.fn.autocomplete_verheul.defaults.delay,{min:0}),2!=this.options.preventDefaultReturn&&(this.options.preventDefaultReturn=this.options.preventDefaultReturn?1:0),2!=this.options.preventDefaultTab&&(this.options.preventDefaultTab=this.options.preventDefaultTab?1:0),this.dom={},this.dom.$elem=e,this.dom.$elem.attr("autocomplete","off").addClass(this.options.inputClass),this.dom.$results=t("<div></div>").hide().addClass(this.options.resultsClass).css({position:"absolute"}),t("body").append(this.dom.$results),e.keydown(function(t){switch(i.lastKeyPressed_=t.keyCode,i.lastKeyPressed_){case i.options.delimiterKeyCode:i.options.useDelimiter&&i.active_&&i.selectCurrent();break;case 35:case 36:case 16:case 17:case 18:case 37:case 39:break;case 38:return t.preventDefault(),i.active_?i.focusPrev():i.activate(),!1;case 40:return t.preventDefault(),i.active_?i.focusNext():i.activate(),!1;case 9:if(i.active_&&(i.selectCurrent(),i.options.preventDefaultTab))return t.preventDefault(),!1;if(2===i.options.preventDefaultTab)return t.preventDefault(),!1;break;case 13:if(i.active_&&(i.selectCurrent(),i.options.preventDefaultReturn))return t.preventDefault(),!1;if(2===i.options.preventDefaultReturn)return t.preventDefault(),!1;break;case 27:if(i.active_)return t.preventDefault(),i.deactivate(!0),!1;break;default:i.activate()}}),e.on("paste",function(){i.activate()});var a=function(){i.deactivate(!0)};e.blur(function(){i.finishOnBlur_&&(i.finishTimeout_=setTimeout(a,200))}),e.parents("form").on("submit",a)},t.Autocompleter.prototype.position=function(){var e=this.dom.$elem.offset(),s=this.dom.$results.outerHeight(),o=t(window).outerHeight(),i=e.top+this.dom.$elem.outerHeight(),a=i+s,r={top:i,left:e.left};if(a>o){var n=e.top-s;n>=0&&(r.top=n)}this.dom.$results.css(r)},t.Autocompleter.prototype.cacheRead=function(t){var e,s,o,i,a;if(this.options.useCache)for(e=(t=String(t)).length,s=this.options.matchSubset?1:e;s<=e;){for(i=this.options.matchInside?e-s:0,a=0;a<=i;){if(o=t.substr(0,s),void 0!==this.cacheData_[o])return this.cacheData_[o];a++}s++}return!1},t.Autocompleter.prototype.cacheWrite=function(t,e){return!!this.options.useCache&&(this.cacheLength_>=this.options.maxCacheLength&&this.cacheFlush(),t=String(t),void 0!==this.cacheData_[t]&&this.cacheLength_++,this.cacheData_[t]=e,this.cacheData_[t])},t.Autocompleter.prototype.cacheFlush=function(){this.cacheData_={},this.cacheLength_=0},t.Autocompleter.prototype.callHook=function(e,s){var o=this.options[e];return!(!o||!t.isFunction(o))&&o(s,this)},t.Autocompleter.prototype.activate=function(){if(this.options.enabled){var t=this;this.keyTimeout_&&clearTimeout(this.keyTimeout_),this.keyTimeout_=setTimeout(function(){t.activateNow()},this.options.delay)}},t.Autocompleter.prototype.activateNow=function(){var t=this.beforeUseConverter(this.dom.$elem.val());t!==this.lastProcessedValue_&&t!==this.lastSelectedValue_&&this.fetchData(t)},t.Autocompleter.prototype.fetchData=function(t){var e=this,s=function(t,s){e.options.processData&&(t=e.options.processData(t)),e.showResults(e.filterResults(t,s),s)};this.lastProcessedValue_=t,t.length<this.options.minChars?s([],t):this.options.data?s(this.options.data,t):this.fetchRemoteData(t,function(e){s(e,t)})},t.Autocompleter.prototype.fetchRemoteData=function(e,s){var o=this.cacheRead(e);if(o)s(o);else{var i=this,a="json"===i.options.remoteDataType?"json":"text",r=function(t){var o=!1;!1!==t&&(o=i.parseRemoteData(t),i.cacheWrite(e,o)),i.dom.$elem.removeClass(i.options.loadingClass),s(o)};this.dom.$elem.addClass(this.options.loadingClass),t.ajax({url:this.makeUrl(e),success:r,error:function(e,s,o){t.isFunction(i.options.onError)?i.options.onError(e,s,o):r(!1)},dataType:a})}},t.Autocompleter.prototype.setExtraParam=function(e,s){var o=t.trim(String(e));return o&&(this.options.extraParams||(this.options.extraParams={}),this.options.extraParams[o]!==s&&(this.options.extraParams[o]=s,this.cacheFlush())),this},t.Autocompleter.prototype.makeUrl=function(e){var s=this.options.url,o=t.extend({},this.options.extraParams);return!1===this.options.queryParamName?s+=encodeURIComponent(e):o[this.options.queryParamName]=e,i(s,o)},t.Autocompleter.prototype.parseRemoteData=function(e){var s,o=e;if("json"===this.options.remoteDataType){switch(s=typeof e){case"object":o=e;break;case"string":o=t.parseJSON(e);break;default:throw new Error("Unexpected remote data type: "+s)}return o}return r(o,this.options.lineSeparator,this.options.cellSeparator)},t.Autocompleter.prototype.defaultFilter=function(t,e){if(!t.value)return!1;if(this.options.filterResults){var s=this.matchStringConverter(e),o=this.matchStringConverter(t.value);this.options.matchCase||(s=s.toLowerCase(),o=o.toLowerCase());var i=o.indexOf(s);return this.options.matchInside?i>-1:0===i}return!0},t.Autocompleter.prototype.filterResult=function(e,s){return!1===this.options.filter||(t.isFunction(this.options.filter)?this.options.filter(e,s):this.defaultFilter(e,s))},t.Autocompleter.prototype.filterResults=function(t,s){var o,i,a=[];for(o=0;o<t.length;o++)i=e(t[o]),this.filterResult(i,s)&&a.push(i);return this.options.sortResults&&(a=this.sortResults(a,s)),this.options.maxItemsToShow>0&&this.options.maxItemsToShow<a.length&&(a.length=this.options.maxItemsToShow),a},t.Autocompleter.prototype.sortResults=function(e,s){var o=this,i=this.options.sortFunction;return t.isFunction(i)||(i=function(t,e,s){return a(t,e,o.options.matchCase)}),e.sort(function(t,e){return i(t,e,s,o.options)}),e},t.Autocompleter.prototype.matchStringConverter=function(e,s,o){var i=this.options.matchStringConverter;return t.isFunction(i)&&(e=i(e,s,o)),e},t.Autocompleter.prototype.beforeUseConverter=function(e){e=this.getValue(e);var s=this.options.beforeUseConverter;return t.isFunction(s)&&(e=s(e)),e},t.Autocompleter.prototype.enableFinishOnBlur=function(){this.finishOnBlur_=!0},t.Autocompleter.prototype.disableFinishOnBlur=function(){this.finishOnBlur_=!1},t.Autocompleter.prototype.createItemFromResult=function(e){var s=this,o=t("<li/>");return o.html(this.showResult(e.value,e.data)),o.data({value:e.value,data:e.data}).click(function(){s.selectItem(o)}).mousedown(s.disableFinishOnBlur).mouseup(s.enableFinishOnBlur),o},t.Autocompleter.prototype.getItems=function(){return t(">ul>li",this.dom.$results)},t.Autocompleter.prototype.showResults=function(e,s){var o,i,a,r,n=e.length,l=this,u=t("<ul></ul>"),h=!1,c=!1;if(n){for(o=0;o<n;o++)i=e[o],a=this.createItemFromResult(i),u.append(a),!1===h&&(h=String(i.value),c=a,a.addClass(this.options.firstItemClass)),o===n-1&&a.addClass(this.options.lastItemClass);this.dom.$results.html(u).show(),this.position(),this.options.autoWidth&&(r=this.dom.$elem.outerWidth()-this.dom.$results.outerWidth()+this.dom.$results.width(),this.dom.$results.css(this.options.autoWidth,r)),this.getItems().hover(function(){l.focusItem(this)},function(){}),(this.autoFill(h,s)||this.options.selectFirst||this.options.selectOnly&&1===n)&&this.focusItem(c),this.active_=!0}else this.hideResults(),this.active_=!1},t.Autocompleter.prototype.showResult=function(e,s){return t.isFunction(this.options.showResult)?this.options.showResult(e,s):t("<p></p>").text(e).html()},t.Autocompleter.prototype.autoFill=function(t,e){var s,o,i,a;if(this.options.autoFill&&8!==this.lastKeyPressed_&&(s=String(t).toLowerCase(),o=String(e).toLowerCase(),i=t.length,a=e.length,s.substr(0,a)===o)){var r=this.getDelimiterOffsets(),n=r.start?" ":"";this.setValue(n+t);var l=a+r.start+n.length,u=i+r.start+n.length;return this.selectRange(l,u),!0}return!1},t.Autocompleter.prototype.focusNext=function(){this.focusMove(1)},t.Autocompleter.prototype.focusPrev=function(){this.focusMove(-1)},t.Autocompleter.prototype.focusMove=function(e){var o=this.getItems();if(e=s(e,0))for(var i=0;i<o.length;i++)if(t(o[i]).hasClass(this.selectClass_))return void this.focusItem(i+e);this.focusItem(0)},t.Autocompleter.prototype.focusItem=function(e){var s,o=this.getItems();o.length&&(o.removeClass(this.selectClass_).removeClass(this.options.selectClass),"number"==typeof e?(e<0?e=0:e>=o.length&&(e=o.length-1),s=t(o[e])):s=t(e),s&&s.addClass(this.selectClass_).addClass(this.options.selectClass))},t.Autocompleter.prototype.selectCurrent=function(){var e=t("li."+this.selectClass_,this.dom.$results);1===e.length?this.selectItem(e):this.deactivate(!1)},t.Autocompleter.prototype.selectItem=function(t){var e=t.data("value"),s=t.data("data"),o=this.displayValue(e,s),i=this.beforeUseConverter(o);this.lastProcessedValue_=i,this.lastSelectedValue_=i;var a=this.getDelimiterOffsets(),r=this.options.delimiterChar,n=this.dom.$elem,l=0;this.options.useDelimiter&&(n.val().substring(a.start-1,a.start)==r&&" "!=r&&(o=" "+o),n.val().substring(a.end,a.end+1)!=r&&this.lastKeyPressed_!=this.options.delimiterKeyCode?o+=r:l=1),this.setValue(o),this.setCaret(a.start+o.length+l),this.callHook("onItemSelect",{value:e,data:s}),this.deactivate(!0),n.focus()},t.Autocompleter.prototype.displayValue=function(e,s){return t.isFunction(this.options.displayValue)?this.options.displayValue(e,s):e},t.Autocompleter.prototype.hideResults=function(){this.dom.$results.hide()},t.Autocompleter.prototype.deactivate=function(t){this.finishTimeout_&&clearTimeout(this.finishTimeout_),this.keyTimeout_&&clearTimeout(this.keyTimeout_),t&&(this.lastProcessedValue_!==this.lastSelectedValue_&&(this.options.mustMatch&&this.setValue(""),this.callHook("onNoMatch")),this.active_&&this.callHook("onFinish"),this.lastKeyPressed_=null,this.lastProcessedValue_=null,this.lastSelectedValue_=null,this.active_=!1),this.hideResults()},t.Autocompleter.prototype.selectRange=function(t,e){var s=this.dom.$elem.get(0);if(s.setSelectionRange)s.focus(),s.setSelectionRange(t,e);else if(s.createTextRange){var o=s.createTextRange();o.collapse(!0),o.moveEnd("character",e),o.moveStart("character",t),o.select()}},t.Autocompleter.prototype.setCaret=function(t){this.selectRange(t,t)},t.Autocompleter.prototype.getCaret=function(){var t,e,s,o,i,a,r=this.dom.$elem,n=r[0];return n.createTextRange?(e=document.selection,"textarea"!=n.tagName.toLowerCase()?(t=r.val(),(s=e.createRange().duplicate()).moveEnd("character",t.length),o=""===s.text?t.length:t.lastIndexOf(s.text),(s=e.createRange().duplicate()).moveStart("character",-t.length),i=s.text.length):((a=(s=e.createRange()).duplicate()).moveToElementText(n),a.setEndPoint("EndToEnd",s),i=(o=a.text.length-s.text.length)+s.text.length)):(o=r[0].selectionStart,i=r[0].selectionEnd),{start:o,end:i}},t.Autocompleter.prototype.setValue=function(t){if(this.options.useDelimiter){var e=this.dom.$elem.val(),s=this.getDelimiterOffsets();t=e.substring(0,s.start)+t+e.substring(s.end)}this.dom.$elem.val(t)},t.Autocompleter.prototype.getValue=function(t){if(this.options.useDelimiter){var e=this.getDelimiterOffsets();return t.substring(e.start,e.end).trim()}return t},t.Autocompleter.prototype.getDelimiterOffsets=function(){var t=this.dom.$elem.val();if(this.options.useDelimiter){var e=t.substring(0,this.getCaret().start).lastIndexOf(this.options.delimiterChar)+1,s=t.substring(this.getCaret().start).indexOf(this.options.delimiterChar);-1==s&&(s=t.length),s+=this.getCaret().start}else e=0,s=t.length;return{start:e,end:s}}}(jQuery);