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