define(["dom"],function(dom){"use strict";functionpushScope(elem){scopes.push(elem)}functionpopScope(elem){scopes.length&&(scopes.length-=1)}functionautoFocus(view,defaultToFirst,findAutoFocusElement){varelement;returnfindAutoFocusElement!==!1&&(element=view.querySelector("*[autofocus]"))?(focus(element),element):defaultToFirst!==!1&&(element=getFocusableElements(view,1)[0])?(focus(element),element):null}functionfocus(element){try{element.focus()}catch(err){console.log("Error in focusManager.autoFocus: "+err)}}functionisFocusable(elem){returnfocusableTagNames.indexOf(elem.tagName)!==-1||!(!elem.classList||!elem.classList.contains("focusable"))}functionfocusableParent(elem){for(;!isFocusable(elem);)if(elem=elem.parentNode,!elem)returnnull;returnelem}functionisCurrentlyFocusableInternal(elem){returnnull!==elem.offsetParent}functionisCurrentlyFocusable(elem){if(elem.disabled)return!1;if("-1"===elem.getAttribute("tabindex"))return!1;if("INPUT"===elem.tagName){vartype=elem.type;if("range"===type)return!1}returnisCurrentlyFocusableInternal(elem)}functiongetDefaultScope(){returnscopes[0]||document.body}functiongetFocusableElements(parent,limit){for(varelems=(parent||getDefaultScope()).querySelectorAll(focusableQuery),focusableElements=[],i=0,length=elems.length;i<length;i++){varelem=elems[i];if(isCurrentlyFocusableInternal(elem)&&(focusableElements.push(elem),limit&&focusableElements.length>=limit))break}returnfocusableElements}functionisFocusContainer(elem,direction){if(focusableContainerTagNames.indexOf(elem.tagName)!==-1)return!0;if(elem.classList.contains("focuscontainer"))return!0;if(direction<2){if(elem.classList.contains("focuscontainer-x"))return!0}elseif(3===direction&&elem.classList.contains("focuscontainer-down"))return!0;return!1}functiongetFocusContainer(elem,direction){for(;!isFocusContainer(elem,direction);)if(elem=elem.parentNode,!elem)returngetDefaultScope();returnelem}functiongetOffset(elem){varbox;returnbox=elem.getBoundingClientRect?elem.getBoundingClientRect():{top:0,left:0,width:0,height:0},{top:box.top,left:box.left,width:box.width,height:box.height}}functiongetViewportBoundingClientRect(elem){varoffset=getOffset(elem);returnoffset.right=offset.left+offset.width,offset.bottom=offset.top+offset.height,offset}functionnav(activeElement,direction){activeElement=activeElement||document.activeElement,activeElement&&(activeElement=focusableParent(activeElement));varcontainer=activeElement?getFocusContainer(activeElement,direction):getDefaultScope();if(!activeElement)returnvoidautoFocus(container,!0,!1);for(varfocusableContainer=dom.parentWithClass(activeElement,"focusable"),rect=getViewportBoundingClientRect(activeElement),focusableElements=[],focusable=container.querySelectorAll(focusableQuery),i=0,length=focusable.length;i<length;i++){varcurr=focusable[i];if(curr!==activeElement&&curr!==focusableContainer){varelementRect=getViewportBoundingClientRect(curr);if(elementRect.width||elementRect.height){switch(direction){case0:if(elementRect.left>=rect.left)continue;if(elementRect.right===rect.right)continue;break;case1:if(elementRect.right<=rect.right)continue;if(elementRect.left===rect.left)continue;break;case2:if(elementRect.top>=rect.top)continue;if(elementRect.bottom>=rect.bottom)continue;break;case3:if(elementRect.bottom<=rect.bottom)continue;if(elementRect.top<=rect.top)continue}focusableElements.push({element:curr,clientRect:elementRect})}}}varnearest=getNearestElements(focusableElements,rect,direction);if(nearest.length){varnearestElement=nearest[0].node;if(activeElement){varnearestElementFocusableParent=dom.parentWithClass(nearestElement,"focusable");nearestElementFocusableParent&&nearestElementFocusableParent!==nearestElement&&focusableContainer!==nearestElementFocusableParent&&(nearestElement=nearestElementFocusableParent)}focus(nearestElement)}}functionintersectsInternal(a1,a2,b1,b2){returnb1>=a1&&b1<=a2||b2>=a1&&b2<=a2}functionintersects(a1,a2,b1,b2){returnintersectsInternal(a1,a2,b1,b2)||intersectsInternal(b1,b2,a1,a2)}functiongetNearestElements(ele