(function(a){if(typeof exports=="object"&&typeof module=="object"){a(require("../../lib/codemirror"))}else{if(typeof define=="function"&&define.amd){define(["../../lib/codemirror"],a)}else{a(CodeMirror)}}})(function(e){var i="CodeMirror-hint";var h="CodeMirror-hint-active";e.showHint=function(q,r,s){if(!r){return q.showHint(s)}if(s&&s.async){r.async=true}var t={hint:r};if(s){for(var u in s){t[u]=s[u]}}return q.showHint(t)};e.defineExtension("showHint",function(r){r=o(this,this.getCursor("start"),r);var t=this.listSelections();if(t.length>1){return}if(this.somethingSelected()){if(!r.hint.supportsSelection){return}for(var s=0;s<t.length;s++){if(t[s].head.line!=t[s].anchor.line){return}}}if(this.state.completionActive){this.state.completionActive.close()}var q=this.state.completionActive=new b(this,r);if(!q.options.hint){return}e.signal(this,"startCompletion",this);q.update(true)});function b(q,s){this.cm=q;this.options=s;this.widget=null;this.debounce=0;this.tick=0;this.startPos=this.cm.getCursor("start");this.startLen=this.cm.getLine(this.startPos.line).length-this.cm.getSelection().length;var r=this;q.on("cursorActivity",this.activityFunc=function(){r.cursorActivity()})}var l=window.requestAnimationFrame||function(q){return setTimeout(q,1000/60)};var g=window.cancelAnimationFrame||clearTimeout;b.prototype={close:function(){if(!this.active()){return}this.cm.state.completionActive=null;this.tick=null;this.cm.off("cursorActivity",this.activityFunc);if(this.widget&&this.data){e.signal(this.data,"close")}if(this.widget){this.widget.close()}e.signal(this.cm,"endCompletion",this.cm)},active:function(){return this.cm.state.completionActive==this},pick:function(s,r){var q=s.list[r];if(q.hint){q.hint(this.cm,s,q)}else{this.cm.replaceRange(p(q),q.from||s.from,q.to||s.to,"complete")}e.signal(s,"pick",q);this.close()},cursorActivity:function(){if(this.debounce){g(this.debounce);this.debounce=0}var s=this.cm.getCursor(),q=this.cm.getLine(s.line);if(s.line!=this.startPos.line||q.length-s.ch!=this.startLen-this.startPos.ch||s.ch<this.startPos.ch||this.cm.somethingSelected()||(s.ch&&this.options.closeCharacters.test(q.charAt(s.ch-1)))){this.close()}else{var r=this;this.debounce=l(function(){r.update()});if(this.widget){this.widget.disable()}}},update:function(s){if(this.tick==null){return}var q=this,r=++this.tick;f(this.options.hint,this.cm,this.options,function(t){if(q.tick==r){q.finishUpdate(t,s)}})},finishUpdate:function(r,s){if(this.data){e.signal(this.data,"update")}var q=(this.widget&&this.widget.picked)||(s&&this.options.completeSingle);if(this.widget){this.widget.close()}if(r&&this.data&&j(this.data,r)){return}this.data=r;if(r&&r.list.length){if(q&&r.list.length==1){this.pick(r,0)}else{this.widget=new n(this,r);e.signal(r,"shown")}}}};function j(r,q){var s=e.cmpPos(q.from,r.from);return s>0&&r.to.ch-r.from.ch!=q.to.ch-q.from.ch}function o(q,v,s){var t=q.options.hintOptions;var r={};for(var u in c){r[u]=c[u]}if(t){for(var u in t){if(t[u]!==undefined){r[u]=t[u]}}}if(s){for(var u in s){if(s[u]!==undefined){r[u]=s[u]}}}if(r.hint.resolve){r.hint=r.hint.resolve(q,v)}return r}function p(q){if(typeof q=="string"){return q}else{return q.text}}function d(u,x){var r={Up:function(){x.moveFocus(-1)},Down:function(){x.moveFocus(1)},PageUp:function(){x.moveFocus(-x.menuSize()+1,true)},PageDown:function(){x.moveFocus(x.menuSize()-1,true)},Home:function(){x.setFocus(0)},End:function(){x.setFocus(x.length-1)},Enter:x.pick,Tab:x.pick,Esc:x.close};var w=u.options.customKeys;var t=w?{}:r;function s(y,A){var z;if(typeof A!="string"){z=function(B){return A(B,x)}}else{if(r.hasOwnProperty(A)){z=r[A]}else{z=A}}t[y]=z}if(w){for(var v in w){if(w.hasOwnProperty(v)){s(v,w[v])}}}var q=u.options.extraKeys;if(q){for(var v in q){if(q.hasOwnProperty(v)){s(v,q[v])}}}return t}function m(r,q){while(q&&q!=r){if(q.nodeName.toUpperCase()==="LI"&&q.parentNode==r){return q}q=q.parentNode}}function n(E,P){this.completion=E;this.data=P;this.picked=false;var v=this,A=E.cm;var M=this.hints=document.createElement("ul");M.className="CodeMirror-hints";this.selectedHint=P.selectedHint||0;var z=P.list;for(var O=0;O<z.length;++O){var u=M.appendChild(document.createElement("li")),t=z[O];var s=i+(O!=this.selectedHint?"":" "+h);if(t.className!=null){s=t.className+" "+s}u.className=s;if(t.render){t.render(u,P,t)}else{u.appendChild(document.createTextNode(t.displayText||p(t)))}u.hintId=O}var y=A.cursorCoords(E.options.alignWithWord?P.from:null);var w=y.left,I=y.bottom,G=true;M.style.left=w+"px";M.style.top=I+"px";var B=window.innerWidth||Math.max(document.body.offsetWidth,document.documentElement.offsetWidth);var N=window.innerHeight||Math.max(document.body.offsetHeight,document.documentElement.offsetHeight);(E.options.container||document.body).appendChild(M);var C=M.getBoundingClientRect(),D=C.bottom-N;var r=M.scrollHeight>M.clientHeight+1;var H=A.getScrollInfo();if(D>0){var J=C.bottom-C.top,q=y.top-(y.bottom-C.top);if(q-J>0){M.style.top=(I=y.top-J)+"px";G=false}else{if(J>N){M.style.height=(N-5)+"px";M.style.top=(I=y.bottom-C.top)+"px";var x=A.getCursor();if(P.from.ch!=x.ch){y=A.cursorCoords(x);M.style.left=(w=y.left)+"px";C=M.getBoundingClientRect()}}}}var F=C.right-B;if(F>0){if(C.right-C.left>B){M.style.width=(B-5)+"px";F-=(C.right-C.left)-B}M.style.left=(w=y.left-F)+"px"}if(r){for(var L=M.firstChild;L;L=L.nextSibling){L.style.paddingRight=A.display.nativeBarWidth+"px"}}A.addKeyMap(this.keyMap=d(E,{moveFocus:function(R,Q){v.changeActive(v.selectedHint+R,Q)},setFocus:function(Q){v.changeActive(Q)},menuSize:function(){return v.screenAmount()},length:z.length,close:function(){E.close()},pick:function(){v.pick()},data:P}));if(E.options.closeOnUnfocus){var K;A.on("blur",this.onBlur=function(){K=setTimeout(function(){E.close()},100)});A.on("focus",this.onFocus=function(){clearTimeout(K)})}A.on("scroll",this.onScroll=function(){var T=A.getScrollInfo(),S=A.getWrapperElement().getBoundingClientRect();var R=I+H.top-T.top;var Q=R-(window.pageYOffset||(document.documentElement||document.body).scrollTop);if(!G){Q+=M.offsetHeight}if(Q<=S.top||Q>=S.bottom){return E.close()}M.style.top=R+"px";M.style.left=(w+H.left-T.left)+"px"});e.on(M,"dblclick",function(R){var Q=m(M,R.target||R.srcElement);if(Q&&Q.hintId!=null){v.changeActive(Q.hintId);v.pick()}});e.on(M,"click",function(R){var Q=m(M,R.target||R.srcElement);if(Q&&Q.hintId!=null){v.changeActive(Q.hintId);if(E.options.completeOnSingleClick){v.pick()}}});e.on(M,"mousedown",function(){setTimeout(function(){A.focus()},20)});e.signal(P,"select",z[0],M.firstChild);return true}n.prototype={close:function(){if(this.completion.widget!=this){return}this.completion.widget=null;this.hints.parentNode.removeChild(this.hints);this.completion.cm.removeKeyMap(this.keyMap);var q=this.completion.cm;if(this.completion.options.closeOnUnfocus){q.off("blur",this.onBlur);q.off("focus",this.onFocus)}q.off("scroll",this.onScroll)},disable:function(){this.completion.cm.removeKeyMap(this.keyMap);var q=this;this.keyMap={Enter:function(){q.picked=true}};this.completion.cm.addKeyMap(this.keyMap)},pick:function(){this.completion.pick(this.data,this.selectedHint)},changeActive:function(q,s){if(q>=this.data.list.length){q=s?this.data.list.length-1:0}else{if(q<0){q=s?0:this.data.list.length-1}}if(this.selectedHint==q){return}var r=this.hints.childNodes[this.selectedHint];r.className=r.className.replace(" "+h,"");r=this.hints.childNodes[this.selectedHint=q];r.className+=" "+h;if(r.offsetTop<this.hints.scrollTop){this.hints.scrollTop=r.offsetTop-3}else{if(r.offsetTop+r.offsetHeight>this.hints.scrollTop+this.hints.clientHeight){this.hints.scrollTop=r.offsetTop+r.offsetHeight-this.hints.clientHeight+3}}e.signal(this.data,"select",this.data.list[this.selectedHint],r)},screenAmount:function(){return Math.floor(this.hints.clientHeight/this.hints.firstChild.offsetHeight)||1}};function k(r,t){if(!r.somethingSelected()){return t}var q=[];for(var s=0;s<t.length;s++){if(t[s].supportsSelection){q.push(t[s])}}return q}function f(t,r,s,u){if(t.async){t(r,u,s)}else{var q=t(r,s);if(q&&q.then){q.then(u)}else{u(q)}}}function a(q,u){var s=q.getHelpers(u,"hint"),t;if(s.length){var r=function(v,z,w){var y=k(v,s);function x(A){if(A==y.length){return z(null)}f(y[A],v,w,function(B){if(B&&B.list.length>0){z(B)}else{x(A+1)}})}x(0)};r.async=true;r.supportsSelection=true;return r}else{if(t=q.getHelper(q.getCursor(),"hintWords")){return function(v){return e.hint.fromList(v,{words:t})}}else{if(e.hint.anyword){return function(v,w){return e.hint.anyword(v,w)}}else{return function(){}}}}}e.registerHelper("hint","auto",{resolve:a});e.registerHelper("hint","fromList",function(w,z){var x=w.getCursor(),r=w.getTokenAt(x);var u=e.Pos(x.line,r.end);if(r.string&&/\w/.test(r.string[r.string.length-1])){var s=r.string,v=e.Pos(x.line,r.start)}else{var s="",v=u}var y=[];for(var t=0;t<z.words.length;t++){var q=z.words[t];if(q.slice(0,s.length)==s){y.push(q)}}if(y.length){return{list:y,from:v,to:u}}});e.commands.autocomplete=e.showHint;var c={hint:e.hint.auto,completeSingle:true,alignWithWord:true,closeCharacters:/[\s()\[\]{};:>,]/,closeOnUnfocus:true,completeOnSingleClick:true,container:null,customKeys:null,extraKeys:null};e.defineOption("hintOptions",null)});