!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}((function(e){"use strict";e.TernServer=function(s){var l=this;this.options=s||{};var u=this.options.plugins||(this.options.plugins={});u.doc_comment||(u.doc_comment=!0),this.docs=Object.create(null),this.options.useWorker?this.server=new k(this):this.server=new tern.Server({getFile:function(e,t){return i(l,e,t)},async:!0,defs:this.options.defs||[],plugins:u}),this.trackChange=function(e,t){!function(e,t,n){var i=r(e,t),s=e.cachedArgHints;s&&s.doc==t&&g(s.start,n.to)>=0&&(e.cachedArgHints=null);var c=i.changed;null==c&&(i.changed=c={from:n.from.line,to:n.from.line});var l=n.from.line+(n.text.length-1);n.from.line<c.to&&(c.to=c.to-(n.to.line-l));l>=c.to&&(c.to=l+1);c.from>n.from.line&&(c.from=n.from.line);t.lineCount()>o&&n.to-c.from>100&&setTimeout((function(){i.changed&&i.changed.to-i.changed.from>100&&a(e,i)}),200)}(l,e,t)},this.cachedArgHints=null,this.activeArgHints=null,this.jumpStack=[],this.getHint=function(o,i){return function(o,i,r){o.request(i,{type:"completions",types:!0,docs:!0,urls:!0},(function(s,a){if(s)return b(o,i,s);var l=[],u="",f=a.start,d=a.end;'["'==i.getRange(t(f.line,f.ch-2),f)&&'"]'!=i.getRange(d,t(d.line,d.ch+2))&&(u='"]');for(var p=0;p<a.completions.length;++p){var h=a.completions[p],g=c(h.type);a.guess&&(g+=" "+n+"guess"),l.push({text:h.name+u,displayText:h.displayName||h.name,className:g,data:h})}var m={from:f,to:d,list:l},v=null;e.on(m,"close",(function(){w(v)})),e.on(m,"update",(function(){w(v)})),e.on(m,"select",(function(e,t){w(v);var r=o.options.completionTip?o.options.completionTip(e.data):e.data.doc;r&&(v=x(t.parentNode.getBoundingClientRect().right+window.pageXOffset,t.getBoundingClientRect().top+window.pageYOffset,r,i,n+"hint-doc"))})),r(m)}))}(l,o,i)},this.getHint.async=!0},e.TernServer.prototype={addDoc:function(t,n){var o={doc:n,name:t,changed:null};return this.server.addFile(t,D(this,o)),e.on(n,"change",this.trackChange),this.docs[t]=o},delDoc:function(t){var n=s(this,t);n&&(e.off(n.doc,"change",this.trackChange),delete this.docs[n.name],this.server.delFile(n.name))},hideDoc:function(e){T(this);var t=s(this,e);t&&t.changed&&a(this,t)},complete:function(e){e.showHint({hint:this.getHint})},showType:function(e,t,n){l(this,e,t,"type",n)},showDocs:function(e,t,n){l(this,e,t,"documentation",n)},updateArgHints:function(n){!function(n,o){if(T(n),o.somethingSelected())return;var i=o.getTokenAt(o.getCursor()).state,r=e.innerMode(o.getMode(),i);if("javascript"!=r.mode.name)return;var s=r.state.lexical;if("call"!=s.info)return;for(var a,c=s.pos||0,l=o.getOption("tabSize"),d=o.getCursor().line,p=Math.max(0,d-9),h=!1;d>=p;--d){for(var m=o.getLine(d),v=0,y=0;;){var C=m.indexOf("\t",y);if(-1==C)break;v+=l-(C+v)%l-1,y=C+1}if(a=s.column-v,"("==m.charAt(a)){h=!0;break}}if(!h)return;var x=t(d,a),w=n.cachedArgHints;if(w&&w.doc==o.getDoc()&&0==g(x,w.start))return u(n,o,c);n.request(o,{type:"type",preferFunction:!0,end:x},(function(e,t){!e&&t.type&&/^fn\(/.test(t.type)&&(n.cachedArgHints={start:x,type:f(t.type),name:t.exprName||t.name||"fn",guess:t.guess,doc:o.getDoc()},u(n,o,c))}))}(this,n)},jumpToDef:function(e){!function(e,n){function o(o){var i={type:"definition",variable:o||null},s=r(e,n.getDoc());e.server.request(h(e,s,i),(function(o,i){if(o)return b(e,n,o);if(i.file||!i.url){if(i.file){var r,a=e.docs[i.file];if(a&&(r=function(e,n){for(var o=n.context.slice(0,n.contextOffset).split("\n"),i=n.start.line-(o.length-1),r=t(i,(1==o.length?n.start.ch:e.getLine(i).length)-o[0].length),s=e.getLine(i).slice(r.ch),a=i+1;a<e.lineCount()&&s.length<n.context.length;++a)s+="\n"+e.getLine(a);if(s.slice(0,n.context.length)==n.context)return n;var c,l=e.getSearchCursor(n.context,0,!1),u=1/0;for(;l.findNext();){var f=l.from(),d=1e4*Math.abs(f.line-r.line);d||(d=Math.abs(f.ch-r.ch)),d<u&&(c=f,u=d)}if(!c)return null;1==o.length?c.ch+=o[0].length:c=t(c.line+(o.length-1),o[o.length-1].length);if(n.start.line==n.end.line)var p=t(c.line,c.ch+(n.end.ch-n.start.ch));else p=t(c.line+(n.end.line-n.start.line),n.end.ch);return{start:c,end:p}}(a.doc,i)))return e.jumpStack.push({file:s.name,start:n.getCursor("from"),end:n.getCursor("to")}),void d(e,s,a,r.start,r.end)}b(e,n,"Could not find a definition.")}else window.open(i.url)}))}!function(e){var t=e.getCursor("end"),n=e.getTokenAt(t);return!(n.start<t.ch&&"comment"==n.type)&&/[\w)\]]/.test(e.getLine(t.line).slice(Math.max(t.ch-1,0),t.ch+1))}(n)?v(n,"Jump to variable",(function(e){e&&o(e)})):o()}(this,e)},jumpBack:function(e){!function(e,t){var n=e.jumpStack.pop(),o=n&&e.docs[n.file];if(!o)return;d(e,r(e,t.getDoc()),o,n.start,n.end)}(this,e)},rename:function(e){!function(e,t){var n=t.getTokenAt(t.getCursor());if(!/\w/.test(n.string))return b(e,t,"Not at a variable");v(t,"New name for "+n.string,(function(n){e.request(t,{type:"rename",newName:n,fullDocs:!0},(function(n,o){if(n)return b(e,t,n);!function(e,t){for(var n=Object.create(null),o=0;o<t.length;++o){(n[(c=t[o]).file]||(n[c.file]=[])).push(c)}for(var i in n){var r=e.docs[i],s=n[i];if(r){s.sort((function(e,t){return g(t.start,e.start)}));var a="*rename"+ ++p;for(o=0;o<s.length;++o){var c=s[o];r.doc.replaceRange(c.text,c.start,c.end,a)}}}}(e,o.changes)}))}))}(this,e)},selectName:function(e){!function(e,t){var n=r(e,t.doc).name;e.request(t,{type:"refs"},(function(o,i){if(o)return b(e,t,o);for(var r=[],s=0,a=t.getCursor(),c=0;c<i.refs.length;c++){var l=i.refs[c];l.file==n&&(r.push({anchor:l.start,head:l.end}),g(a,l.start)>=0&&g(a,l.end)<=0&&(s=r.length-1))}t.setSelections(r,s)}))}(this,e)},request:function(e,t,n,o){var i=this,s=r(this,e.getDoc()),a=h(this,s,t,o),c=a.query&&this.options.queryOptions&&this.options.queryOptions[a.query.type];if(c)for(var l in c)a.query[l]=c[l];this.server.request(a,(function(e,o){!e&&i.options.responseFilter&&(o=i.options.responseFilter(s,t,a,e,o)),n(e,o)}))},destroy:function(){T(this),this.worker&&(this.worker.terminate(),this.worker=null)}};var t=e.Pos,n="CodeMirror-Tern-",o=250;function i(e,t,n){var o=e.docs[t];o?n(D(e,o)):e.options.getFile?e.options.getFile(t,n):n(null)}function r(e,t,n){for(var o in e.docs){var i=e.docs[o];if(i.doc==t)return i}if(!n)for(var r=0;;++r)if(o="[doc"+(r||"")+"]",!e.docs[o]){n=o;break}return e.addDoc(n,t)}function s(t,n){return"string"==typeof n?t.docs[n]:(n instanceof e&&(n=n.getDoc()),n instanceof e.Doc?r(t,n):void 0)}function a(e,t){e.server.request({files:[{type:"full",name:t.name,text:D(e,t)}]},(function(e){e?window.console.error(e):t.changed=null}))}function c(e){var t;return t="?"==e?"unknown":"number"==e||"string"==e||"bool"==e?e:/^fn\(/.test(e)?"fn":/^\[/.test(e)?"array":"object",n+"completion "+n+"completion-"+t}function l(e,t,n,o,i){e.request(t,o,(function(n,o){if(n)return b(e,t,n);if(e.options.typeTip)var r=e.options.typeTip(o);else{r=m("span",null,m("strong",null,o.type||"not found"));if(o.doc&&r.appendChild(document.createTextNode(" — "+o.doc)),o.url){r.appendChild(document.createTextNode(" "));var s=r.appendChild(m("a",null,"[docs]"));s.href=o.url,s.target="_blank"}}y(t,r,e),i&&i()}),n)}function u(e,t,o){T(e);for(var i=e.cachedArgHints,r=i.type,s=m("span",i.guess?n+"fhint-guess":null,m("span",n+"fname",i.name),"("),a=0;a<r.args.length;++a){a&&s.appendChild(document.createTextNode(", "));var c=r.args[a];s.appendChild(m("span",n+"farg"+(a==o?" "+n+"farg-current":""),c.name||"?")),"?"!=c.type&&(s.appendChild(document.createTextNode(": ")),s.appendChild(m("span",n+"type",c.type)))}s.appendChild(document.createTextNode(r.rettype?") -> ":")")),r.rettype&&s.appendChild(m("span",n+"type",r.rettype));var l=t.cursorCoords(null,"page"),u=e.activeArgHints=x(l.right+1,l.bottom,s,t);setTimeout((function(){u.clear=C(t,(function(){e.activeArgHints==u&&T(e)}))}),20)}function f(e){var t=[],n=3;function o(t){for(var o=0,i=n;;){var r=e.charAt(n);if(t.test(r)&&!o)return e.slice(i,n);/[{\[\(]/.test(r)?++o:/[}\]\)]/.test(r)&&--o,++n}}if(")"!=e.charAt(n))for(;;){var i=e.slice(n).match(/^([^, \(\[\{]+): /);if(i&&(n+=i[0].length,i=i[1]),t.push({name:i,type:o(/[\),]/)}),")"==e.charAt(n))break;n+=2}var r=e.slice(n).match(/^\) -> (.*)$/);return{args:t,rettype:r&&r[1]}}function d(e,t,n,o,i){n.doc.setSelection(o,i),t!=n&&e.options.switchToDoc&&(T(e),e.options.switchToDoc(n.name,n.doc))}var p=0;function h(n,i,r,s){var a=[],c=0,l=!r.fullDocs;l||delete r.fullDocs,"string"==typeof r&&(r={type:r}),r.lineCharPositions=!0,null==r.end&&(r.end=s||i.doc.getCursor("end"),i.doc.somethingSelected()&&(r.start=i.doc.getCursor("start")));var u=r.start||r.end;if(i.changed)if(i.doc.lineCount()>o&&!1!==l&&i.changed.to-i.changed.from<100&&i.changed.from<=u.line&&i.changed.to>r.end.line){a.push(function(n,o,i){for(var r,s=n.doc,a=null,c=null,l=4,u=o.line-1,f=Math.max(0,u-50);u>=f;--u){var d=s.getLine(u);if(!(d.search(/\bfunction\b/)<0)){var p=e.countColumn(d,null,l);null!=a&&a<=p||(a=p,c=u)}}null==c&&(c=f);var h=Math.min(s.lastLine(),i.line+20);if(null==a||a==e.countColumn(s.getLine(o.line),null,l))r=h;else for(r=i.line+1;r<h;++r){if((p=e.countColumn(s.getLine(r),null,l))<=a)break}var g=t(c,0);return{type:"part",name:n.name,offsetLines:g.line,text:s.getRange(g,t(r,i.line==r?null:0))}}(i,u,r.end)),r.file="#0";c=a[0].offsetLines;null!=r.start&&(r.start=t(r.start.line- -c,r.start.ch)),r.end=t(r.end.line-c,r.end.ch)}else a.push({type:"full",name:i.name,text:D(n,i)}),r.file=i.name,i.changed=null;else r.file=i.name;for(var f in n.docs){var d=n.docs[f];d.changed&&d!=i&&(a.push({type:"full",name:d.name,text:D(n,d)}),d.changed=null)}return{query:r,files:a}}var g=e.cmpPos;function m(e,t){var n=document.createElement(e);t&&(n.className=t);for(var o=2;o<arguments.length;++o){var i=arguments[o];"string"==typeof i&&(i=document.createTextNode(i)),n.appendChild(i)}return n}function v(e,t,n){if(e.openDialog){var o=document.createDocumentFragment();o.appendChild(document.createTextNode(t+": "));var i=document.createElement("input");i.type="text",o.appendChild(i),e.openDialog(o,n)}else n(prompt(t,""))}function y(t,n,o){t.state.ternTooltip&&w(t.state.ternTooltip);var i=t.cursorCoords(),r=t.state.ternTooltip=x(i.right+1,i.bottom,n,t);function s(){var e;t.state.ternTooltip=null,r.parentNode&&((e=r).style.opacity="0",setTimeout((function(){w(e)}),1100)),l()}var a=!1,c=!1;e.on(r,"mousemove",(function(){a=!0})),e.on(r,"mouseout",(function(t){var n=t.relatedTarget||t.toElement;n&&e.contains(r,n)||(c?s():a=!1)})),setTimeout((function(){c=!0,a||s()}),o.options.hintDelay?o.options.hintDelay:1700);var l=C(t,s)}function C(e,t){return e.on("cursorActivity",t),e.on("blur",t),e.on("scroll",t),e.on("setDoc",t),function(){e.off("cursorActivity",t),e.off("blur",t),e.off("scroll",t),e.off("setDoc",t)}}function x(e,t,o,i,r){var s=m("div",n+"tooltip "+(r||""),o);s.style.left=e+"px",s.style.top=t+"px",(((i.options||{}).hintOptions||{}).container||document.body).appendChild(s);var a=i.cursorCoords(),c=window.innerWidth,l=window.innerHeight,u=s.getBoundingClientRect(),f=document.querySelector(".CodeMirror-hints"),d=u.bottom-l,p=u.right-c;if(f&&p>0){s.style.left=0;u=s.getBoundingClientRect();s.style.left=(e=e-f.offsetWidth-u.width)+"px",p=u.right-c}if(d>0){var h=u.bottom-u.top;a.top-(a.bottom-u.top)-h>0?s.style.top=a.top-h+"px":h>l&&(s.style.height=l-5+"px",s.style.top=a.bottom-u.top+"px")}return p>0&&(u.right-u.left>c&&(s.style.width=c-5+"px",p-=u.right-u.left-c),s.style.left=e-p+"px"),s}function w(e){var t=e&&e.parentNode;t&&t.removeChild(e)}function b(e,t,n){e.options.showError?e.options.showError(t,n):y(t,String(n),e)}function T(e){e.activeArgHints&&(e.activeArgHints.clear&&e.activeArgHints.clear(),w(e.activeArgHints),e.activeArgHints=null)}function D(e,t){var n=t.doc.getValue();return e.options.fileFilter&&(n=e.options.fileFilter(n,t.name,t.doc)),n}function k(e){var t=e.worker=new Worker(e.options.workerScript);t.postMessage({type:"init",defs:e.options.defs,plugins:e.options.plugins,scripts:e.options.workerDeps});var n=0,o={};function r(e,i){i&&(e.id=++n,o[n]=i),t.postMessage(e)}t.onmessage=function(t){var n=t.data;"getFile"==n.type?i(e,n.name,(function(e,t){r({type:"getFile",err:String(e),text:t,id:n.id})})):"debug"==n.type?window.console.log(n.message):n.id&&o[n.id]&&(o[n.id](n.err,n.body),delete o[n.id])},t.onerror=function(e){for(var t in o)o[t](e);o={}},this.addFile=function(e,t){r({type:"add",name:e,text:t})},this.delFile=function(e){r({type:"del",name:e})},this.request=function(e,t){r({type:"req",body:e},t)}}}));