import dom from"./../dom.js";import layoutManager from"./../layoutmanager.js";import inputManager from"./../common/inputmanager.js";import events from"./../emby-apiclient/events.js";import MethodTimer from"./../common/methodtimer.js";import focusManager from"./../focusmanager.js";import appRouter from"./../approuter.js";let _styleElement;function loadCss(){let linkUrl=appRouter.baseUrl()+"/modules/input/mouse.css";globalThis.urlCacheParam&&(linkUrl+="?"+globalThis.urlCacheParam);var link=document.createElement("link");link.setAttribute("rel","stylesheet"),link.setAttribute("type","text/css"),link.setAttribute("href",linkUrl),_styleElement=link,document.head.appendChild(link)}let mouseManager={},lastMouseInputTime=0,isMouseIdle;function mouseIdleTime(){return Date.now()-lastMouseInputTime}let TopElement=document.body;function removeIdleClasses(){isMouseIdle=!1,TopElement.classList.remove("mouseIdle","mouseIdle-tv")}function addIdleClasses(){isMouseIdle=!0;var classList=TopElement.classList;layoutManager.tv?classList.add("mouseIdle","mouseIdle-tv"):classList.add("mouseIdle")}let lastPointerMoveData;function onPointerMove(e){var obj,eventX=e.screenX,e=e.screenY;void 0===eventX&&void 0===e||((obj=lastPointerMoveData)?Math.abs(eventX-obj.x)<10&&Math.abs(e-obj.y)<10||(obj.x=eventX,obj.y=e,lastMouseInputTime=Date.now(),isMouseIdle&&removeIdleClasses()):lastPointerMoveData={x:eventX,y:e})}let SupportsTouchEvent="ontouchstart"in document.documentElement,SupportsPointerType="undefined"!=typeof PointerEvent&&"pointerType"in PointerEvent.prototype,DefaultPointerType=SupportsPointerType?null:SupportsTouchEvent?"touch":"mouse";function onPointerEnter(e){"mouse"!==(e.pointerType||DefaultPointerType)||isMouseIdle||(e=e.target).closest&&!e.closest(".nohoverfocus")&&(e=focusManager.focusableParent(e,!1))&&focusManager.focus(e)}function enableFocusWithMouse(){return layoutManager.tv,!1}function onMouseInterval(){!isMouseIdle&&5e3<=mouseIdleTime()&&addIdleClasses()}let mouseInterval;function startMouseInterval(){mouseInterval=mouseInterval||new MethodTimer({onInterval:onMouseInterval,timeoutMs:5e3,type:"interval"})}function stopMouseInterval(){var interval=mouseInterval;interval&&(interval.destroy(),mouseInterval=null)}function stopMouseListening(){_styleElement.remove(),stopMouseInterval(),removeIdleClasses(),dom.removeEventListener(document,"pointermove",onPointerMove,{passive:!0}),dom.removeEventListener(document,"mousemove",onPointerMove,{passive:!0})}function startMouseListening(){document.head.appendChild(_styleElement),(layoutManager.tv?addIdleClasses:removeIdleClasses)(),startMouseInterval(),window.PointerEvent?dom.addEventListener(document,"pointermove",onPointerMove,{passive:!0}):dom.addEventListener(document,"mousemove",onPointerMove,{passive:!0})}let listeners=[];function requestMouseListening(listener){listeners.includes(listener)||(0===listeners.length&&startMouseListening(),listeners.push(listener))}function releaseMouseListening(listener){listener=listeners.indexOf(listener);-1!==listener&&listeners.splice(listener,1),listeners.length||stopMouseListening()}function initMouse(){loadCss(),(layoutManager.tv?requestMouseListening:releaseMouseListening)("tv"),dom.removeEventListener(document,window.PointerEvent?"pointerenter":"mouseenter",onPointerEnter,{capture:!0,passive:!0}),enableFocusWithMouse()&&dom.addEventListener(document,window.PointerEvent?"pointerenter":"mouseenter",onPointerEnter,{capture:!0,passive:!0})}function sendCommandFromEvent(name,e){inputManager.trigger(name,{sourceElement:e.target,originalEvent:e})}window.addEventListener("mouseup",function(e){switch(e.button){case 3:e.stopPropagation(),e.preventDefault(),sendCommandFromEvent("back",e);break;case 4:e.stopPropagation(),e.preventDefault(),sendCommandFromEvent("forward",e)}}),initMouse(),mouseManager.requestMouseListening=requestMouseListening,mouseManager.releaseMouseListening=releaseMouseListening,mouseManager.lastMouseInputTime=function(){return lastMouseInputTime},events.on(layoutManager,"modechange",initMouse);export default mouseManager;