var MenubarItem=function(domNode,menuObj){this.menubar=menuObj;this.domNode=domNode;this.popupMenu=false;this.hasFocus=false;this.hasHover=false;this.isMenubarItem=true;this.keyCode=Object.freeze({'TAB':9,'RETURN':13,'ESC':27,'SPACE':32,'PAGEUP':33,'PAGEDOWN':34,'END':35,'HOME':36,'LEFT':37,'UP':38,'RIGHT':39,'DOWN':40});};MenubarItem.prototype.init=function(){this.domNode.tabIndex=-1;this.domNode.setAttribute('role','menuitem');if(this.domNode.parentNode.tagName==='LI'){this.domNode.parentNode.setAttribute('role','none');}this.domNode.addEventListener('keydown',this.handleKeydown.bind(this));this.domNode.addEventListener('click',this.handleClick.bind(this));this.domNode.addEventListener('focus',this.handleFocus.bind(this));this.domNode.addEventListener('blur',this.handleBlur.bind(this));this.domNode.addEventListener('mouseover',this.handleMouseover.bind(this));this.domNode.addEventListener('mouseout',this.handleMouseout.bind(this));var nextElement=this.domNode.nextElementSibling;if(nextElement&&nextElement.tagName==='UL'){this.domNode.setAttribute('aria-haspopup','true');this.domNode.setAttribute('aria-expanded','false');this.popupMenu=new PopupMenu(nextElement,this);this.popupMenu.init();}};MenubarItem.prototype.handleKeydown=function(event){var tgt=event.currentTarget,char=event.key,flag=false,clickEvent;function isPrintableCharacter(str){return str.length===1&&str.match(/\S/);}switch(event.keyCode){case this.keyCode.RETURN:if(this.domNode.getAttribute('href')!='#'){return}case this.keyCode.SPACE:case this.keyCode.DOWN:if(this.popupMenu){this.popupMenu.open();this.popupMenu.setFocusToFirstItem();flag=true;}break;case this.keyCode.LEFT:this.menubar.setFocusToPreviousItem(this);flag=true;break;case this.keyCode.RIGHT:this.menubar.setFocusToNextItem(this);flag=true;break;case this.keyCode.UP:if(this.popupMenu){this.popupMenu.open();this.popupMenu.setFocusToLastItem();flag=true;}break;case this.keyCode.HOME:case this.keyCode.PAGEUP:this.menubar.setFocusToFirstItem();flag=true;break;case this.keyCode.END:case this.keyCode.PAGEDOWN:this.menubar.setFocusToLastItem();flag=true;break;default:if(isPrintableCharacter(char)){this.menubar.setFocusByFirstCharacter(this,char);flag=true;}break;}if(flag){event.stopPropagation();event.preventDefault();}};MenubarItem.prototype.handleClick=function(event){};MenubarItem.prototype.handleFocus=function(event){this.menubar.hasFocus=true;};MenubarItem.prototype.handleBlur=function(event){this.menubar.hasFocus=false;};MenubarItem.prototype.handleMouseover=function(event){this.hasHover=true;if(this.domNode.getAttribute('aria-haspopup')=='true'){this.popupMenu.open();}};MenubarItem.prototype.handleMouseout=function(event){this.hasHover=false;if(this.domNode.getAttribute('aria-haspopup')=='true'){setTimeout(this.popupMenu.close.bind(this.popupMenu,false),300);}};;var Menubar=function(domNode){var elementChildren,msgPrefix='Menubar constructor argument menubarNode ';if(!domNode instanceof Element){throw new TypeError(msgPrefix+'is not a DOM Element.');}if(domNode.childElementCount===0){throw new Error(msgPrefix+'has no element children.');}e=domNode.firstElementChild;while(e){var menubarItem=e.firstElementChild;if(e&&menubarItem&&menubarItem.tagName!=='A'){throw new Error(msgPrefix+'has child elements are not A elements.');}e=e.nextElementSibling;}this.domNode=domNode;this.menubarItems=[];this.firstChars=[];this.firstItem=null;this.lastItem=null;this.hasFocus=false;this.hasHover=false;};Menubar.prototype.init=function(){var menubarItem,childElement,menuElement,textContent,numItems;this.domNode.setAttribute('role','menubar');elem=this.domNode.firstElementChild;while(elem){var menuElement=elem.firstElementChild;if(elem&&menuElement&&menuElement.tagName==='A'){menubarItem=new MenubarItem(menuElement,this);menubarItem.init();this.menubarItems.push(menubarItem);textContent=menuElement.textContent.trim();this.firstChars.push(textContent.substring(0,1).toLowerCase());}elem=elem.nextElementSibling;}numItems=this.menubarItems.length;if(numItems>0){this.firstItem=this.menubarItems[ 0 ];this.lastItem=this.menubarItems[ numItems-1 ];}this.firstItem.domNode.tabIndex=0;};Menubar.prototype.setFocusToItem=function(newItem){var flag=false;for(var i=0;i-1){this.setFocusToItem(this.menubarItems[ index ]);}};Menubar.prototype.getIndexFirstChars=function(startIndex,char){for(var i=startIndex;i0){this.firstItem=this.menuitems[ 0 ];this.lastItem=this.menuitems[ numItems-1 ];}};PopupMenu.prototype.handleMouseover=function(event){this.hasHover=true;};PopupMenu.prototype.handleMouseout=function(event){this.hasHover=false;setTimeout(this.close.bind(this,false),1);};PopupMenu.prototype.setFocusToController=function(command,flag){if(typeof command!=='string'){command='';}if(this.controller.close){this.popupMenuItem.domNode.focus();this.close();if(command==='next'){this.controller.hasFocus=false;this.controller.close();this.controller.controller.menubar.setFocusToNextItem(this.controller.controller,flag);}}else{if(command==='previous'){this.controller.menubar.setFocusToPreviousItem(this.controller,flag);}else if(command==='next'){this.controller.menubar.setFocusToNextItem(this.controller,flag);}else{this.controller.domNode.focus();}}};PopupMenu.prototype.setFocusToFirstItem=function(){this.firstItem.domNode.focus();};PopupMenu.prototype.setFocusToLastItem=function(){this.lastItem.domNode.focus();};PopupMenu.prototype.setFocusToPreviousItem=function(currentItem){var index;if(currentItem===this.firstItem){this.lastItem.domNode.focus();}else{index=this.menuitems.indexOf(currentItem);this.menuitems[ index-1 ].domNode.focus();}};PopupMenu.prototype.setFocusToNextItem=function(currentItem){var index;if(currentItem===this.lastItem){this.firstItem.domNode.focus();}else{index=this.menuitems.indexOf(currentItem);this.menuitems[ index+1 ].domNode.focus();}};PopupMenu.prototype.setFocusByFirstCharacter=function(currentItem,char){var start,index,char=char.toLowerCase();start=this.menuitems.indexOf(currentItem)+1;if(start===this.menuitems.length){start=0;}index=this.getIndexFirstChars(start,char);if(index===-1){index=this.getIndexFirstChars(0,char);}if(index>-1){this.menuitems[ index ].domNode.focus();}};PopupMenu.prototype.getIndexFirstChars=function(startIndex,char){for(var i=startIndex;i