UNPKG

surt

Version:

Smart suggest widget

2 lines 12.3 kB
/*! surt 16-06-2016 */ !function(a,b){function c(a){var b=new RegExp(e,"g");return a.replace(b," ")}function d(a,b){var c=!0;if(a=a||[],b=b||[],!a.length||!b.length)return!(a.length||b.length);if(a.length==b.length){for(var d=0;d<a.length;d++)c=c&&a[d].text==b[d].text&&a[d].type==b[d].type;return c&&a.length==b.length}}var e=String.fromCharCode(160),f={input:".surt__input",suggest:".surt__suggests",suggestItemCls:"surt__suggests-item",aunt:99},g=function(a){function b(a,b){if(!a||1!=a.nodeType)throw new Error("Surt: html element "+b+" not found or it has wrong nodeType")}var c;a=a||{};for(var d in f)a[d]||(a[d]=f[d]);if(a.root=this[0],a.root=$(a.root)[0],b(a.root,"params.root"),a.input&&(a.input=$(a.input,a.root)[0]),a.input||(a.input=$('[contenteditable="true"]',a.root)),b(a.input,"params.input"),"true"==$(a.root).attr("data-surt-inited"))throw new Error("Surt: already initialized");return c=new g.fn.constructor(a)};g.fn={constructor:function(a){function c(){clearTimeout(g._upTimer),g._upTimer=setTimeout(function(){g._pressedKeys=0},300)}function d(c,d){var e=g.args(),f=g.params.selectionCls?e.suggest:b;e.kit=g.suggest[g._activeSuggest],g.set({kit:e.kit,suggest:f},!0),a.pick&&a.pick(e.kit,c,d),g.markSuggest(-1),g.scroll()}function e(a){return 8==a||32==a||46==a||a>47&&91>a||a>95&&112>a||a>159&&177>a||a>187&&193>a||a>218&&223>a||a>256}function f(a){return 37==a||39==a||16==a||17==a||18==a||91==a||35==a||36==a||13==a||8==a||46==a}var g=this,h=a.root;a=a||{},this.params=a,this.inputNode=$(a.input,h)[0],this.root=$(a.root,h)[0],this.suggestNode=$(a.suggest,h)[0],this.cloneNode=$(a.clone,h)[0],this.hintNode=$(a.hint,h)[0],this.delimiter=a.delimiter||"",this.placeholder=a.placeholder||"",this._submitEvents=a.events||["enter"],this._pressedKeys=0,this._time=(new Date).getTime(),this._events={},this.kit=[],this._activeSuggest=-1,$(this.root).attr("data-surt-inited",!0),this.updateHint(),$(this.inputNode).on("keyup.surt",function(b){var c,h=b.keyCode;if(27==h)return void b.stopPropagation();if(g._pressedKeys--,g._pressedKeys<0&&(g._pressedKeys=0),(40!=h&&38!=h||!$(g.root).hasClass(a.suggestCls))&&(229!=h||(h=g.text().charCodeAt(g.text().length-1),h==h))){if(g.suggest&&g.suggest[g._activeSuggest]&&!f(h)){var i=g.text(),j=i.charAt(i.length-1);" "==j&&(j=""),d(!1,b);var k=g.text()+g.delimiter+" "+j;g.text(k),g.restoreCursor(k.length)}g.updateInput(),g.updateHint(),c=g.args(),a.change&&e(h)&&a.change(b,c)}}).on("keydown.surt input.surt paste.surt",function(b){var f,h,i=b.keyCode;if("keydown"==b.type&&e(i)&&(g._pressedKeys++,c()),i&&!e(i)?g._pressedKeys=0:$(g.root).removeClass(g.params.placeholderCls),13==i){b.preventDefault();var j=!0;-1!=g._activeSuggest&&g.suggest[g._activeSuggest][0].incomplete_query&&(j=!1);var k=$(g.root).hasClass(a.suggestCls)&&$(g.root).find("."+a.suggestItemCurrentCls).length;return k&&d(j,b),j&&g.params.submit&&-1!=$.inArray("enter",g._submitEvents)&&g.params.submit(b,k),$(g.root).removeClass(a.suggestCls),$(g.root).removeClass(a.autocompleteCls),g.markSuggest(-1),!1}if(40==i)return f=0,g._activeSuggest>=0&&g.suggest&&(f=g._activeSuggest<g.suggest.length-1?g._activeSuggest+1:0),g.markSuggest(f),!1;if(38==i)return f=g.suggest&&g.suggest.length-1,g._activeSuggest>=0&&g.suggest&&(f=g._activeSuggest>0?g._activeSuggest-1:g.suggest.length-1),g.markSuggest(f),!1;if(39==i){var l=g.text().length;if(g.getCursor()>=l&&g.suggest){var m=$(g.root).hasClass(g.params.autocompleteCls)||-1!=g._activeSuggest,n=-1==g._activeSuggest?0:g._activeSuggest;m&&(h=g.args(),h.kit=g.suggest[n],g.set(h,!0),g.params.submit&&-1!=$.inArray("auto",g._submitEvents)&&g.params.submit(b,!0),g.suggest&&g.suggest.length&&g.params.complete&&g.params.complete())}}27==i&&($(g.root).removeClass(g.params.suggestCls),b.preventDefault())}).on("paste.surt",function(){setTimeout(function(){g.parse()},0)}).on("focus.surt click.surt",function(){var a=!$(g.root).hasClass(g.params.suggestCls);$(g.root).addClass(g.params.stateFocusCls),g.suggest&&g.suggest.length&&$(g.root).addClass(g.params.suggestCls),g.updateHint(),a&&g.params.show&&g.params.show(g._suggestExist)}).on("blur.surt",function(){$(g.root).removeClass(g.params.stateFocusCls),$(g.root).removeClass(g.params.readyCls),$(g.root).removeClass(g.params.autocompleteCls),$(g.root).removeClass(g.params.suggestCls)}),$(this.root).on("mousedown.surt","."+g.params.suggestItemCls,function(b){var c=$("."+a.suggestItemCls),e=c.index($(this));if(g.suggest&&g.suggest[e]){var f=-1!=$.inArray("click",g._submitEvents);g._activeSuggest=e,d(f,b),g.params.submit&&f?g.params.submit(b,!0):g.params.change&&g.params.change(b,g.args()),$(b.target).closest(g.params.suggestItemCls).length||$(g.root).removeClass(g.params.suggestCls).removeClass(g.params.autocompleteCls)}})},semanticChanged:function(a){return!d(a,this.kit)},get:function(){return this.kit},set:function(a,c){if(a=a||{},!(this._pressedKeys>0)){a.kit&&a.kit.length===b&&(a.kit=[a.kit]),this.saveCursor();var e=d(a.kit,this.kit);a.kit&&(this.kit=a.kit),(!e||c)&&this.updateKit(c),a.suggest&&(this.suggest=a.suggest,this.updateSuggest()),this.updateHint(),this.restoreCursor()}},setKit:function(a){this.kit=a,this.updateKit()},update:function(){this.updateKit(),this.updateSuggest(),this.updateHint()},updateInput:function(){var a=this.parse(),b=this.brick(a),c=this.getTail(b);(this.semanticChanged(b)||c)&&(this.setKit(b),c&&"text"!=this.params.inputMode&&($(this.inputNode).append(c.replace(" ","&nbsp;")),this.restoreCursor(999)))},updateKit:function(a){var b=[],c=this.params.tokenCls,d=this.params.textCls||c,e="",f="";if(this.kit){this.saveCursor();for(var g=0;g<this.kit.length;g++){var h=this.trim(this.kit[g].text);this.textMode()||("text"==this.kit[g].type&&d?(e='<div class="'+d+'">',f="</div>"):c&&(e='<div class="'+c+" _type_"+this.kit[g].type+'">',f="</div>"),h=e+h+f),b.push(h)}b=b.join(this.delimiter+" "),("text"!=this.params.inputMode||a)&&(this.html(b),this.restoreCursor())}},updateSuggest:function(){var a,b=[],c=this.params.tokenCls,d=this.params.textCls||c,e=!this._suggestExist;if(this._suggestExist=!(!this.suggest||!this.suggest.length),this.suggest){var f=!(e^this._suggestExist);f&&this.params.show&&this.params.show(this._suggestExist);for(var g=0;g<this.suggest.length;g++){for(var h=[],i=0;i<this.suggest[g].length;i++){var j=this.suggest[g][i].html||this.suggest[g][i].text;j=this.trim(j),this.params.selectionCls&&(j=this.parser.replace.call(this,j)),"text"!=this.suggest[g][i].type?(c&&(j='<div class="'+c+" _type_"+this.suggest[g][i].type+'">'+j+"</div>"),h.push(j)):(d&&(j='<div class="'+d+'">'+j+"</div>"),h.push(j))}a=h.length,h=h.join(this.delimiter+" ");var k="";this.params.suggestItemCountCls&&(k=" "+this.params.suggestItemCountCls+a),b.push('<li class="'+this.params.suggestItemCls+k+'">'+h+"</li>"),this._activeSuggest=-1}a=b.length,b=b.join(""),this.suggestNode&&(b?$(this.root).addClass(this.params.suggestCls):$(this.root).removeClass(this.params.suggestCls),this.suggestNode.innerHTML=b)}},updateHint:function(){this.updateAutocomplete(),this.text()||($(this.root).addClass(this.params.placeholderCls).removeClass(this.params.autocompleteCls),this.updatePlaceholder())},updateAutocomplete:function(){function a(){$(e.hintNode).html(""),$(e.cloneNode).html(""),$(e.root).removeClass(e.params.autocompleteCls)}var b=-1==this._activeSuggest?0:this._activeSuggest,c=this.suggest&&this.suggest.length&&this.suggest[b],d=this.text(),e=this;if(this.hintNode)if($(this.root).removeClass(this.params.placeholderCls),this.kit&&this.kit.length&&this.cloneNode)if(c&&c.length){var f,g,h=(this.kit[this.kit.length-1].text,0);if(f=[],this.suggest[0].length>h)for(var i=h;i<this.suggest[b].length;i++)f.push(this.suggest[b][i].text);f=f.join(this.delimiter+" "),f==d?$(this.root).addClass(this.params.readyCls):(g=0==f.toLowerCase().indexOf(d.toLowerCase()),$(this.root).removeClass(this.params.readyCls)),-1!=this._activeSuggest&&(this.hintNode.innerHTML=f.slice(d.length)),this.cloneNode.innerHTML=this.html(),$(this.root).hasClass(this.params.suggestCls)&&g&&f.length<this.params.aunt?$(this.root).addClass(this.params.autocompleteCls):a()}else a();else a()},updatePlaceholder:function(a){this.placeholder=a||this.placeholder,$(this.hintNode).html(this.placeholder)},query:function(a){var b="";a=a||this.kit;for(var d=0;d<a.length;d++)d>0&&(b+=" "),b+=a[d].text;return c(b)},text:function(a){return a?void this.html(a):c($(this.inputNode).text()||$(this.inputNode).val())},html:function(a){var b=$(this.inputNode);return a?("INPUT"==this.inputNode.tagName?b.val(a):b.html(a),void this.scroll()):b.html()||this.text()},scroll:function(){this.inputNode.scrollLeft=this.inputNode.scrollWidth},args:function(){var a={};return a.kit=this.kit,a.suggest=this.suggest||[],a.text=this.text(),a},parse:function(a){var b=a||this.text();return this.trailingSpace=" "===b[b.length-1],newKit=this.parser(this.kit,b),newKit},invalidate:function(a){var b=this.parse(a);this.kit=b},brick:function(a){var b=!0,c=this.text(),d=[];if(a)for(var e=0;e<a.length;e++){var f=this.suggest&&this.suggest[0]&&this.suggest[0][e];b=b&&f&&a[e].text.toLowerCase()==f.text.toLowerCase(),d.push(f)}return b&&c[c.length-1]==this.delimiter?d:a},markSuggest:function(a){var c=$("."+this.params.suggestItemCls,this.params.root),d=this.params.suggestItemCurrentCls;a===b&&(a=this._activeSuggest),c.removeClass(d),a>=0&&(c.eq(a).addClass(d),this._activeSuggest=a,this.updateHint()),$(this.root).addClass(this.params.placeholderCls),this._activeSuggest=a},getTail:function(a){var b,c=this.text(),d=[];if(a=a||this.kit)for(var e=0;e<a.length;e++)d.push(a[e].text);return d=d.join(this.delimiter+" "),0==c.indexOf(d)&&(b=c.substr(d.length,c.length)),b},minimize:function(){$(this.root).removeClass(this.params.suggestCls)},dispose:function(){$(this.root).attr("data-surt-inited","disposed"),$(this.root).off("surt"),clearTimeout(this._upTimer)},trim:function(a){return String.prototype.trim?a.trim():a.replace(/^\s+|\s+$/g,"")},textMode:function(){return"INPUT"==this.inputNode.tagName||"text"==this.params.inputMode}},g.fn.constructor.prototype=g.fn,$.fn.surt=g,g.version="0.3.0"}(this),function(a,b){function c(a){var b="";if(a)for(var c=0;c<a.length;c++)c>0&&(b+=" "),b+=a[c].text;return b}var d=function(a,d){function e(a){"text"==a.type&&f.length&&"text"==f[f.length-1].type?f[f.length-1].text+=" "+a.text:f.push(a),h=g(h.replace(a.text,""))}var f=[],g=this.trim,h=d;if(this.delimiter&&(h=h.replace(new RegExp(this.delimiter,"g")," ")),h=h.replace(new RegExp(" ","g")," "),c(a)===h)return a;if(a)for(var i=0;i<a.length;i++){var j=h.indexOf(a[i].text),k=h[j-1],l=h[j+a[i].text.length];if((" "!==l&&l!==b||" "!==k&&k!==b)&&(j=-1),0==j)e(a[i]);else if(j>0){var m=g(h.substring(0,j));e({text:m,type:"text"}),e(a[i])}}return h=g(h),h&&e({text:h,type:"text"}),f};d.replace=function(a){function b(a){return String(a).replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}var c=b(this.text());return c="((>[^<]*|^[^<>]*))("+c+")([w -]*)",a.replace(new RegExp(c,"i"),'$1<span class="'+this.params.selectionCls+'">$3</span>$4')},"undefined"!=typeof module?module.exports=d:$.fn.surt.fn.parser=d}(this),function(){function a(a,b){for(var c=0,d=0;d<a.childNodes.length;d++){var e=$(a.childNodes[d]).text().length;if(c+=e,c>=b)return{child:a.childNodes[d],n:b-(c-e)}}return 0>b&&(c=0),{child:a.childNodes[a.childNodes.length-1],n:c}}var b=$.fn.surt;b.fn.getCursor=function(){var a;if("INPUT"==this.inputNode.tagName)a=this.inputNode.selectionEnd;else{if(!window.getSelection)return;var b=window.getSelection();if(!b.anchorNode)return;var c=b.getRangeAt(0),d=c.startContainer,e=c.startOffset,f=d;for(a=e;f&&f!=this.inputNode;){for(var g,h=f.previousSibling;h;)g=$(h).text(),a+=g.length,h=h.previousSibling;f=f.parentNode}}return a},b.fn.saveCursor=function(){return this.cursorPos=this.getCursor(),this._lastPos=this.cursorPos==this.text().length,this.cursorPos},b.fn.restoreCursor=function(b){if(!this.textMode()&&window.getSelection){var c,d=b,e=document.createRange(),f=window.getSelection(),g=this.inputNode;if(c=this._lastPos?this.text().length:this.cursorPos,d=d||c,"INPUT"!=this.inputNode.tagName)for(;g&&1==g.nodeType;)obj=a(g,d),g=obj.child,d=obj.n;g&&3==g.nodeType&&(d=Math.min(d,$(g).text().length),d=Math.max(d,0),e.setStart(g,d),e.collapse(!0),f.removeAllRanges(),f.addRange(e))}}}();