-
Notifications
You must be signed in to change notification settings - Fork 64
/
typeahead.min.js
1 lines (1 loc) · 12.6 KB
/
typeahead.min.js
1
JX.install('Typeahead',{construct:function(b,a){this._hardpoint=b;this._control=a||JX.DOM.find(b,'input');this._root=JX.$N('div',{className:'jx-typeahead-results'});this._display=[];this._listener=JX.DOM.listen(this._control,['focus','blur','keypress','keydown','input'],null,JX.bind(this,this.handleEvent));JX.DOM.listen(this._root,['mouseover','mouseout'],null,JX.bind(this,this._onmouse));JX.DOM.listen(this._root,'mousedown','tag:a',JX.bind(this,function(c){if(!c.isRightButton())this._choose(c.getNode('tag:a'));}));},events:['choose','query','start','change','show'],properties:{allowNullSelection:true},members:{_root:null,_control:null,_hardpoint:null,_listener:null,_value:null,_stop:false,_focus:-1,_focused:false,_placeholderVisible:false,_placeholder:null,_display:null,_datasource:null,_waitingListener:null,_readyListener:null,start:function(){this.invoke('start');this.updatePlaceholder();},setDatasource:function(a){if(this._datasource){this._datasource.unbindFromTypeahead();this._waitingListener.remove();this._readyListener.remove();}this._waitingListener=a.listen('waiting',JX.bind(this,this.waitForResults));this._readyListener=a.listen('resultsready',JX.bind(this,this.showResults));a.bindToTypeahead(this);this._datasource=a;},getDatasource:function(){return this._datasource;},setInputNode:function(a){this._control=a;return this;},hide:function(){this._changeFocus(Number.NEGATIVE_INFINITY);this._display=[];this._moused=false;JX.DOM.hide(this._root);},showResults:function(d){var c={show:d};var b=this.invoke('show',c);this._display=c.show;if(this._display.length&&!b.getPrevented()){JX.DOM.setContent(this._root,this._display);this._changeFocus(Number.NEGATIVE_INFINITY);var a=JX.Vector.getDim(this._hardpoint);a.x=0;a.setPos(this._root);if(this._root.parentNode!==this._hardpoint)this._hardpoint.appendChild(this._root);JX.DOM.show(this._root);}else this.hide();},refresh:function(){if(this._stop)return;this._value=this._control.value;this.invoke('change',this._value);},waitForResults:function(){this.hide();},_onmouse:function(event){this._moused=(event.getType()=='mouseover');this._drawFocus();},_changeFocus:function(a){var b=Math.min(Math.max(-1,this._focus+a),this._display.length-1);if(!this.getAllowNullSelection())b=Math.max(0,b);if(this._focus>=0&&this._focus<this._display.length)JX.DOM.alterClass(this._display[this._focus],'focused',false);this._focus=b;this._drawFocus();return true;},_drawFocus:function(){var a=this._display[this._focus];if(a)JX.DOM.alterClass(a,'focused',!this._moused);},_choose:function(b){var a=this.invoke('choose',b);if(a.getPrevented())return;this._control.value=b.name;this.hide();},clear:function(){this._control.value='';this._value='';this.hide();},disable:function(){this._control.blur();this._control.disabled=true;this._stop=true;},submit:function(){if(this._focus>=0&&this._display[this._focus]){this._choose(this._display[this._focus]);return true;}else{result=this.invoke('query',this._control.value);if(result.getPrevented())return true;}return false;},setValue:function(a){this._control.value=a;},getValue:function(){return this._control.value;},_update:function(event){if(event.getType()=='focus'){this._focused=true;this.updatePlaceholder();}var a=event.getSpecialKey();if(a&&event.getType()=='keydown')switch(a){case 'up':if(this._display.length&&this._changeFocus(-1))event.prevent();break;case 'down':if(this._display.length&&this._changeFocus(1))event.prevent();break;case 'return':if(this.submit()){event.prevent();return;}break;case 'esc':if(this._display.length&&this.getAllowNullSelection()){this.hide();event.prevent();}break;case 'tab':return;}setTimeout(JX.bind(this,function(){if(this._value==this._control.value)return;this.refresh();}),0);},handleEvent:function(a){if(this._stop||a.getPrevented())return;var b=a.getType();if(b=='blur'){this._focused=false;this.updatePlaceholder();this.hide();}else this._update(a);},removeListener:function(){if(this._listener)this._listener.remove();},setPlaceholder:function(a){this._placeholder=a;this.updatePlaceholder();return this;},updatePlaceholder:function(){if(this._placeholderVisible){if(this._focused||!this._placeholder){this._placeholderVisible=false;this._control.value='';}}else if(!this._focused)if(this._placeholder&&!this._control.value)this._placeholderVisible=true;if(this._placeholderVisible)this._control.value=this._placeholder;JX.DOM.alterClass(this._control,'jx-typeahead-placeholder',this._placeholderVisible);}}});JX.install('TypeaheadNormalizer',{statics:{normalize:function(a){return (''+a).toLocaleLowerCase().replace(/[\.,-\/#!$%\^&\*;:{}=\-_`~()]/g,'').replace(/ +/g,' ').replace(/^\s*|\s*$/g,'');}}});JX.install('TypeaheadSource',{construct:function(){this._raw={};this._lookup={};this.setNormalizer(JX.TypeaheadNormalizer.normalize);this._excludeIDs={};},events:['waiting','resultsready','complete'],properties:{normalizer:null,queryExtractor:null,transformer:null,maximumResultCount:5,sortHandler:null},members:{_raw:null,_lookup:null,_excludeIDs:null,_changeListener:null,_startListener:null,bindToTypeahead:function(a){this._changeListener=a.listen('change',JX.bind(this,this.didChange));this._startListener=a.listen('start',JX.bind(this,this.didStart));},unbindFromTypeahead:function(){this._changeListener.remove();this._startListener.remove();},didChange:function(a){return;},didStart:function(){return;},clearCache:function(){this._raw={};this._lookup={};},addExcludeID:function(a){if(a)this._excludeIDs[a]=true;},removeExcludeID:function(a){if(a)delete this._excludeIDs[a];},addResult:function(b){b=(this.getTransformer()||this._defaultTransformer)(b);if(b.id in this._raw)return;this._raw[b.id]=b;var c=this.tokenize(b.tokenizable||b.name);for(var a=0;a<c.length;++a){this._lookup[c[a]]=this._lookup[c[a]]||[];this._lookup[c[a]].push(b.id);}},waitForResults:function(){this.invoke('waiting');return this;},getResult:function(a){return this._raw[a];},matchResults:function(p){var g={};var h={};var j={};var n={};var m=this.getQueryExtractor();if(m)p=m(p);var o=this.tokenize(p);o.sort(function(q,r){return r.length-q.length;});for(var c=0;c<o.length;++c){if(o[c] in n){o.splice(c--,1);continue;}n[o[c]]=true;var a=o[c];for(var k in this._lookup)if(k.substr(0,a.length)===a){if(!(k in j)){j[k]=true;}else continue;var f=this._lookup[k];for(var d=0;d<f.length;++d){var i=f[d];if(!h[i])h[i]={};if(!(a in h[i])){h[i][a]=true;g[i]=(g[i]||0)+1;}}}}var b=[];for(var e in g)if(g[e]==o.length&&!this._excludeIDs[e])b.push(e);this.sortHits(p,b);var l=this.renderNodes(p,b);this.invoke('resultsready',l);this.invoke('complete');},sortHits:function(f,c){var e=[];for(var d=0;d<c.length;d++)e.push(this._raw[c[d]]);var a=function(i,j){var g=i.sort||i.name;var h=j.sort||j.name;return g.localeCompare(h);};var b=this.getSortHandler()||function(i,h,g){h.sort(g);};b(f,e,a);c.splice(0,c.length);for(var d=0;d<e.length;d++)c.push(e[d].id);},renderNodes:function(e,a){var c=Math.min(this.getMaximumResultCount(),a.length);var d=[];for(var b=0;b<c;b++)d.push(this.createNode(this._raw[a[b]]));return d;},createNode:function(a){return JX.$N('a',{href:a.uri,name:a.name,rel:a.id,className:'jx-result'},a.display);},normalize:function(a){return this.getNormalizer()(a);},tokenize:function(a){a=this.normalize(a);if(!a.length)return [];return a.split(/\s/g);},_defaultTransformer:function(a){return {name:a[0],display:a[0],uri:a[1],id:a[2]};}}});JX.install('TypeaheadPreloadedSource',{extend:'TypeaheadSource',construct:function(a){JX.TypeaheadSource.call(this);this.uri=a;},members:{ready:false,uri:null,lastValue:null,didChange:function(a){if(this.ready){this.matchResults(a);}else{this.lastValue=a;this.waitForResults();}},didStart:function(){var a=new JX.Request(this.uri,JX.bind(this,this.ondata));a.setMethod('GET');a.send();},ondata:function(b){for(var a=0;a<b.length;++a)this.addResult(b[a]);if(this.lastValue!==null)this.matchResults(this.lastValue);this.ready=true;}}});JX.install('TypeaheadOnDemandSource',{extend:'TypeaheadSource',construct:function(a){JX.TypeaheadSource.call(this);this.uri=a;this.haveData={'':true};},properties:{queryDelay:125,auxiliaryData:{}},members:{uri:null,lastChange:null,haveData:null,didChange:function(a){this.lastChange=JX.now();a=this.normalize(a);if(this.haveData[a]){this.matchResults(a);}else{this.waitForResults();setTimeout(JX.bind(this,this.sendRequest,this.lastChange,a),this.getQueryDelay());}},sendRequest:function(c,b){if(c!=this.lastChange)return;var a=new JX.Request(this.uri,JX.bind(this,this.ondata,this.lastChange,b));a.setMethod('GET');a.setData(JX.copy(this.getAuxiliaryData(),{q:b}));a.send();},ondata:function(d,c,b){if(b)for(var a=0;a<b.length;a++)this.addResult(b[a]);this.haveData[c]=true;if(d!=this.lastChange)return;this.matchResults(c);}}});JX.install('Tokenizer',{construct:function(a){this._containerNode=a;},events:['change'],properties:{limit:null,nextInput:null},members:{_containerNode:null,_root:null,_focus:null,_orig:null,_typeahead:null,_tokenid:0,_tokens:null,_tokenMap:null,_initialValue:null,_seq:0,_lastvalue:null,_placeholder:null,start:function(){this._orig=JX.DOM.find(this._containerNode,'input','tokenizer-input');this._tokens=[];this._tokenMap={};var a=this.buildInput(this._orig.value);this._focus=a;var b=JX.DOM.scry(this._containerNode,'div','tokenizer-input-container');b=b[0]||this._containerNode;JX.DOM.listen(a,['click','focus','blur','keydown','keypress'],null,JX.bind(this,this.handleEvent));JX.DOM.listen(b,'click',null,JX.bind(this,function(e){if(e.getNode('remove')){this._remove(e.getNodeData('token').key);}else if(e.getTarget()==this._root)this.focus();}));var c=JX.$N('div');c.id=this._orig.id;JX.DOM.alterClass(c,'jx-tokenizer',true);c.style.cursor='text';this._root=c;c.appendChild(a);var d=this._typeahead;d.setInputNode(this._focus);d.start();setTimeout(JX.bind(this,function(){var e=this._orig.parentNode;JX.DOM.setContent(e,c);var g=this._initialValue||{};for(var f in g)this.addToken(f,g[f]);JX.DOM.appendContent(c,JX.$N('div',{style:{clear:'both'}}));this._redraw();}),0);},setInitialValue:function(a){this._initialValue=a;return this;},setTypeahead:function(a){a.setAllowNullSelection(false);a.removeListener();a.listen('choose',JX.bind(this,function(b){JX.Stratcom.context().prevent();if(this.addToken(b.rel,b.name)){if(this.shouldHideResultsOnChoose())this._typeahead.hide();this._typeahead.clear();this._redraw();this.focus();}}));a.listen('query',JX.bind(this,function(b){if(b.length)JX.Stratcom.context().prevent();}));this._typeahead=a;return this;},shouldHideResultsOnChoose:function(){return true;},handleEvent:function(a){this._typeahead.handleEvent(a);if(a.getPrevented())return;if(a.getType()=='click'){if(a.getTarget()==this._root){this.focus();a.prevent();return;}}else if(a.getType()=='keydown'){this._onkeydown(a);}else if(a.getType()=='blur'){this._focus.value='';this._redraw();this._typeahead.updatePlaceholder();}},refresh:function(){this._redraw(true);return this;},_redraw:function(b){if(JX.keys(this._tokenMap).length){this._typeahead.setPlaceholder(null);}else this._typeahead.setPlaceholder(this._placeholder);var a=this._focus;if(a.value===this._lastvalue&&!b)return;this._lastvalue=a.value;var d=this._root;var c=JX.DOM.textMetrics(this._focus,'jx-tokenizer-metrics');c.y=null;c.x+=24;c.setDim(a);a.value=a.value;},setPlaceholder:function(a){this._placeholder=a;return this;},addToken:function(b,e){if(b in this._tokenMap)return false;var a=this._focus;var c=this._root;var d=this.buildToken(b,e);this._tokenMap[b]={value:e,key:b,node:d};this._tokens.push(b);c.insertBefore(d,a);this.invoke('change',this);return true;},buildInput:function(a){return JX.$N('input',{className:'jx-tokenizer-input',type:'text',autocomplete:'off',value:a});},buildToken:function(b,d){var a=JX.$N('input',{type:'hidden',value:b,name:this._orig.name+'['+(this._seq++)+']'});var c=JX.$N('a',{className:'jx-tokenizer-x',sigil:'remove'},'\u00d7');return JX.$N('a',{className:'jx-tokenizer-token',sigil:'token',meta:{key:b}},[d,a,c]);},getTokens:function(){var b={};for(var a in this._tokenMap)b[a]=this._tokenMap[a].value;return b;},_onkeydown:function(b){var c=this._focus;var d=this._root;switch(b.getSpecialKey()){case 'tab':var a=this._typeahead.submit();if(this.getNextInput()){if(!a)this._focus.value='';setTimeout(JX.bind(this,function(){this.getNextInput().focus();}),0);}break;case 'delete':if(!this._focus.value.length){var e;while(e=this._tokens.pop())if(this._remove(e))break;}break;case 'return':break;default:if(this.getLimit()&&JX.keys(this._tokenMap).length==this.getLimit())b.prevent();setTimeout(JX.bind(this,this._redraw),0);break;}},_remove:function(a){if(!this._tokenMap[a])return false;JX.DOM.remove(this._tokenMap[a].node);delete this._tokenMap[a];this._redraw(true);this.focus();this.invoke('change',this);return true;},focus:function(){var a=this._focus;JX.DOM.show(a);setTimeout(function(){JX.DOM.focus(a);},0);}}});