/* Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved. Available via Academic Free License >= 2.1 OR the modified BSD license. see: http://dojotoolkit.org/license for details */ if(!dojo._hasResource["dijit.form.ComboBox"]){ dojo._hasResource["dijit.form.ComboBox"]=true; dojo.provide("dijit.form.ComboBox"); dojo.require("dojo.window"); dojo.require("dojo.regexp"); dojo.require("dojo.data.util.simpleFetch"); dojo.require("dojo.data.util.filter"); dojo.require("dijit._CssStateMixin"); dojo.require("dijit.form._FormWidget"); dojo.require("dijit.form.ValidationTextBox"); dojo.requireLocalization("dijit.form","ComboBox",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-tw"); dojo.declare("dijit.form.ComboBoxMixin",null,{item:null,pageSize:Infinity,store:null,fetchProperties:{},query:{},autoComplete:true,highlightMatch:"first",searchDelay:100,searchAttr:"name",labelAttr:"",labelType:"text",queryExpr:"${0}*",ignoreCase:true,hasDownArrow:true,templateString:dojo.cache("dijit.form","templates/ComboBox.html","
\n"),baseClass:"dijitTextBox dijitComboBox",cssStateNodes:{"downArrowNode":"dijitDownArrowButton"},_getCaretPos:function(_1){ var _2=0; if(typeof (_1.selectionStart)=="number"){ _2=_1.selectionStart; }else{ if(dojo.isIE){ var tr=dojo.doc.selection.createRange().duplicate(); var _3=_1.createTextRange(); tr.move("character",0); _3.move("character",0); try{ _3.setEndPoint("EndToEnd",tr); _2=String(_3.text).replace(/\r/g,"").length; } catch(e){ } } } return _2; },_setCaretPos:function(_4,_5){ _5=parseInt(_5); dijit.selectInputText(_4,_5,_5); },_setDisabledAttr:function(_6){ this.inherited(arguments); dijit.setWaiState(this.comboNode,"disabled",_6); },_abortQuery:function(){ if(this.searchTimer){ clearTimeout(this.searchTimer); this.searchTimer=null; } if(this._fetchHandle){ if(this._fetchHandle.abort){ this._fetchHandle.abort(); } this._fetchHandle=null; } },_onInput:function(_7){ if(!this.searchTimer&&(_7.type=="paste"||_7.type=="input")&&this._lastInput!=this.textbox.value){ this.searchTimer=setTimeout(dojo.hitch(this,function(){ this._onKeyPress({charOrCode:229}); }),100); } this.inherited(arguments); },_onKeyPress:function(_8){ var _9=_8.charOrCode; if(_8.altKey||((_8.ctrlKey||_8.metaKey)&&(_9!="x"&&_9!="v"))||_9==dojo.keys.SHIFT){ return; } var _a=false; var _b="_startSearchFromInput"; var pw=this._popupWidget; var dk=dojo.keys; var _c=null; this._prev_key_backspace=false; this._abortQuery(); if(this._isShowingNow){ pw.handleKey(_9); _c=pw.getHighlightedOption(); } switch(_9){ case dk.PAGE_DOWN: case dk.DOWN_ARROW: case dk.PAGE_UP: case dk.UP_ARROW: if(!this._isShowingNow){ _a=true; _b="_startSearchAll"; }else{ this._announceOption(_c); } dojo.stopEvent(_8); break; case dk.ENTER: if(_c){ if(_c==pw.nextButton){ this._nextSearch(1); dojo.stopEvent(_8); break; }else{ if(_c==pw.previousButton){ this._nextSearch(-1); dojo.stopEvent(_8); break; } } }else{ this._setBlurValue(); this._setCaretPos(this.focusNode,this.focusNode.value.length); } _8.preventDefault(); case dk.TAB: var _d=this.get("displayedValue"); if(pw&&(_d==pw._messages["previousMessage"]||_d==pw._messages["nextMessage"])){ break; } if(_c){ this._selectOption(); } if(this._isShowingNow){ this._lastQuery=null; this._hideResultList(); } break; case " ": if(_c){ dojo.stopEvent(_8); this._selectOption(); this._hideResultList(); }else{ _a=true; } break; case dk.ESCAPE: if(this._isShowingNow){ dojo.stopEvent(_8); this._hideResultList(); } break; case dk.DELETE: case dk.BACKSPACE: this._prev_key_backspace=true; _a=true; break; default: _a=typeof _9=="string"||_9==229; } if(_a){ this.item=undefined; this.searchTimer=setTimeout(dojo.hitch(this,_b),1); } },_autoCompleteText:function(_e){ var fn=this.focusNode; dijit.selectInputText(fn,fn.value.length); var _f=this.ignoreCase?"toLowerCase":"substr"; if(_e[_f](0).indexOf(this.focusNode.value[_f](0))==0){ var _10=this._getCaretPos(fn); if((_10+1)>fn.value.length){ fn.value=_e; dijit.selectInputText(fn,_10); } }else{ fn.value=_e; dijit.selectInputText(fn); } },_openResultList:function(_11,_12){ this._fetchHandle=null; if(this.disabled||this.readOnly||(_12.query[this.searchAttr]!=this._lastQuery)){ return; } this._popupWidget.clearResultList(); if(!_11.length&&!this._maxOptions){ this._hideResultList(); return; } _12._maxOptions=this._maxOptions; var _13=this._popupWidget.createOptions(_11,_12,dojo.hitch(this,"_getMenuLabelFromItem")); this._showResultList(); if(_12.direction){ if(1==_12.direction){ this._popupWidget.highlightFirstOption(); }else{ if(-1==_12.direction){ this._popupWidget.highlightLastOption(); } } this._announceOption(this._popupWidget.getHighlightedOption()); }else{ if(this.autoComplete&&!this._prev_key_backspace&&!/^[*]+$/.test(_12.query[this.searchAttr])){ this._announceOption(_13[1]); } } },_showResultList:function(){ this._hideResultList(); this.displayMessage(""); dojo.style(this._popupWidget.domNode,{width:"",height:""}); var _14=this.open(); var _15=dojo.marginBox(this._popupWidget.domNode); this._popupWidget.domNode.style.overflow=((_14.h==_15.h)&&(_14.w==_15.w))?"hidden":"auto"; var _16=_14.w; if(_14.h$2"); return ret; },_escapeHtml:function(str){ str=String(str).replace(/&/gm,"&").replace(//gm,">").replace(/"/gm,"""); return str; },open:function(){ this._isShowingNow=true; return dijit.popup.open({popup:this._popupWidget,around:this.domNode,parent:this}); },reset:function(){ this.item=null; this.inherited(arguments); },labelFunc:function(_34,_35){ return _35.getValue(_34,this.searchAttr).toString(); }}); dojo.declare("dijit.form._ComboBoxMenu",[dijit._Widget,dijit._Templated,dijit._CssStateMixin],{templateString:"
    "+"
  • "+"
  • "+"
",_messages:null,baseClass:"dijitComboBoxMenu",postMixInProperties:function(){ this._messages=dojo.i18n.getLocalization("dijit.form","ComboBox",this.lang); this.inherited(arguments); },_setValueAttr:function(_36){ this.value=_36; this.onChange(_36); },onChange:function(_37){ },onPage:function(_38){ },postCreate:function(){ this.previousButton.innerHTML=this._messages["previousMessage"]; this.nextButton.innerHTML=this._messages["nextMessage"]; this.inherited(arguments); },onClose:function(){ this._blurOptionNode(); },_createOption:function(_39,_3a){ var _3b=_3a(_39); var _3c=dojo.doc.createElement("li"); dijit.setWaiRole(_3c,"option"); if(_3b.html){ _3c.innerHTML=_3b.label; }else{ _3c.appendChild(dojo.doc.createTextNode(_3b.label)); } if(_3c.innerHTML==""){ _3c.innerHTML=" "; } _3c.item=_39; return _3c; },createOptions:function(_3d,_3e,_3f){ this.previousButton.style.display=(_3e.start==0)?"none":""; dojo.attr(this.previousButton,"id",this.id+"_prev"); dojo.forEach(_3d,function(_40,i){ var _41=this._createOption(_40,_3f); _41.className="dijitReset dijitMenuItem"+(this.isLeftToRight()?"":" dijitMenuItemRtl"); dojo.attr(_41,"id",this.id+i); this.domNode.insertBefore(_41,this.nextButton); },this); var _42=false; if(_3e._maxOptions&&_3e._maxOptions!=-1){ if((_3e.start+_3e.count)<_3e._maxOptions){ _42=true; }else{ if((_3e.start+_3e.count)>_3e._maxOptions&&_3e.count==_3d.length){ _42=true; } } }else{ if(_3e.count==_3d.length){ _42=true; } } this.nextButton.style.display=_42?"":"none"; dojo.attr(this.nextButton,"id",this.id+"_next"); return this.domNode.childNodes; },clearResultList:function(){ while(this.domNode.childNodes.length>2){ this.domNode.removeChild(this.domNode.childNodes[this.domNode.childNodes.length-2]); } },_onMouseDown:function(evt){ dojo.stopEvent(evt); },_onMouseUp:function(evt){ if(evt.target===this.domNode||!this._highlighted_option){ return; }else{ if(evt.target==this.previousButton){ this.onPage(-1); }else{ if(evt.target==this.nextButton){ this.onPage(1); }else{ var tgt=evt.target; while(!tgt.item){ tgt=tgt.parentNode; } this._setValueAttr({target:tgt},true); } } } },_onMouseOver:function(evt){ if(evt.target===this.domNode){ return; } var tgt=evt.target; if(!(tgt==this.previousButton||tgt==this.nextButton)){ while(!tgt.item){ tgt=tgt.parentNode; } } this._focusOptionNode(tgt); },_onMouseOut:function(evt){ if(evt.target===this.domNode){ return; } this._blurOptionNode(); },_focusOptionNode:function(_43){ if(this._highlighted_option!=_43){ this._blurOptionNode(); this._highlighted_option=_43; dojo.addClass(this._highlighted_option,"dijitMenuItemSelected"); } },_blurOptionNode:function(){ if(this._highlighted_option){ dojo.removeClass(this._highlighted_option,"dijitMenuItemSelected"); this._highlighted_option=null; } },_highlightNextOption:function(){ if(!this.getHighlightedOption()){ var fc=this.domNode.firstChild; this._focusOptionNode(fc.style.display=="none"?fc.nextSibling:fc); }else{ var ns=this._highlighted_option.nextSibling; if(ns&&ns.style.display!="none"){ this._focusOptionNode(ns); }else{ this.highlightFirstOption(); } } dojo.window.scrollIntoView(this._highlighted_option); },highlightFirstOption:function(){ var _44=this.domNode.firstChild; var _45=_44.nextSibling; this._focusOptionNode(_45.style.display=="none"?_44:_45); dojo.window.scrollIntoView(this._highlighted_option); },highlightLastOption:function(){ this._focusOptionNode(this.domNode.lastChild.previousSibling); dojo.window.scrollIntoView(this._highlighted_option); },_highlightPrevOption:function(){ if(!this.getHighlightedOption()){ var lc=this.domNode.lastChild; this._focusOptionNode(lc.style.display=="none"?lc.previousSibling:lc); }else{ var ps=this._highlighted_option.previousSibling; if(ps&&ps.style.display!="none"){ this._focusOptionNode(ps); }else{ this.highlightLastOption(); } } dojo.window.scrollIntoView(this._highlighted_option); },_page:function(up){ var _46=0; var _47=this.domNode.scrollTop; var _48=dojo.style(this.domNode,"height"); if(!this.getHighlightedOption()){ this._highlightNextOption(); } while(_46<_48){ if(up){ if(!this.getHighlightedOption().previousSibling||this._highlighted_option.previousSibling.style.display=="none"){ break; } this._highlightPrevOption(); }else{ if(!this.getHighlightedOption().nextSibling||this._highlighted_option.nextSibling.style.display=="none"){ break; } this._highlightNextOption(); } var _49=this.domNode.scrollTop; _46+=(_49-_47)*(up?-1:1); _47=_49; } },pageUp:function(){ this._page(true); },pageDown:function(){ this._page(false); },getHighlightedOption:function(){ var ho=this._highlighted_option; return (ho&&ho.parentNode)?ho:null; },handleKey:function(key){ switch(key){ case dojo.keys.DOWN_ARROW: this._highlightNextOption(); break; case dojo.keys.PAGE_DOWN: this.pageDown(); break; case dojo.keys.UP_ARROW: this._highlightPrevOption(); break; case dojo.keys.PAGE_UP: this.pageUp(); break; } }}); dojo.declare("dijit.form.ComboBox",[dijit.form.ValidationTextBox,dijit.form.ComboBoxMixin],{_setValueAttr:function(_4a,_4b,_4c){ this.item=null; if(!_4a){ _4a=""; } dijit.form.ValidationTextBox.prototype._setValueAttr.call(this,_4a,_4b,_4c); }}); dojo.declare("dijit.form._ComboBoxDataStore",null,{constructor:function(_4d){ this.root=_4d; if(_4d.tagName!="SELECT"&&_4d.firstChild){ _4d=dojo.query("select",_4d); if(_4d.length>0){ _4d=_4d[0]; }else{ this.root.innerHTML=""; _4d=this.root.firstChild; } this.root=_4d; } dojo.query("> option",_4d).forEach(function(_4e){ _4e.innerHTML=dojo.trim(_4e.innerHTML); }); },getValue:function(_4f,_50,_51){ return (_50=="value")?_4f.value:(_4f.innerText||_4f.textContent||""); },isItemLoaded:function(_52){ return true; },getFeatures:function(){ return {"dojo.data.api.Read":true,"dojo.data.api.Identity":true}; },_fetchItems:function(_53,_54,_55){ if(!_53.query){ _53.query={}; } if(!_53.query.name){ _53.query.name=""; } if(!_53.queryOptions){ _53.queryOptions={}; } var _56=dojo.data.util.filter.patternToRegExp(_53.query.name,_53.queryOptions.ignoreCase),_57=dojo.query("> option",this.root).filter(function(_58){ return (_58.innerText||_58.textContent||"").match(_56); }); if(_53.sort){ _57.sort(dojo.data.util.sorter.createSortFunction(_53.sort,this)); } _54(_57,_53); },close:function(_59){ return; },getLabel:function(_5a){ return _5a.innerHTML; },getIdentity:function(_5b){ return dojo.attr(_5b,"value"); },fetchItemByIdentity:function(_5c){ var _5d=dojo.query("> option[value='"+_5c.identity+"']",this.root)[0]; _5c.onItem(_5d); },fetchSelectedItem:function(){ var _5e=this.root,si=_5e.selectedIndex; return typeof si=="number"?dojo.query("> option:nth-child("+(si!=-1?si+1:1)+")",_5e)[0]:null; }}); dojo.extend(dijit.form._ComboBoxDataStore,dojo.data.util.simpleFetch); }