Files
galaxy/static/scripts/packed/libs/jquery/jquery.autocomplete.js
T

1 line
14 KiB
JavaScript

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