forked from yuku/textcomplete
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjquery.textcomplete.min.js
8 lines (8 loc) · 7.87 KB
/
jquery.textcomplete.min.js
1
2
3
4
5
6
7
8
/*!
* jQuery.textcomplete.js
*
* Repositiory: https://github.com/yuku-t/jquery-textcomplete
* License: MIT
* Author: Yuku Takahashi
*/
;(function(c){var h=function(l){var m,k,j;m=function(){k=false};return function(){var n=b(arguments);if(k){j=n;return}k=true;var p=this;n.unshift(function o(){if(j){var q=j;j=undefined;q.unshift(o);l.apply(p,q)}else{k=false}});l.apply(this,n)}};var b=function(k){var j;j=Array.prototype.slice.call(k);return j};var d=(function(){var j;j=c("<div></div>").css(["color"]).color;if(typeof j!=="undefined"){return function(l,k){return l.css(k)}}else{return function(l,k){var m;m={};c.each(k,function(n,o){m[o]=l.css(o)});return m}}})();var f=function(j){return j};var g=function(k){var j={};return function(l,m){if(j[l]){m(j[l])}else{k.call(this,l,function(n){j[l]=(j[l]||[]).concat(n);m.apply(null,arguments)})}}};var a=function(n,m){var k,j;if(n.indexOf){return n.indexOf(m)!=-1}for(k=0,j=n.length;k<j;k++){if(n[k]===m){return true}}return false};var i=(function(){var n,m,l,o,k;n={wrapper:'<div class="textcomplete-wrapper"></div>',list:'<ul class="dropdown-menu"></ul>'};m={wrapper:{position:"relative"},list:{position:"absolute",left:0,zIndex:"100",display:"none"}};l=c(n.wrapper).css(m.wrapper);o=c(n.list).css(m.list);k=0;function j(r){var q;this.el=r.get(0);q=this.el===document.activeElement;this.$el=p(r);this.id="textComplete"+k++;this.strategies=[];if(q){this.initialize();this.$el.focus()}else{this.$el.one("focus.textComplete",c.proxy(this.initialize,this))}}c.extend(j.prototype,{initialize:function(){var r,q;r=o.clone();this.listView=new e(r,this);this.$el.before(r).on({"keyup.textComplete":c.proxy(this.onKeyup,this),"keydown.textComplete":c.proxy(this.listView.onKeydown,this.listView)});q={};q["click."+this.id]=c.proxy(this.onClickDocument,this);q["keyup."+this.id]=c.proxy(this.onKeyupDocument,this);c(document).on(q)},register:function(q){this.strategies=this.strategies.concat(q)},renderList:function(q){if(this.clearAtNext){this.listView.clear();this.clearAtNext=false}if(q.length){this.listView.strategy=this.strategy;if(!this.listView.shown){this.listView.setPosition(this.getCaretPosition()).clear().activate()}q=q.slice(0,this.strategy.maxCount);this.listView.render(q)}if(this.strategy.header){this.listView.$el.prepend('<li class="textcomplete-header">'+this.strategies[0].header+"</li>")}if(this.strategy.footer){this.listView.$el.append('<li class="textcomplete-footer">'+this.strategies[0].footer+"</li>")}if(!this.listView.data.length&&this.listView.shown){this.listView.deactivate()}},searchCallbackFactory:function(r){var q=this;return function(t,s){q.renderList(t);if(!s){r();q.clearAtNext=true}}},onKeyup:function(s){var r,q;if(this.skipSearch(s)){return}r=this.extractSearchQuery(this.getTextFromHeadToCaret());if(r.length){q=r[1];if(this.term===q){return}this.term=q;this.search(r)}else{this.term=null;this.listView.deactivate()}},skipSearch:function(q){switch(q.keyCode){case 40:case 38:return true}if(q.ctrlKey){switch(q.keyCode){case 78:case 80:return true}}},onSelect:function(s){var t,r,q;t=this.getTextFromHeadToCaret();r=this.el.value.substring(this.el.selectionEnd);q=this.strategy.replace(s);if(c.isArray(q)){r=q[1]+r;q=q[0]}t=t.replace(this.strategy.match,q);this.$el.val(t+r).trigger("change").trigger("textComplete:select",s);this.el.focus();this.el.selectionStart=this.el.selectionEnd=t.length},onClickDocument:function(q){if(q.originalEvent&&!q.originalEvent.keepTextCompleteDropdown){this.listView.deactivate()}},onKeyupDocument:function(q){if(this.listView.shown&&q.keyCode===27){this.listView.deactivate();this.$el.focus()}},destroy:function(){var q;this.$el.off(".textComplete");c(document).off("."+this.id);if(this.listView){this.listView.destroy()}q=this.$el.parent();q.after(this.$el).remove();this.$el.data("textComplete",void 0);this.$el=null},getCaretPosition:function(){var v,u,s,r,q,t,w;t=this.$el.attr("dir")||this.$el.css("direction");v=["border-width","font-family","font-size","font-style","font-variant","font-weight","height","letter-spacing","word-spacing","line-height","text-decoration","text-align","width","padding-top","padding-right","padding-bottom","padding-left","margin-top","margin-right","margin-bottom","margin-left","border-style","box-sizing"];w=this.$el[0].scrollHeight>this.$el[0].offsetHeight;u=c.extend({position:"absolute",overflow:w?"scroll":"auto","white-space":"pre-wrap",top:0,left:-9999,direction:t},d(this.$el,v));s=c("<div></div>").css(u).text(this.getTextFromHeadToCaret());r=c("<span></span>").text(".").appendTo(s);this.$el.before(s);q=r.position();q.top+=r.height()-this.$el.scrollTop();if(t==="rtl"){q.left-=this.listView.$el.width()}s.remove();return q},getTextFromHeadToCaret:function(){var s,r,q;r=this.el.selectionEnd;if(typeof r==="number"){s=this.el.value.substring(0,r)}else{if(document.selection){q=this.el.createTextRange();q.moveStart("character",0);q.moveEnd("textedit");s=q.text}}return s},extractSearchQuery:function(u){var s,q,t,r;for(s=0,q=this.strategies.length;s<q;s++){t=this.strategies[s];r=u.match(t.match);if(r){return[t,r[t.index]]}}return[]},search:h(function(s,r){var q;this.strategy=r[0];q=r[1];this.strategy.search(q,this.searchCallbackFactory(s))})});var p=function(q){return q.wrap(l.clone().css("display",q.css("display")))};return j})();var e=(function(){function j(l,k){this.data=[];this.$el=l;this.index=0;this.completer=k;this.$el.on("click.textComplete","li.textcomplete-item",c.proxy(this.onClick,this))}c.extend(j.prototype,{shown:false,render:function(p){var o,n,k,m,q;o="";for(n=0,k=p.length;n<k;n++){q=p[n];if(a(this.data,q)){continue}m=this.data.length;this.data.push(q);o+='<li class="textcomplete-item" data-index="'+m+'"><a>';o+=this.strategy.template(q);o+="</a></li>";if(this.data.length===this.strategy.maxCount){break}}this.$el.append(o);if(!this.data.length){this.deactivate()}else{this.activateIndexedItem()}},clear:function(){this.data=[];this.$el.html("");this.index=0;return this},activateIndexedItem:function(){this.$el.find(".active").removeClass("active");this.getActiveItem().addClass("active")},getActiveItem:function(){return c(this.$el.children(".textcomplete-item").get(this.index))},activate:function(){if(!this.shown){this.$el.show();this.completer.$el.trigger("textComplete:show");this.shown=true}return this},deactivate:function(){if(this.shown){this.$el.hide();this.completer.$el.trigger("textComplete:hide");this.shown=false;this.data=[];this.index=null}return this},setPosition:function(k){var l;if(this.strategy.placement==="top"){l=parseInt(this.$el.css("font-size"));k={top:"auto",bottom:this.$el.parent().height()-k.top+l,left:k.left}}else{k.bottom="auto"}this.$el.css(k);return this},select:function(l){var k=this;this.completer.onSelect(this.data[l]);setTimeout(function(){k.deactivate()},0)},onKeydown:function(k){if(!this.shown){return}if(k.keyCode===38||(k.ctrlKey&&k.keyCode===80)){k.preventDefault();if(this.index===0){this.index=this.data.length-1}else{this.index-=1}this.activateIndexedItem()}else{if(k.keyCode===40||(k.ctrlKey&&k.keyCode===78)){k.preventDefault();if(this.index===this.data.length-1){this.index=0}else{this.index+=1}this.activateIndexedItem()}else{if(k.keyCode===13||k.keyCode===9){k.preventDefault();this.select(parseInt(this.getActiveItem().data("index"),10))}}}},onClick:function(l){var k=c(l.target);l.originalEvent.keepTextCompleteDropdown=true;if(!k.hasClass("textcomplete-item")){k=k.parents("li.textcomplete-item")}this.select(parseInt(k.data("index"),10))},destroy:function(){this.deactivate();this.$el.off("click.textComplete").remove();this.$el=null}});return j})();c.fn.textcomplete=function(m){var k,j,o,n;n="textComplete";if(m==="destroy"){return this.each(function(){var l=c(this).data(n);if(l){l.destroy()}})}for(k=0,j=m.length;k<j;k++){o=m[k];if(!o.template){o.template=f}if(o.index==null){o.index=2}if(o.cache){o.search=g(o.search)}o.maxCount||(o.maxCount=10)}return this.each(function(){var p,l;p=c(this);l=p.data(n);if(!l){l=new i(p);p.data(n,l)}l.register(m)})}})(window.jQuery||window.Zepto);