(function($){var widgetName="ui.ufd";$.widget(widgetName,{_init:function(){if(this.element[0].tagName.toLowerCase()!="select"){this.destroy();return false;}this.options=$.extend(true,{},this.options);this.visibleCount=0;this.selectbox=this.element;this.logNode=$(this.options.logSelector);this.overflowCSS=this.options.allowLR?"overflow":"overflowY";var selectName=this.selectbox.attr("name");var suffixName=selectName+this.options.suffix;var inputName=this.options.submitFreeText?selectName:suffixName;if(this.options.submitFreeText){this.selectbox.attr("name",suffixName);}if(this.options.calculateZIndex){this.options.zIndexPopup=this._calculateZIndex();}var css=this.options.css;this.css=this.options.css;if(this.options.useUiCss){$.extend(this.css,this.options.uiCss);}if(!css.skin){css.skin=this.options.skin;}this.wrapper=$(['<span class="',css.wrapper," ",css.hidden," ",css.skin,'">','<input type="button" autocomplete="off" value="" class="ck12_ufd',css.input,'" name="',inputName,'"/>','<button type="button" tabindex="-1" class="',css.button,'"><div class="',css.buttonIcon,'"/></button>',"</span>"].join(""));this.dropdown=$(['<div class="',css.skin,'">','<div class="',css.listWrapper," ",css.hidden,'">','<div class="',css.listScroll,'">',"</div>","</div>","</div>"].join(""));this.selectbox.after(this.wrapper);this.getDropdownContainer().append(this.dropdown);this.input=this.wrapper.find("input");this.button=this.wrapper.find("button");this.listWrapper=this.dropdown.children(":first").css("z-index",this.options.zIndexPopup);this.listScroll=this.listWrapper.children(":first");if($.fn.bgiframe){this.listWrapper.bgiframe();}this._populateFromMaster();this._initEvents();},_initEvents:function(){var self=this;var keyCodes=$.ui.keyCode;var key,isKeyDown,isKeyPress,isKeyUp;var css=this.options.css;this.input.bind("keydown keypress keyup",function(event){isKeyDown=(event.type=="keydown");isKeyPress=(event.type=="keypress");isKeyUp=(event.type=="keyup");key=null;if(undefined===event.which){key=event.keyCode;}else{if(!isKeyPress&&event.which!=0){key=event.keyCode;}else{return;}}switch(key){case keyCodes.HOME:case keyCodes.END:if(self.options.homeEndForCursor){return;}case keyCodes.DOWN:case keyCodes.PAGE_DOWN:case keyCodes.UP:case keyCodes.PAGE_UP:case keyCodes.ENTER:self.stopEvent(event);default:}if(!isKeyUp==((key!=keyCodes.TAB)&&(key!=keyCodes.ENTER))){return;}self.lastKey=key;switch(key){case keyCodes.SHIFT:case keyCodes.CONTROL:break;case keyCodes.DOWN:self.selectNext(false);break;case keyCodes.PAGE_DOWN:self.selectNext(true);break;case keyCodes.END:self.selectLast();break;case keyCodes.UP:self.selectPrev(false);break;case keyCodes.PAGE_UP:self.selectPrev(true);break;case keyCodes.HOME:self.selectFirst();break;case keyCodes.ENTER:self.hideList();self.tryToSetMaster();self.inputFocus();break;case keyCodes.TAB:self.realLooseFocusEvent();break;case keyCodes.ESCAPE:self.hideList();self.revertSelected();break;default:self.showList();self.filter(false,true);break;}});this.input.bind("click",function(e){if(self.isDisabled){self.stopEvent(e);return;}if(!self.listVisible()){self.filter(true);self.inputFocus();self.showList();}});this.input.bind("focus",function(e){if(self.isDisabled){self.stopEvent(e);return;}if(!self.internalFocus){self.realFocusEvent();}});this.button.bind("mouseover",function(e){self.button.addClass(css.buttonHover);});this.button.bind("mouseout",function(e){self.button.removeClass(css.buttonHover);});this.button.bind("mousedown",function(e){self.button.addClass(css.buttonMouseDown);});this.button.bind("mouseup",function(e){self.button.removeClass(css.buttonMouseDown);});this.button.bind("click",function(e){if(self.isDisabled){self.stopEvent(e);return;}if(self.listVisible()){self.hideList();self.inputFocus();}else{self.filter(true);self.inputFocus();self.showList();}});this.listScroll.bind("DOMMouseScroll mousewheel",function(e){self.stopEvent(e);e=e?e:window.event;var normal=e.detail?e.detail*-1:e.wheelDelta/40;var curST=self.listScroll.scrollTop();var newScroll=curST+((normal>0)?-1*self.itemHeight:1*self.itemHeight);self.listScroll.scrollTop(newScroll);});this.listScroll.bind("mouseover mouseout click",function(e){if("LI"==e.target.nodeName.toUpperCase()){if(self.setActiveTimeout){clearTimeout(self.setActiveTimeout);self.setActiveTimeout==null;}if("mouseout"==e.type){$(e.target).removeClass(css.liActive);self.setActiveTimeout=setTimeout(function(){$(self.selectedLi).addClass(css.liActive);},self.options.delayYield);}else{if("mouseover"==e.type){if(self.selectedLi!=e.target){$(self.selectedLi).removeClass(css.liActive);}$(e.target).addClass(css.liActive);}else{self.stopEvent(e);var value=$.trim($(e.target).text());self.input.val(value);self.setActive(e.target);if(self.tryToSetMaster()){self.hideList();self.filter(true);}self.inputFocus();}}}return true;});this.selectbox.bind("change."+widgetName,function(e){if(self.isUpdatingMaster){self.isUpdatingMaster=false;return true;}self.revertSelected();});this._myDocClickHandler=function(e){if((self.button.get(0)==e.target)||(self.input.get(0)==e.target)){return;}if(self.internalFocus){self.realLooseFocusEvent();}};$(document).bind("click."+widgetName,this._myDocClickHandler);},realFocusEvent:function(){this.internalFocus=true;this._triggerEventOnMaster("focus");this.wrapper.addClass(this.options.css.skin+"-"+this.options.css.inputFocus);this.input.addClass(this.options.css.inputFocus);this.button.addClass(this.options.css.inputFocus);this.filter(true);this.inputFocus();this.showList();},realLooseFocusEvent:function(){this.internalFocus=false;this.hideList();this.wrapper.removeClass(this.options.css.skin+"-"+this.options.css.inputFocus);this.input.removeClass(this.options.css.inputFocus);this.button.removeClass(this.options.css.inputFocus);this.tryToSetMaster();this._triggerEventOnMaster("blur");},_triggerEventOnMaster:function(eventName){if(document.createEvent){var evObj=document.createEvent("HTMLEvents");evObj.initEvent(eventName,true,true);this.selectbox.get(0).dispatchEvent(evObj);}else{if(document.createEventObject){this.selectbox.get(0).fireEvent("on"+eventName);}}},inputFocus:function(){this.input.focus();if(this.getCurrentTextValue().length){this.selectAll();}},inputBlur:function(){this.input.blur();},showList:function(){if(this.listVisible()){return;}this.listWrapper.removeClass(this.css.hidden);this.setListDisplay();},hideList:function(){if(!this.listVisible()){return;}this.listWrapper.addClass(this.css.hidden);this.listItems.removeClass(this.css.hidden);},filter:function(showAll,doDelay){var self=this;if(this.updateOnTimeout){clearTimeout(this.updateOnTimeout);}if(this.filterOnTimeout){clearTimeout(this.filterOnTimeout);}this.updateOnTimeout=null;this.filterOnTimeout=null;var searchText=self.getCurrentTextValue();var search=function(){var mm=self.trie.find(searchText);self.trie.matches=mm.matches;self.trie.misses=mm.misses;self.updateOnTimeout=setTimeout(function(){screenUpdate();},self.options.delayYield);};var screenUpdate=function(){self.setListDisplay();};if(doDelay){this.filterOnTimeout=setTimeout(function(){search();},this.options.delayFilter);}else{search();}},emphasis:function(array,isAddEmphasis,searchText){var searchTextLength=searchText.length||0;var options=this.selectbox.get(0).options;var tritem,index,indexB,li,text,stPattern,escapedST;index=array.length;isAddEmphasis=(isAddEmphasis&&searchTextLength>0&&index>1);if(isAddEmphasis){escapedST=searchText.replace(/([\\\^\$*+[\]?{}.=!:(|)])/g,"\\$1");stPattern=new RegExp("("+escapedST+")","gi");this.hasEmphasis=true;}while(index--){tritem=array[index];indexB=tritem.length;while(indexB--){li=tritem[indexB];text=$.trim(options[li.getAttribute("name")].text);if(isAddEmphasis){li.innerHTML=text.replace(stPattern,"<em>$1</em>");}else{li.innerHTML=text;}}}},removeEmphasis:function(){if(!this.hasEmphasis){return;}this.hasEmphasis=false;var options=this.selectbox.get(0).options;var theLiSet=this.list.get(0).getElementsByTagName("LI");var liCount=theLiSet.length;var li;while(liCount--){var li=theLiSet[liCount];li.innerHTML=$.trim(options[li.getAttribute("name")].text);}},tryToSetMaster:function(){var optionIndex=null;var active=this.getActive();if(active.length){optionIndex=active.attr("name");}if(optionIndex==null||optionIndex==""||optionIndex<0){if(this.options.submitFreeText){return false;}else{this.revertSelected();return false;}}var sBox=this.selectbox.get(0);var curIndex=sBox.selectedIndex;var option=sBox.options[optionIndex];if(!this.options.submitFreeText||this.input.val()==option.text){this.input.val(option.text);if(optionIndex!=curIndex){this.isUpdatingMaster=true;sBox.selectedIndex=optionIndex;this._triggerEventOnMaster("change");}return true;}return false;},_populateFromMaster:function(){var isEnabled=!this.selectbox.filter("[disabled]").length;this.disable();this.setDimensions();this.trie=new InfixTrie(this.options.infix,this.options.caseSensitive);this.trie.matches=[];this.trie.misses=[];var self=this;var listBuilder=[];listBuilder.push("<ul>");var options=this.selectbox.get(0).options;var thisOpt,loopCountdown,index;loopCountdown=options.length;index=0;while(loopCountdown--){thisOpt=options[index++];listBuilder.push('<li name="');listBuilder.push(thisOpt.index);listBuilder.push('">');listBuilder.push($.trim(thisOpt.text));listBuilder.push("</li>");}listBuilder.push("</ul>");this.listScroll.html(listBuilder.join(""));this.list=this.listScroll.find("ul:first");var theLiSet=this.list.get(0).getElementsByTagName("LI");this.listItems=$(theLiSet);loopCountdown=theLiSet.length;index=0;while(loopCountdown--){thisOpt=options[index];self.trie.add($.trim(thisOpt.text),theLiSet[index++]);}this.visibleCount=theLiSet.length;this.setInputFromMaster();this.selectedLi=null;if(isEnabled){this.enable();}},setDimensions:function(){this.wrapper.addClass(this.css.hidden);if(this.selectIsWrapped&&(!this.options.manualWidth||this.options.unwrapForCSS)){this.wrapper.before(this.selectbox);this.selectIsWrapped=false;}var newSelectWidth;if(this.options.manualWidth){newSelectWidth=this.options.manualWidth;}else{newSelectWidth=this.selectbox.outerWidth();if(newSelectWidth<this.options.minWidth){newSelectWidth=this.options.minWidth;}else{if(this.options.maxWidth&&(newSelectWidth>this.options.maxWidth)){newSelectWidth=this.options.maxWidth;}}}var props=this.options.mimicCSS;for(propPtr in props){var prop=props[propPtr];this.wrapper.css(prop,this.selectbox.css(prop));}if(!this.selectIsWrapped){this.wrapper.get(0).appendChild(this.selectbox.get(0));this.selectIsWrapped=true;}this.wrapper.removeClass(this.css.hidden);this.listWrapper.removeClass(this.css.hidden);var buttonWidth=this.button.outerWidth(true);var wrapperBP=this.wrapper.outerWidth()-this.wrapper.width();var inputBP=this.input.outerWidth(true)-this.input.width();var listScrollBP=this.listScroll.outerWidth()-this.listScroll.width();var inputWidth=newSelectWidth-buttonWidth-inputBP;inputWidth=inputWidth+6;this.input.width(inputWidth);this.wrapper.width(newSelectWidth);this.listWrapper.width(newSelectWidth+wrapperBP);this.listScroll.width(newSelectWidth+wrapperBP-listScrollBP);this.listWrapper.addClass(this.css.hidden);},setInputFromMaster:function(){var selectNode=this.selectbox.get(0);var val="";try{val=selectNode.options[selectNode.selectedIndex].text;}catch(e){}this.input.val(val);},revertSelected:function(){this.setInputFromMaster();this.filter(true);},setListDisplay:function(){if(!this.itemHeight){this.itemHeight=this.listItems.filter("li:first").outerHeight(true);}var height;if(this.visibleCount>this.options.listMaxVisible){height=this.options.listMaxVisible*this.itemHeight;this.listScroll.css(this.overflowCSS,"scroll");this.listScroll.height(height);}else{height=this.visibleCount*this.itemHeight;this.listScroll.css(this.overflowCSS,"hidden");}var outerHeight=this.listScroll.outerHeight();this.listWrapper.height(outerHeight);var offset=this.wrapper.offset();var wrapperOuterHeight=this.wrapper.outerHeight();var bottomPos=offset.top+wrapperOuterHeight+outerHeight;var maxShown=$(window).height()+$(document).scrollTop();var doDropUp=(bottomPos>maxShown);var left=offset.left;var top;if(doDropUp){this.listWrapper.addClass(this.css.listWrapperUp);top=(offset.top-outerHeight);}else{this.listWrapper.removeClass(this.css.listWrapperUp);top=(offset.top+wrapperOuterHeight);}this.listWrapper.css("left",left);this.listWrapper.css("top",top);this.scrollTo();return height;},getActive:function(){if(this.selectedLi==null){return $([]);}return $(this.selectedLi);},setActive:function(activeItem){$(this.selectedLi).removeClass(this.css.liActive);this.selectedLi=activeItem;$(this.selectedLi).addClass(this.css.liActive);},selectFirst:function(){var toSelect=this.listItems.filter(":not(.invisible):first");this.afterSelect(toSelect);},selectLast:function(){var toSelect=this.listItems.filter(":not(.invisible):last");this.afterSelect(toSelect);},selectPrev:function(isPageLength){var count=isPageLength?this.options.pageLength:1;var toSelect=this.searchRelativeVisible(false,count);this.afterSelect(toSelect);},selectNext:function(isPageLength){var count=isPageLength?this.options.pageLength:1;var toSelect=this.searchRelativeVisible(true,count);this.afterSelect(toSelect);},afterSelect:function(active){if(active==null){return;}this.setActive(active);this.input.val(active.text());this.scrollTo();this.tryToSetMaster();this.inputFocus();this.removeEmphasis();},searchRelativeVisible:function(isSearchDown,count){var active=this.getActive();if(!active.length){this.selectFirst();return null;}var searchResult;do{searchResult=active;do{searchResult=isSearchDown?searchResult.next():searchResult.prev();}while(searchResult.length&&searchResult.hasClass(this.css.hidden));if(searchResult.length){active=searchResult;}}while(--count);return active;},scrollTo:function(){if("scroll"!=this.listScroll.css(this.overflowCSS)){return false;}var active=this.getActive();if(!active.length){return false;}var activePos=Math.floor(active.position().top);var activeHeight=active.outerHeight(true);var listHeight=this.listWrapper.height();var scrollTop=this.listScroll.scrollTop();var top;var viewAheadGap=(this.options.viewAhead*activeHeight);if(activePos<viewAheadGap){top=scrollTop+activePos-viewAheadGap;}else{if((activePos+activeHeight)>=(listHeight-viewAheadGap)){top=scrollTop+activePos-listHeight+activeHeight+viewAheadGap;}else{return false;}}this.listScroll.scrollTop(top);return true;},getCurrentTextValue:function(){var input=$.trim(this.input.val());return input;},stopEvent:function(e){e=e?e:window.event;e.cancel=true;e.cancelBubble=true;e.returnValue=false;if(e.stopPropagation){e.stopPropagation();}if(e.preventDefault){e.preventDefault();}},overwriteClass:function(array,classString){var tritem,index,indexB;index=array.length;while(index--){tritem=array[index];indexB=tritem.length;while(indexB--){tritem[indexB].setAttribute($.ui.ufd.classAttr,classString);}}},listVisible:function(){var isVisible=!this.listWrapper.hasClass(this.css.hidden);return isVisible;},disable:function(){this.hideList();this.isDisabled=true;this.button.addClass(this.css.buttonDisabled);this.input.addClass(this.css.inputDisabled);this.input.attr("disabled","disabled");this.selectbox.attr("disabled","disabled");},enable:function(){this.isDisabled=false;this.button.removeClass(this.css.buttonDisabled);this.input.removeClass(this.css.inputDisabled);this.input.removeAttr("disabled");this.selectbox.removeAttr("disabled");},selection:function(field,start,end){if(field.createTextRange){var selRange=field.createTextRange();selRange.collapse(true);selRange.moveStart("character",start);selRange.moveEnd("character",end);selRange.select();}else{if(field.setSelectionRange){field.setSelectionRange(start,end);}else{if(field.selectionStart){field.selectionStart=start;field.selectionEnd=end;}}}},selectAll:function(){},getDropdownContainer:function(){var ddc=$("#"+this.options.dropDownID);if(!ddc.length){ddc=$("<div></div>").appendTo("body").css("height",0).attr("id",this.options.dropDownID);}return ddc;},log:function(msg){if(!this.options.log){return;}if(window.console&&window.console.log){console.log(msg);}if(this.logNode&&this.logNode.length){this.logNode.prepend("<div>"+msg+"</div>");}},_calculateZIndex:function(msg){var curZ,zIndex=this.options.zIndexPopup;this.selectbox.parents().each(function(){curZ=parseInt($(this).css("zIndex"),10);if(curZ>zIndex){zIndex=curZ;}});return zIndex+1;},changeOptions:function(){this._populateFromMaster();},destroy:function(){if(this.selectIsWrapped){this.wrapper.before(this.selectbox);}this.selectbox.unbind("change."+widgetName);$(document).unbind("click."+widgetName,this._myDocClickHandler);this.wrapper.remove();this.listWrapper.remove();if($.ui.version<="1.7.2"){this.selectbox.unbind("setData."+widgetName);this.selectbox.unbind("getData."+widgetName);this.selectbox.unbind("remove");}$.widget.prototype.destroy.apply(this,arguments);this.selectbox=null;},selectIsWrapped:false,internalFocus:false,lastKey:null,selectedLi:null,isUpdatingMaster:false,hasEmphasis:false,isDisabled:false});var InfixTrie=function(isInfix,isCaseSensitive){this.isInfix=!!isInfix;this.isCaseSensitive=!!isCaseSensitive;this.root=[null,{},false];this.infixRoots=(isInfix)?{}:null;};InfixTrie.prototype.add=function(key,object){key=this.cleanString(key);var kLen=key.length;var curNode=this.root;var chr,node;for(var i=0;i<kLen;i++){chr=key.charAt(i);node=curNode[1];if(chr in node){curNode=node[chr];}else{curNode=node[chr]=[null,{},this.root[2]];if(this.isInfix){if(chr in this.infixRoots){this.infixRoots[chr].push(curNode);}else{this.infixRoots[chr]=[curNode];}}}}if(curNode[0]){curNode[0].push(object);}else{curNode[0]=[object];}return true;},InfixTrie.prototype.find=function(key){var trieNodeArray=this.findNodeArray(key);var toggleTo=!this.root[2];var matches=[];var misses=[];var trie;for(arrName in trieNodeArray){trie=trieNodeArray[arrName];this.markAndRetrieve(matches,trie,toggleTo);}this.markAndRetrieve(misses,this.root,toggleTo);return{matches:matches,misses:misses};};InfixTrie.prototype.findNodeArray=function(key){var key=this.cleanString(key);var retArray=[this.root];var kLen=key.length;var chr;this.cache=this.cache||{};var thisCache=this.cache;for(var i=0;i<kLen;i++){chr=key.charAt(i);if(thisCache.chr==chr){retArray=thisCache.hit;}else{retArray=this.mapNewArray(retArray,chr);thisCache.chr=chr;thisCache.hit=retArray;thisCache.next={};}thisCache=thisCache.next;}return retArray;};InfixTrie.prototype.mapNewArray=function(nodeArr,chr){if(nodeArr.length&&nodeArr[0]==this.root){if(this.isInfix){return(this.infixRoots[chr]||[]);}else{var prefixRoot=this.root[1][chr];return(prefixRoot)?[prefixRoot]:[];}}var retArray=[];var aLen=nodeArr.length;var thisNodesArray;for(var i=0;i<aLen;i++){thisNodesArray=nodeArr[i][1];if(thisNodesArray.hasOwnProperty(chr)){retArray.push(thisNodesArray[chr]);}}return retArray;};InfixTrie.prototype.markAndRetrieve=function(array,trie,toggleSet){var stack=[trie];while(stack.length>0){var thisTrie=stack.pop();if(thisTrie[2]==toggleSet){continue;}thisTrie[2]=toggleSet;if(thisTrie[0]){array.unshift(thisTrie[0]);}for(chr in thisTrie[1]){if(thisTrie[1].hasOwnProperty(chr)){stack.push(thisTrie[1][chr]);}}}};InfixTrie.prototype.cleanString=function(inStr){if(!this.isCaseSensitive){inStr=inStr.toLowerCase();}return inStr;};$.ui.ufd.getNewTrie=function(isCaseSensitive,isInfix){return new InfixTrie(isCaseSensitive,isInfix);};$.extend($.ui.ufd,{version:"0.5",getter:"",classAttr:(($.support.style)?"class":"className"),defaults:{skin:"plain",suffix:"_ufd",dropDownID:"ufd-container",logSelector:"#log",mimicCSS:["marginLeft","marginTop","marginRight","marginBottom"],infix:true,addEmphasis:false,caseSensitive:false,submitFreeText:false,homeEndForCursor:false,allowLR:false,calculateZIndex:false,useUiCss:false,log:false,unwrapForCSS:false,listMaxVisible:10,minWidth:50,maxWidth:null,manualWidth:null,viewAhead:1,pageLength:10,delayFilter:($.support.style)?1:150,delayYield:1,zIndexPopup:101,css:{input:"",inputDisabled:"disabled",inputFocus:"focus",button:"",buttonIcon:"icon",buttonDisabled:"disabled",buttonHover:"hover",buttonMouseDown:"mouseDown",li:"",liActive:"active",hidden:"invisible",wrapper:"ufd",listWrapper:"list-wrapper",listWrapperUp:"list-wrapper-up",listScroll:"list-scroll"},uiCss:{skin:"uiCss",input:"ui-widget-content",inputDisabled:"disabled",button:"ui-button",buttonIcon:"ui-icon ui-icon-triangle-1-s",buttonDisabled:"disabled",buttonHover:"ui-state-focus",buttonMouseDown:"ui-state-active",li:"ui-menu-item",liActive:"ui-state-hover",hidden:"invisible",wrapper:"ufd ui-widget ui-widget-content",listWrapper:"list-wrapper ui-widget ui-widget",listWrapperUp:"list-wrapper-up",listScroll:"list-scroll ui-widget-content"}}});})(jQuery);
