(function(n){n.widget("ui.selectmenu",{_init:function(){var t=this,i=this.options,s,l,r,h,u,f,e,c,a,v,o;this.ids=[this.element.attr("id")+"-button",this.element.attr("id")+"-menu"];this._safemouseup=!0;this.newelement=n('<a class="'+this.widgetBaseClass+' ui-widget ui-state-default round ui-corner-all" id="'+this.ids[0]+'" role="button" href="#" aria-haspopup="true" aria-owns="'+this.ids[1]+'"><\/a>').insertAfter(this.element);s=this.element.attr("tabindex");s&&this.newelement.attr("tabindex",s);this.newelement.data("selectelement",this.element);this.selectmenuIcon=n('<span class="'+this.widgetBaseClass+'-icon ui-icon"><\/span>').prependTo(this.newelement).addClass(i.style=="popup"?"ui-icon-triangle-2-n-s":"ui-icon-triangle-1-s");n("label[for="+this.element.attr("id")+"]").attr("for",this.ids[0]).bind("click",function(){return t.newelement[0].focus(),!1});this.newelement.bind("mousedown",function(n){return t._toggle(n),i.style=="popup"&&(t._safemouseup=!1,setTimeout(function(){t._safemouseup=!0},300)),!1}).bind("click",function(){return!1}).keydown(function(i){var r=!0;switch(i.keyCode){case n.ui.keyCode.ENTER:r=!0;break;case n.ui.keyCode.SPACE:r=!1;t._toggle(i);break;case n.ui.keyCode.UP:case n.ui.keyCode.LEFT:r=!1;t._moveSelection(-1);break;case n.ui.keyCode.DOWN:case n.ui.keyCode.RIGHT:r=!1;t._moveSelection(1);break;case n.ui.keyCode.TAB:r=!0;break;default:r=!1;t._typeAhead(i.keyCode,"mouseup")}return r}).bind("mouseover focus",function(){n(this).addClass(t.widgetBaseClass+"-focus ui-state-hover")}).bind("mouseout blur",function(){n(this).removeClass(t.widgetBaseClass+"-focus ui-state-hover")});n(document).mousedown(function(n){t.close(n)});this.element.click(function(){this._refreshValue()}).focus(function(){this.newelement[0].focus()});l=i.style=="dropdown"?" ui-corner-bottom":" ui-corner-all";this.list=n('<ul class="'+t.widgetBaseClass+"-menu ui-widget ui-widget-content round-bottom"+l+'" aria-hidden="true" role="listbox" aria-labelledby="'+this.ids[0]+'" id="'+this.ids[1]+'"><\/ul>').appendTo("body");r=[];this.element.find("option").each(function(){r.push({value:n(this).attr("value"),text:t._formatText(jQuery(this).text()),selected:n(this).prop("selected"),classes:n(this).attr("class"),parentOptGroup:n(this).parent("optgroup").attr("label")})});h=t.options.style=="popup"?" ui-state-active":"";for(u in r)if(f=n('<li role="presentation"><a href="#" tabindex="-1" role="option" aria-selected="false">'+r[u].text+"<\/a><\/li>").data("index",u).addClass(r[u].classes).data("optionClasses",r[u].classes||"").mouseup(function(i){if(t._safemouseup){var r=n(this).data("index")!=t._selectedIndex();t.value(n(this).data("index"));t.select(i);r&&t.change(i);t.close(i,!0)}return!1}).click(function(){return!1}).bind("mouseover focus",function(){t._selectedOptionLi().addClass(h);t._focusedOptionLi().removeClass(t.widgetBaseClass+"-item-focus ui-state-hover");n(this).removeClass("ui-state-active").addClass(t.widgetBaseClass+"-item-focus ui-state-hover")}).bind("mouseout blur",function(){n(this).is(t._selectedOptionLi())&&n(this).addClass(h);n(this).removeClass(t.widgetBaseClass+"-item-focus ui-state-hover")}),r[u].parentOptGroup?(e=t.widgetBaseClass+"-group-"+r[u].parentOptGroup,this.list.find("li."+e).size()?this.list.find("li."+e+":last ul").append(f):n('<li role="presentation" class="'+t.widgetBaseClass+"-group "+e+'"><span class="'+t.widgetBaseClass+'-group-label">'+r[u].parentOptGroup+"<\/span><ul><\/ul><\/li>").appendTo(this.list).find("ul").append(f)):f.appendTo(this.list),this.list.bind("mousedown mouseup",function(){return!1}),i.icons)for(c in i.icons)f.is(i.icons[c].find)&&(f.data("optionClasses",r[u].classes+" "+t.widgetBaseClass+"-hasIcon").addClass(t.widgetBaseClass+"-hasIcon"),a=i.icons[c].icon||"",f.find("a:eq(0)").prepend('<span class="'+t.widgetBaseClass+"-item-icon ui-icon "+a+'"><\/span>'));this.list.find("li:last").addClass("ui-corner-bottom");i.style=="popup"&&this.list.find("li:first").addClass("ui-corner-top");i.transferClasses&&(v=this.element.attr("class")||"",this.newelement.add(this.list).addClass(v));o=this.element.width();this.newelement.width(i.width?i.width:o);i.style=="dropdown"?this.list.width(i.menuWidth?i.menuWidth:i.width?i.width:o):this.list.width(i.menuWidth?i.menuWidth:i.width?i.width-i.handleWidth:o-i.handleWidth);i.maxHeight&&i.maxHeight<this.list.height()&&this.list.height(i.maxHeight);this._optionLis=this.list.find("li:not(."+t.widgetBaseClass+"-group)");this.list.keydown(function(i){var r=!0;switch(i.keyCode){case n.ui.keyCode.UP:case n.ui.keyCode.LEFT:r=!1;t._moveFocus(-1);break;case n.ui.keyCode.DOWN:case n.ui.keyCode.RIGHT:r=!1;t._moveFocus(1);break;case n.ui.keyCode.HOME:r=!1;t._moveFocus(":first");break;case n.ui.keyCode.PAGE_UP:r=!1;t._scrollPage("up");break;case n.ui.keyCode.PAGE_DOWN:r=!1;t._scrollPage("down");break;case n.ui.keyCode.END:r=!1;t._moveFocus(":last");break;case n.ui.keyCode.ENTER:case n.ui.keyCode.SPACE:r=!1;t.close(i,!0);n(i.target).parents("li:eq(0)").trigger("mouseup");break;case n.ui.keyCode.TAB:r=!0;t.close(i,!0);break;case n.ui.keyCode.ESCAPE:r=!1;t.close(i,!0);break;default:r=!1;t._typeAhead(i.keyCode,"focus")}return r});i.style=="dropdown"?(this.newelement.addClass(t.widgetBaseClass+"-dropdown"),this.list.addClass(t.widgetBaseClass+"-menu-dropdown")):(this.newelement.addClass(t.widgetBaseClass+"-popup"),this.list.addClass(t.widgetBaseClass+"-menu-popup"));this.newelement.prepend('<span class="'+t.widgetBaseClass+'-status">'+r[this._selectedIndex()].text+"<\/span>");this.element.hide();this.element.attr("disabled")==!0&&this.disable();this.value(this._selectedIndex())},destroy:function(){this.element.removeData(this.widgetName).removeClass(this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").removeAttr("aria-disabled");n("label[for="+this.newelement.attr("id")+"]").attr("for",this.element.attr("id")).unbind("click");this.newelement.remove();this.list.remove();this.element.show()},_typeAhead:function(t,i){function e(t,u){f=!0;n(t).trigger(i);r._prevChar[1]=u}var r=this,u,f;r._prevChar||(r._prevChar=["",0]);u=String.fromCharCode(t);c=u.toLowerCase();f=!1;this.list.find("li a").each(function(t){if(!f){var i=n(this).text();(i.indexOf(u)==0||i.indexOf(c)==0)&&(r._prevChar[0]==u?r._prevChar[1]<t&&e(this,t):e(this,t))}});this._prevChar[0]=u},_uiHash:function(){return{value:this.value()}},open:function(n){var t=this,i=this.newelement.attr("aria-disabled");i!="true"&&(this._refreshPosition(),this._closeOthers(n),this.newelement.addClass("ui-state-active"),this.list.appendTo("body").addClass(t.widgetBaseClass+"-open").attr("aria-hidden",!1).find("li:not(."+t.widgetBaseClass+"-group):eq("+this._selectedIndex()+") a")[0].focus(),this.options.style=="dropdown"&&this.newelement.removeClass("ui-corner-all").addClass("ui-corner-top"),this._refreshPosition(),this._trigger("open",n,this._uiHash()))},close:function(n,t){this.newelement.is(".ui-state-active")&&(this.newelement.removeClass("ui-state-active"),this.list.attr("aria-hidden",!0).removeClass(this.widgetBaseClass+"-open"),this.options.style=="dropdown"&&this.newelement.removeClass("ui-corner-top").addClass("ui-corner-all"),t&&this.newelement[0].focus(),this._trigger("close",n,this._uiHash()))},change:function(n){this.element.trigger("change");this._trigger("change",n,this._uiHash())},select:function(n){this._trigger("select",n,this._uiHash())},_closeOthers:function(t){n("."+this.widgetBaseClass+".ui-state-active").not(this.newelement).each(function(){n(this).data("selectelement").selectmenu("close",t)});n("."+this.widgetBaseClass+".ui-state-hover").trigger("mouseout")},_toggle:function(n,t){this.list.is("."+this.widgetBaseClass+"-open")?this.close(n,t):this.open(n)},_formatText:function(n){return this.options.format?this.options.format(n):n},_selectedIndex:function(){return this.element[0].selectedIndex},_selectedOptionLi:function(){return this._optionLis.eq(this._selectedIndex())},_focusedOptionLi:function(){return this.list.find("."+this.widgetBaseClass+"-item-focus")},_moveSelection:function(n){var t=parseInt(this._selectedOptionLi().data("index"),10),i=t+n;return this._optionLis.eq(i).trigger("mouseup")},_moveFocus:function(n){var r,t,i;isNaN(n)?t=parseInt(this._optionLis.filter(n).data("index"),10):(r=parseInt(this._focusedOptionLi().data("index"),10),t=r+n);t<0&&(t=0);t>this._optionLis.size()-1&&(t=this._optionLis.size()-1);i=this.widgetBaseClass+"-item-"+Math.round(Math.random()*1e3);this._focusedOptionLi().find("a:eq(0)").attr("id","");this._optionLis.eq(t).find("a:eq(0)").attr("id",i)[0].focus();this.list.attr("aria-activedescendant",i)},_scrollPage:function(n){var t=Math.floor(this.list.outerHeight()/this.list.find("li:first").outerHeight());t=n=="up"?-t:t;this._moveFocus(t)},_setData:function(n,t){this.options[n]=t;n=="disabled"&&(this.close(),this.element.add(this.newelement).add(this.list)[t?"addClass":"removeClass"](this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").attr("aria-disabled",t))},value:function(n){return arguments.length&&(this.element[0].selectedIndex=n,this._refreshValue(),this._refreshPosition()),this.element[0].selectedIndex},_refreshValue:function(){var t=this.options.style=="popup"?" ui-state-active":"",i=this.widgetBaseClass+"-item-"+Math.round(Math.random()*1e3),r,n;this.list.find("."+this.widgetBaseClass+"-item-selected").removeClass(this.widgetBaseClass+"-item-selected"+t).find("a").attr("aria-selected","false").attr("id","");this._selectedOptionLi().addClass(this.widgetBaseClass+"-item-selected"+t).find("a").attr("aria-selected","true").attr("id",i);r=this.newelement.data("optionClasses")?this.newelement.data("optionClasses"):"";n=this._selectedOptionLi().data("optionClasses")?this._selectedOptionLi().data("optionClasses"):"";this.newelement.removeClass(r).data("optionClasses",n).addClass(n).find("."+this.widgetBaseClass+"-status").html(this._selectedOptionLi().find("a:eq(0)").html());this.list.attr("aria-activedescendant",i)},_refreshPosition:function(){this.list.css("left",this.newelement.offset().left);var t=this.newelement.offset().top,i=this.list[0].scrollTop;this.list.find("li:lt("+this._selectedIndex()+")").each(function(){i-=n(this).outerHeight()});this.newelement.is("."+this.widgetBaseClass+"-popup")?(t+=i,this.list.css("top",t)):(t+=this.newelement.height(),this.list.css("top",t))}});n.extend(n.ui.selectmenu,{getter:"value",version:"@VERSION",eventPrefix:"selectmenu",defaults:{transferClasses:!0,style:"popup",width:null,menuWidth:null,handleWidth:26,maxHeight:null,icons:null,format:null}})})(jQuery)