barkoder-wasm-ocr
Version:
Barkoder Barcode Scanner SDK for the Web
106 lines • 258 kB
JavaScript
(async function(name,context,definition){window.has_SIMD=WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11]));if(typeof window!=='undefined'&&typeof define=='function'&&define.amd){define(definition)}
if(typeof module!=='undefined'&&module.exports){module.exports=definition()}else{context[name]=await definition()}})('BarkoderSDK',this,function(){class DOM_elements{static container=document.getElementById('barkoder-container');static cameraPreview=document.createElement('div');static preview=document.createElement('video');static overlay=document.createElement('canvas');static readyToUse_RO=false;static resizeObserver=new ResizeObserver(()=>{if(DOM_elements.readyToUse_RO)
{Bridge.resizeHandler();}});static flash=document.createElement('div');static zoom=document.createElement('div');static close=document.createElement('div');static cameraPicker=document.createElement('div');static cameraPickerUI=document.createElement('div');static cameraPickerUI_style=document.createElement('style');static buttonsProperties={flash_icons:['data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyNy45LjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iYnRuLWZsYXNoLW9mZiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4Ig0KCSB5PSIwcHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDggNDg7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoJLnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiNGRjMzNDc7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO30NCgkuc3Qxe2ZpbGw6I0ZGRkZGRjt9DQo8L3N0eWxlPg0KPGcgaWQ9ImJ0bl9iZyI+DQoJPHBhdGggY2xhc3M9InN0MCIgZD0iTTgsMWgzMmMzLjksMCw3LDMuMSw3LDd2MzJjMCwzLjktMy4xLDctNyw3SDhjLTMuOSwwLTctMy4xLTctN1Y4QzEsNC4xLDQuMSwxLDgsMXoiLz4NCjwvZz4NCjxwYXRoIGlkPSJQYXRoXzMxIiBjbGFzcz0ic3QxIiBkPSJNMTgsMTFoMTNsLTQuNSw5SDMxbC05LjEsMTYuOFYyNi41SDE4VjExeiBNMjAuNiwxMy41djEwLjRoMy45djMuNWwyLjYtNC43aC00LjlsNC42LTkuMQ0KCUwyMC42LDEzLjV6Ii8+DQo8L3N2Zz4NCg==','data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyNy45LjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iYnRuLWZsYXNoLW9uIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiDQoJIHk9IjBweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA0OCA0ODsiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCgkuc3Qwe2ZpbGw6I0ZGMzM0Qzt9DQoJLnN0MXtmaWxsOiNGRkZGRkY7fQ0KPC9zdHlsZT4NCjxnIGlkPSJidG5fYmciPg0KCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik04LDBoMzJjNC40LDAsOCwzLjYsOCw4djMyYzAsNC40LTMuNiw4LTgsOEg4Yy00LjQsMC04LTMuNi04LThWOEMwLDMuNiwzLjYsMCw4LDB6Ii8+DQo8L2c+DQo8cGF0aCBpZD0iUGF0aF8zNCIgY2xhc3M9InN0MSIgZD0iTTE4LDExdjE0LjJoMy45djExLjZMMzEsMjEuM2gtNS4yTDMxLDExSDE4eiIvPg0KPC9zdmc+DQo='],zoom_icons:['data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyNy45LjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iYnRuLXpvb20tb24iIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCINCgkgeT0iMHB4IiB2aWV3Qm94PSIwIDAgNDggNDgiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQ4IDQ4OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojRkYzMzQ3O3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lam9pbjpyb3VuZDt9DQoJLnN0MXtmaWxsOiNGRkZGRkY7fQ0KPC9zdHlsZT4NCjxnIGlkPSJidG5fYmciPg0KCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik04LDFoMzJjMy45LDAsNywzLjEsNyw3djMyYzAsMy45LTMuMSw3LTcsN0g4Yy0zLjksMC03LTMuMS03LTdWOEMxLDQuMSw0LjEsMSw4LDF6Ii8+DQo8L2c+DQo8cGF0aCBpZD0iQ29sb3JfT3ZlcmxheSIgY2xhc3M9InN0MSIgZD0iTTMzLjYsMzUuNmwtNC41LTQuNWMtNC43LDMuNi0xMS4zLDIuNy0xNC45LTJzLTIuNy0xMS4zLDItMTQuOXMxMS4zLTIuNywxNC45LDINCgljMi45LDMuOCwyLjksOS4xLDAsMTIuOWw0LjUsNC41YzAuNSwwLjYsMC41LDEuNS0wLjEsMlMzNC4xLDM2LjEsMzMuNiwzNS42TDMzLjYsMzUuNnogTTE0LjgsMjIuNmMwLDQuMywzLjUsNy44LDcuOCw3LjgNCglzNy44LTMuNSw3LjgtNy44cy0zLjUtNy44LTcuOC03LjhDMTguMywxNC44LDE0LjgsMTguMywxNC44LDIyLjZ6IE0yMS42LDI3LjRjLTAuMy0wLjMtMC40LTAuNi0wLjQtMVYyNGgtMi40DQoJYy0wLjgsMC0xLjQtMC42LTEuNC0xLjRzMC42LTEuNCwxLjQtMS40bDAsMGgyLjR2LTIuNGMwLTAuOCwwLjYtMS40LDEuNC0xLjVTMjQsMTgsMjQsMTguOHYwLjF2Mi40aDIuNGMwLjgsMCwxLjQsMC42LDEuNCwxLjQNCglzLTAuNiwxLjQtMS40LDEuNGwwLDBIMjR2Mi40YzAsMC44LTAuNiwxLjQtMS40LDEuNEMyMi4yLDI3LjgsMjEuOSwyNy43LDIxLjYsMjcuNEwyMS42LDI3LjR6Ii8+DQo8L3N2Zz4NCg==','data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyNy45LjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iYnRuLXpvb20tb2ZmIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiDQoJIHk9IjBweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA0OCA0ODsiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCgkuc3Qwe2ZpbGw6I0ZGMzM0Nzt9DQoJLnN0MXtmaWxsOiNGRkZGRkY7fQ0KPC9zdHlsZT4NCjxnIGlkPSJidG5fYmciPg0KCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik04LDBoMzJjNC40LDAsOCwzLjYsOCw4djMyYzAsNC40LTMuNiw4LTgsOEg4Yy00LjQsMC04LTMuNi04LThWOEMwLDMuNiwzLjYsMCw4LDB6Ii8+DQo8L2c+DQo8cGF0aCBpZD0iQ29sb3JfT3ZlcmxheSIgY2xhc3M9InN0MSIgZD0iTTMzLjYsMzUuNmwtNC41LTQuNWMtNC43LDMuNi0xMS4zLDIuNy0xNC45LTJzLTIuNy0xMS4zLDItMTQuOXMxMS4zLTIuNywxNC45LDINCgljMi45LDMuOCwyLjksOS4xLDAsMTIuOWw0LjUsNC41YzAuNiwwLjUsMC42LDEuNCwwLjEsMmMtMC41LDAuNi0xLjQsMC42LTIsMC4xQzMzLjYsMzUuNywzMy42LDM1LjYsMzMuNiwzNS42TDMzLjYsMzUuNnoNCgkgTTE0LjgsMjIuNmMwLDQuMywzLjUsNy44LDcuOCw3LjhzNy44LTMuNSw3LjgtNy44cy0zLjUtNy44LTcuOC03LjhDMTguMywxNC44LDE0LjgsMTguMywxNC44LDIyLjZ6IE0xOC44LDI0DQoJYy0wLjgsMC0xLjQtMC42LTEuNC0xLjRjMC0wLjgsMC42LTEuNCwxLjQtMS40YzAsMCwwLDAsMCwwaDcuNmMwLjgsMCwxLjQsMC42LDEuNCwxLjRjMCwwLjgtMC42LDEuNC0xLjQsMS40YzAsMCwwLDAsMCwwSDE4Ljh6Ii8+DQo8L3N2Zz4NCg=='],close_icons:['data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyNy45LjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iYnRuLWNsb3NlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgdmlld0JveD0iMCAwIDI0IDI0IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyNCAyNDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCgkuc3Qwe2ZpbGw6I0ZGRkZGRjt9DQoJLnN0MXtmaWxsOm5vbmU7fQ0KPC9zdHlsZT4NCjxwYXRoIGlkPSJQYXRoXzMwIiBjbGFzcz0ic3QwIiBkPSJNMjIsNGwtMi0ybC04LDhMNCwyTDIsNGw4LDhsLTgsOGwyLDJsOC04bDgsOGwyLTJsLTgtOEwyMiw0eiIvPg0KPHJlY3QgaWQ9IlJlY3RhbmdsZV8zOCIgeT0iMCIgY2xhc3M9InN0MSIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0Ii8+DQo8L3N2Zz4NCg=='],cameraPicker_icons:['data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+CiAgPGRlZnM+CiAgICA8c3R5bGU+CiAgICAgIC5jbHMtMSwgLmNscy0yIHsKICAgICAgICBmaWxsOiAjRkZGRkZGOwogICAgICAgIHN0cm9rZS13aWR0aDogMHB4OwogICAgICB9CgogICAgICAuY2xzLTIgewogICAgICAgIGZpbGwtcnVsZTogZXZlbm9kZDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L2RlZnM+CiAgPHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTUsMjIuNzVoLTZjLTUuNDMsMC03Ljc1LTIuMzItNy43NS03Ljc1di02QzEuMjUsMy41NywzLjU3LDEuMjUsOSwxLjI1aDZjNS40MywwLDcuNzUsMi4zMiw3Ljc1LDcuNzV2NmMwLDUuNDMtMi4zMiw3Ljc1LTcuNzUsNy43NVpNOSwyLjc1Yy00LjYxLDAtNi4yNSwxLjY0LTYuMjUsNi4yNXY2YzAsNC42MSwxLjY0LDYuMjUsNi4yNSw2LjI1aDZjNC42MSwwLDYuMjUtMS42NCw2LjI1LTYuMjV2LTZjMC00LjYxLTEuNjQtNi4yNS02LjI1LTYuMjVoLTZaIi8+CiAgPHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTgsNi41Yy0uMTMsMC0uMjYtLjAzLS4zOC0uMDgtLjEyLS4wNS0uMjMtLjEyLS4zMy0uMjEtLjA5LS4xLS4xNy0uMjEtLjIyLS4zMy0uMDUtLjEyLS4wNy0uMjUtLjA3LS4zOHMuMDItLjI2LjA3LS4zOGMuMDYtLjEzLjEzLS4yMy4yMi0uMzMuMDUtLjA0LjEtLjA5LjE1LS4xMi4wNi0uMDQuMTItLjA3LjE4LS4wOS4wNi0uMDMuMTItLjA1LjE5LS4wNi4zMi0uMDcuNjYuMDQuOS4yNy4wOS4xLjE2LjIuMjEuMzMuMDUuMTIuMDguMjUuMDguMzhzLS4wMy4yNi0uMDguMzgtLjEyLjIzLS4yMS4zM2MtLjEuMDktLjIxLjE2LS4zMy4yMS0uMTIuMDUtLjI1LjA4LS4zOC4wOFoiLz4KICA8cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Im0xNS4wNSwxMC4yN2MtLjc1LTEtMS43NC0xLjc0LTMuMy0xLjc4LTEuODEsMC0zLjI1LDEuNDUtMy4yNSwzLjI1LDAsLjQxLS4zNC43NS0uNzUuNzVzLS43NS0uMzQtLjc1LS43NWMwLTQuMjQsNC45Ny02LjEsOC0zLjY1LS4xMi0xLjA2LDEuNDYtMS4yLDEuNS0uMTN2MmMuMDIuNy0uOTEsMS0xLjMyLjQ5bC0uMTMtLjE4Wm0tNi4xOSwzLjljMS44MSwyLjk0LDUuOTQsMi4xNSw2LjE0LTEuNDMsMC0uNDEuMzQtLjc1Ljc1LS43NXMuNzUuMzQuNzUuNzVjLjA4LDMuODYtNC42OSw2LjIyLTcuNTYsMy43LjA3LDEuMDMtMS40NywxLjExLTEuNS4wN3YtMmMtLjAyLS43Mi45OC0xLjAyLDEuMzYtLjQzbC4wNS4wOGgwWiIvPgo8L3N2Zz4='],showFlash:true,showZoom:true,showClose:true,showCameraPicker:true};static previewProperties={x:0,y:0,width:100,height:100,orientation:0};static initialized=false;static initialized_dom=false;static cameraPreview_init(){this.cameraPreview.id="cameraPreview";this.cameraPreview.className="cameraPreview-div";this.cameraPreview.style.position="relative";this.cameraPreview.style.margin="0";this.cameraPreview.style.padding="0";this.cameraPreview.style.outline="0";this.cameraPreview.style.fontSize="100%";this.cameraPreview.style.verticalAlign="baseline";this.cameraPreview.style.background="0 0 black";this.cameraPreview.style.left=""+this.previewProperties.x+"%";this.cameraPreview.style.top=""+this.previewProperties.y+"%";this.cameraPreview.style.width=""+this.previewProperties.width+"%";this.cameraPreview.style.height=""+this.previewProperties.height+"%";this.cameraPreview.style.overflow="hidden";this.cameraPreview.style.zIndex="9999999";this.preview.id="preview";this.preview.className="cameraPreview-video";this.preview.playsInline=true;this.overlay.id="overlay";this.overlay.className="cameraPreview-canvas";this.overlay.style.position="relative";this.overlay.style.top="0%";this.overlay.style.left="0px";this.overlay.style.backgroundColor="transparent";this.overlay.style.zIndex="99999999";};static flash_init(handler){this.flash.id="flash-button";if(!this.buttonsProperties.showFlash)this.flash.style.display="none";var img=document.createElement('img');img.src=this.buttonsProperties.flash_icons[0];this.flash.appendChild(img);this.flash.style.position="absolute";this.flash.style.cssFloat="none";this.flash.style.top="2px";this.flash.style.left="2px";this.flash.style.width="48px";this.flash.style.height="48px";this.flash.style.zIndex="999999999";this.flash.addEventListener('click',handler,false);};static zoom_init(handler){this.zoom.id="zoom-button";if(!this.buttonsProperties.showZoom)this.zoom.style.display="none";var img=document.createElement('img');img.src=this.buttonsProperties.zoom_icons[0];this.zoom.appendChild(img);this.zoom.style.position="absolute";this.zoom.style.cssFloat="none";this.zoom.style.top="2px";this.zoom.style.right="2px";this.zoom.style.width="48px";this.zoom.style.height="48px";this.zoom.style.zIndex="999999999";this.zoom.addEventListener('click',handler,false);};static close_init(handler){this.close.id="close-button";if(!this.buttonsProperties.showClose)this.close.style.display="none";var img=document.createElement('img');img.src=this.buttonsProperties.close_icons[0];this.close.appendChild(img);this.close.style.position="absolute";this.close.style.cssFloat="none";this.close.style.right="2px";this.close.style.width="24px";this.close.style.height="24px";this.close.style.zIndex="999999999";this.close.addEventListener('click',handler,false);};static cameraPicker_init(handler){this.cameraPicker.id="cameraPicker-button";if(!this.buttonsProperties.showCameraPicker)this.cameraPicker.style.display="none";var img=document.createElement('img');img.src=this.buttonsProperties.cameraPicker_icons[0];this.cameraPicker.appendChild(img);this.cameraPicker.style.position="absolute";this.cameraPicker.style.cssFloat="none";this.cameraPicker.style.left="2px";this.cameraPicker.style.width="48px";this.cameraPicker.style.height="48px";this.cameraPicker.style.zIndex="999999999";this.cameraPicker.addEventListener('click',handler,false);};static cameraPickerUI_init(handler){this.cameraPickerUI.id="cameraPickerUI";this.cameraPickerUI_style.id="cameraPickerUI_style";this.cameraPickerUI.style.position="absolute";this.cameraPickerUI.style.cssFloat="none";this.cameraPickerUI.style.top="20%";this.cameraPickerUI.style.left="20%";this.cameraPickerUI.style.width="60%";this.cameraPickerUI.style.maxWidth="90%";this.cameraPickerUI.style.background="transparent";this.cameraPickerUI.style.borderRadius="5px";this.cameraPickerUI.style.zIndex="999999999";};static cameraPickerUI_update(cameras,currentCameraID){let camerasCount=cameras.length;let input_elements=[];let label_elements=[];let elements_IDs=[];let desiredCameraLabels=["back","0","triple"];let tripleCameraPicked=false;for(let i=0;i<camerasCount;i++)
{let id=`c${i}`;elements_IDs.push(id);let input=document.createElement('input');input.id=id;input.name="rd";input.type="radio";input.style.display="none";input.dataset.value=cameras[i].id;input.dataset.label=cameras[i].label;input.onclick=JS_media.changeCamera;if(currentCameraID!=""){if(JS_media.hasTripleCamera){if((Decoder.startCounter==2)&&JS_media.highFocusDistance){let cameraLabel=cameras[i].label;if(cameraLabel.toLowerCase().includes(desiredCameraLabels[2].toLowerCase()))
{input.checked=true;JS_media.cameraId=cameras[i].id;tripleCameraPicked=true;JS_media.correct_zoom_on_ios=true;}}
if(!JS_media.highFocusDistance){if(cameras[i].id==currentCameraID){input.checked=true;}}}else{if(cameras[i].id==currentCameraID){input.checked=true;}}}
else{let cameraLabel=cameras[i].label;if(cameraLabel.toLowerCase().includes(desiredCameraLabels[2].toLowerCase()))
{JS_media.hasTripleCamera=true;}
if(cameraLabel.toLowerCase().includes(desiredCameraLabels[0].toLowerCase())){if(cameraLabel.toLowerCase().includes(desiredCameraLabels[1].toLowerCase())){input.checked=true;JS_media.cameraId=cameras[i].id;}
if(cameraLabel=="Back Camera"){input.checked=true;JS_media.cameraId=cameras[i].id;}}
if(!input.checked){let activeCamera=JS_media.initial_cameraId;if(typeof activeCamera=='string'){if(cameras[i].id==activeCamera)input.checked=true;}}}
input_elements.push(input);let label=document.createElement('label');label.setAttribute("for",id);label.className=`box ${id}`;label.style.background="rgba(255, 255, 255, 0.5)";label.style.marginTop="2px";label.style.padding="5px 12px";label.style.display="flex";label.style.borderRadius="5px";label.style.border="2px solid transparent";label.style.borderColor="rgba(0, 0, 0, 0.25)";label.style.cursor="pointer";label.style.transition="all 0.25s ease";let div=document.createElement('div');div.className="content";div.style.display="flex";div.style.width="100%";div.style.alignItems="center";let span=document.createElement('span');span.className="circle";span.style.height="6px";span.style.width="6px";span.style.background="#aaa";span.style.border="2px solid transparent";span.style.borderColor="rgba(0, 0, 0, 0.25)";span.style.display="inline-block";span.style.marginRight="15px";span.style.borderRadius="50%";span.style.transition="all 0.25s ease";let code=document.createElement('code');code.style.fontWeight="bold";code.style.fontSize="1.5vh";code.textContent=" "+cameras[i].label+" ";div.appendChild(span);div.appendChild(code);label.appendChild(div);label_elements.push(label);this.cameraPickerUI.appendChild(input);this.cameraPickerUI.appendChild(label);}
this.cameraPickerUI_css(elements_IDs);};static cameraPickerUI_css(elements_IDs){let elementsCount=elements_IDs.length;if(elementsCount==0)return;let checked_labels="";let checked_circles="";for(let i=0;i<elementsCount;i++)
{let id=elements_IDs[i];checked_labels+=`#cameraPickerUI #${id}:checked ~ label.${id}, `;checked_circles+=`#cameraPickerUI #${id}:checked ~ label.${id} .circle, `;}
checked_labels=checked_labels.slice(0,-2);checked_circles=checked_circles.slice(0,-2);checked_labels+=(" "+"{ border-color:Red !important; background:#D5D5D5 !important; }");checked_circles+=(" "+"{ border:2px solid !important; border-color:#333 !important; background:Red !important; }");let hovered_labels="#cameraPickerUI label.box:hover { background:#E5E5E5 !important; }";let complete_css=`${checked_labels} ${hovered_labels} ${checked_circles}`;if(this.cameraPickerUI_style.styleSheet){this.cameraPickerUI_style.styleSheet.cssText=complete_css;}else{this.cameraPickerUI_style.textContent=complete_css;}
document.head.appendChild(this.cameraPickerUI_style);};static hideElements(){this.cameraPreview.style.visibility="hidden";this.overlay.style.display="none";this.flash.style.display="none";this.zoom.style.display="none";this.close.style.display="none";this.cameraPicker.style.display="none";this.cameraPickerUI.style.display="none";};static showElements(){this.cameraPreview.style.visibility="visible";this.overlay.style.display="initial";this.flash.style.display=(JS_media.flash.supported)?((this.buttonsProperties.showFlash)?"initial":"none"):"none";this.zoom.style.display=(JS_media.zoom.supported)?((this.buttonsProperties.showZoom)?"initial":"none"):"none";this.close.style.display=(this.buttonsProperties.showClose)?"initial":"none";this.cameraPicker.style.display=(this.buttonsProperties.showCameraPicker)?"initial":"none";};static addPreview(){var container_exists=(this.container!=undefined&&this.container!=null&&typeof this.container==='object'&&this.container.tagName==='DIV');if(!container_exists)this.container=document.body;this.container.appendChild(this.cameraPreview);if(this.initialized_dom)return;this.cameraPreview.appendChild(this.preview);this.cameraPreview.appendChild(this.overlay);this.cameraPreview.appendChild(this.flash);this.cameraPreview.appendChild(this.zoom);this.cameraPreview.appendChild(this.close);this.cameraPreview.appendChild(this.cameraPicker);this.cameraPreview.appendChild(this.cameraPickerUI);this.initialized_dom=true;};static stopPreview(){let initial_s=JS_media.initial;let cameraScannerProperties=Decoder.cameraScanner;const active=cameraScannerProperties.runningState.active;if(!active)return 1;Decoder.cameraScanner.runningState.active=false;let scanner_timeout=JS_media.scanner_timeout;if(scanner_timeout!=null){clearTimeout(scanner_timeout);scanner_timeout=null;}
this.hideElements();document.head.removeChild(this.cameraPickerUI_style);this.cameraPickerUI.replaceChildren();if(Common.flashProxy.state)JS_media.applyFlash(true);if(Common.zoomProxy.level==1){JS_media.zoom.level=2;Common.zoomProxy.level=JS_media.zoom.level;JS_media.applyZoom();}
if(Common.zoomProxy.level==2){JS_media.applyZoom();}
if(this.preview.srcObject!=null)this.preview.play();if(JS_media.videoTrack!=null)JS_media.videoTrack.stop();DOM_elements.readyToUse_RO=false;DOM_elements.resizeObserver.disconnect();window.removeEventListener('visibilitychange',Bridge.visibilityChangeHandler,false);window.removeEventListener('resize',Bridge.resizeHandler,false);if(Bridge.screenOrientation=='undefined')window.removeEventListener('resize',Bridge.orientationChangeHandler,false);else screen.orientation.removeEventListener('change',Bridge.orientationChangeHandler);this.preview.removeEventListener('loadeddata',JS_media.videoStreamData_handler_wrapper);JS_media.videoTrack.removeEventListener('ended',JS_media.videoTrackEnded_handler_wrapper);JS_media.videoTrack=null;JS_media.mediaStream=null;this.container.removeChild(this.cameraPreview);let startingROI=Connector.cache.ROI;let x=startingROI.x;let y=startingROI.y;let width=startingROI.width;let height=startingROI.height;Connector.setRegionOfInterest(x,y,width,height);if(!initial_s||Decoder.startCounter>1){JS_media.zoom.useTarget=false;Barkoder.events.dispatchStopEvent();}
else if(Decoder.startCounter==1&&(JS_media.has_userSetCameraId||JS_media.using_cachedCameraId)){JS_media.zoom.useTarget=false;Barkoder.events.dispatchStopEvent();}};static createPreview(){if(!this.initialized){this.cameraPreview_init();this.flash_init(JS_media.applyFlash);this.zoom_init(JS_media.applyZoom);this.close_init(JS_media.closeHandler);this.cameraPicker_init(JS_media.cameraPickerHandler);this.cameraPickerUI_init();this.initialized=true;Common.debugMessage("DOM","in createPreview in initialized after everything",true);}
this.hideElements();Common.debugMessage("DOM","in createPreview after hideElements()",true);this.addPreview();Common.debugMessage("DOM","in createPreview after addPreview()",true);};}
class JS_media{static supported=(typeof navigator.mediaDevices=='object'&&typeof navigator.mediaDevices.getUserMedia=='function');static initial=true;static initialTimeout=500;static browser_supported_constraints=null;static runtime_settings_videoTrack=null;static hardware_capabilities_ranges_videoTrack=null;static mediaStream=null;static videoTrack=null;static scanner_timeout=null;static videoStreamData_handler_wrapper=null;static videoTrackEnded_handler_wrapper=null;static frameWidth={min:640,ideal:1280,max:1920};static frameHeight={min:480,ideal:720,max:1080};static hardwareCameraResolution={width:1280,height:720};static frontCamera=false;static initial_cameraId='';static CACHED_CAMERA_ID_KEY="BarkoderSDK.cache.cachedCameraId";static cachedCameraId='';static has_cachedCameraId=false;static using_cachedCameraId=false;static cameraId='';static has_userSetCameraId=false;static cameras=null;static highFocusDistance=false;static hasTripleCamera=false;static constraints={video:{width:null,height:null,frameRate:30,facingMode:'',focusMode:'continuous'}};static flash={supported:false,ready:false,state:false};static zoom={supported:false,ready:false,levels:[],level:0,targetLevels:[],targetLevel:0,targetValue:0,useTarget:false};static constraints_init(width,height,useFrontCamera){if(typeof width=='number')this.frameWidth.ideal=width;if(typeof height=='number')this.frameHeight.ideal=height;if(typeof useFrontCamera=='boolean')this.frontCamera=useFrontCamera;this.constraints.video.width=this.frameWidth;this.constraints.video.height=this.frameHeight;if(this.cameraId=='')
this.constraints.video.facingMode=(this.frontCamera)?'user':'environment';else
this.constraints.video.deviceId={exact:this.cameraId};this.hardwareCameraResolution.width=this.frameWidth.ideal;this.hardwareCameraResolution.height=this.frameHeight.ideal;};static applyFlash(changeState){Common.debugMessage("JS_media","in applyFlash",true);Common.debugMessage("",this,false);let torchState=JS_media.flash.state;let videoTrack=JS_media.videoTrack;if(JS_media.videoTrack==null)return;if(!JS_media.flash.supported||!JS_media.flash.ready)return;if(changeState)Common.flashProxy.state=!torchState;torchState=JS_media.flash.state;if(true){videoTrack.applyConstraints({advanced:[{torch:torchState}]}).catch(e=>{if(JS_media.videoTrack!=null)console.log(e);});}};static applyZoom()
{if(JS_media.videoTrack==null)return;if(!JS_media.zoom.supported||!JS_media.zoom.ready)return;JS_media.zoom.level++;Common.zoomProxy.level=(JS_media.zoom.level%3);let zoomLevel=JS_media.zoom.level;let zoomLevels=JS_media.zoom.levels;let targetLevels=JS_media.zoom.targetLevels;let useTarget=JS_media.zoom.useTarget;let videoTrack=JS_media.videoTrack;if(zoomLevel==1){let zoom_mid=zoomLevels[1];let zoom_max=zoomLevels[2];if(zoom_mid>=zoom_max)
{JS_media.zoom.level++;Common.zoomProxy.level=(JS_media.zoom.level%3);zoomLevel=JS_media.zoom.level;zoomLevels=JS_media.zoom.levels;}}
if(useTarget)zoomLevels=targetLevels;videoTrack.applyConstraints({advanced:[{zoom:zoomLevels[zoomLevel]}]}).catch(e=>{if(JS_media.videoTrack!=null)console.log(e);});};static closeHandler()
{DOM_elements.stopPreview();};static cameraPickerHandler()
{let visibilityState=(DOM_elements.cameraPickerUI.style.display!="none");DOM_elements.cameraPickerUI.style.display=(visibilityState)?"none":"initial";let cameraPreview=DOM_elements.cameraPreview;let cameraPickerUI=DOM_elements.cameraPickerUI;let cameraPickerUI_height_percent=cameraPickerUI.offsetHeight/cameraPreview.offsetHeight;let cameraPickerUI_top_percent=Number(((1.0-cameraPickerUI_height_percent)/2.0).toFixed(2));let cameraPickerUI_height_half=Number((cameraPickerUI_height_percent/2.0).toFixed(2));Common.debugMessage("resizeOverlay in handler",`${cameraPickerUI_height_percent} ${cameraPickerUI_top_percent} ${cameraPickerUI_height_half}`,false);cameraPickerUI.style.top=(cameraPickerUI_top_percent*100)+"%";};static handleError(error){let bad_cameraId=(typeof error=="object"&&((typeof error.name=="string"&&error.name=="OverconstrainedError")&&(typeof error.constraint=="string"&&error.constraint=="deviceId")));let cachedCameraId_mismatch=(JS_media.has_cachedCameraId&&bad_cameraId);try{DOM_elements.stopPreview();}catch(e){}
if(cachedCameraId_mismatch&&!JS_media.has_userSetCameraId)
{Common.debugMessage("handleError","cachedCameraId_mismatch, doing a fresh start",true);setTimeout(function(){Decoder.startCounter=0;delete JS_media.constraints.video.deviceId;JS_media.cameraId="";JS_media.has_userSetCameraId=false;JS_media.cachedCameraId="";JS_media.has_cachedCameraId=false;JS_media.using_cachedCameraId=false;localStorage.setItem(JS_media.CACHED_CAMERA_ID_KEY,"");Barkoder.startScanner(Decoder.cameraScanner.config.result_callback);},JS_media.initialTimeout);}
else
{let cameraScannerProperties=Decoder.cameraScanner;cameraScannerProperties.config.result_callback({resultCount:0,type:"error",error:{name:error.name,message:error.message??"",}});}};static analyzeZoomLevel(levels,targetValue){const[min,mid,max]=levels;const levelLabels=['min','mid','max'];let outOfRange=false;let closestEndIndex=-1;let belongsToIndex=-1;let resultIndex=-1;if(targetValue<min){outOfRange=true;closestEndIndex=0;resultIndex=closestEndIndex;}else if(targetValue>max){outOfRange=true;closestEndIndex=2;resultIndex=closestEndIndex;}else{if(targetValue<mid){belongsToIndex=0;}else if(targetValue<max){belongsToIndex=(mid<max)?1:2;}else{belongsToIndex=2;}
resultIndex=belongsToIndex;}
return[closestEndIndex,resultIndex];};static capabilitiesHandler(){let initial_s=JS_media.initial;if(typeof this.videoTrack.getCapabilities!='function')return;const capabilities=this.videoTrack.getCapabilities();this.hardware_capabilities_ranges_videoTrack=capabilities;Common.debugMessage("JS_media","videoCapabilities",true);Common.debugMessage("",this.hardware_capabilities_ranges_videoTrack,true);let w=this.hardware_capabilities_ranges_videoTrack.width.max;let h=this.hardware_capabilities_ranges_videoTrack.height.max;let f=this.hardware_capabilities_ranges_videoTrack.focusDistance?.min;let z_min=(capabilities.zoom)?capabilities.zoom.min:"no zoom";let z_max=(capabilities.zoom)?capabilities.zoom.max:"no zoom";if(typeof f=='number')
{if(!JS_media.initial){f=f.toFixed(2);}else
{if(f>=0.20)JS_media.highFocusDistance=true;}}else{if(!JS_media.initial){}}
let flash_support=(capabilities.torch!==undefined)?capabilities.torch:false;Common.flashProxy.supported=flash_support;this.flash.ready=flash_support;if(capabilities.zoom)this.zoom.supported=true;else{DOM_elements.zoom.style.display="none";return;}
let min=capabilities.zoom.min;let max=min*4;let step=capabilities.zoom.step;let mid=min*2;if(JS_media.correct_zoom_on_ios)
{min*=2;mid*=2;max*=2;max=(max>capabilities.zoom.max)?capabilities.zoom.max:max;}
this.zoom.levels=[min,mid,max];this.zoom.targetLevels=[min,mid,max];this.zoom.ready=true;Common.debugMessage("capabilitiesHandler","this.zoom.levels",true);Common.debugMessage("",this.zoom.levels,true);Common.debugMessage("old max",capabilities.zoom.max,true);let zoomLevel=this.zoom.level;let zoomLevels=this.zoom.levels;let videoTrack=this.videoTrack;if(this.zoom.useTarget)
{const[closestEnd,belongsTo]=this.analyzeZoomLevel(this.zoom.levels,this.zoom.targetValue);let rangedTargetValue=(closestEnd==-1)?this.zoom.targetValue:this.zoom.levels[closestEnd];this.zoom.targetLevels[belongsTo]=rangedTargetValue;this.zoom.targetLevel=belongsTo;JS_media.zoom.level=JS_media.zoom.targetLevel;Common.zoomProxy.level=JS_media.zoom.level;zoomLevel=this.zoom.level;zoomLevels=this.zoom.targetLevels;}
if(!initial_s)videoTrack.applyConstraints({advanced:[{zoom:zoomLevels[zoomLevel]}]}).catch(e=>console.log(e));};static async getCameras(){let args=arguments;let internalUsage=((typeof args[0]=='string')&&(args[0]=="internal"));async function requestPermission()
{return new Promise(async function(resolve,reject){try{var stream=await navigator.mediaDevices.getUserMedia({video:true});var videoTrack=stream.getVideoTracks()[0];var runtime_settings_videoTrack=videoTrack.getSettings();if(videoTrack!=null)videoTrack.stop();videoTrack=null;stream=null;resolve();}catch(e){if(e.name.toLowerCase().includes(("NotAllowedError").toLowerCase())){if(internalUsage)JS_media.handleError({name:"NotAllowedError",message:"Camera permission denied."});else return reject("CameraAccessNotAllowed");}}});};async function getCameraSelection(resolve)
{const devices=await navigator.mediaDevices.enumerateDevices();const videoDevices=devices.filter(device=>device.kind=='videoinput');JS_media.cameras=videoDevices.map(videoDevice=>{return{id:videoDevice.deviceId,label:videoDevice.label};});resolve(JS_media.cameras);};return new Promise(async function(resolve,reject){if(!JS_media.supported)
{if(location.protocol!="https:"){if(internalUsage)JS_media.handleError({name:"SecurityError",message:"Not using HTTPS."});else return reject("CameraAccessNotSupportedOverHttp");}}
try{const{state}=await navigator.permissions.query({name:"camera"});if(state=="denied"){if(internalUsage)JS_media.handleError({name:"NotAllowedError",message:"Camera permission denied."});else return reject("CameraAccessNotAllowed");}
if(state=="prompt"){await requestPermission();}}
catch(error){}
getCameraSelection(resolve);});};static async populateCameraPicker(currentCameraID)
{let cameraCount=JS_media.cameras?.length??0;if(cameraCount==0){try{await Barkoder.getCameras();}catch(e){if(e=="CameraAccessNotAllowed"){JS_media.handleError({name:"NotAllowedError",message:"Camera permission denied."});}
else if(e=="CameraAccessNotSupportedOverHttp"){JS_media.handleError({name:"SecurityError",message:"Not using HTTPS."});}}}
if((currentCameraID=="")&&(JS_media.cameraId!=""))currentCameraID=JS_media.cameraId;DOM_elements.cameraPickerUI_update(JS_media.cameras,currentCameraID);};static correct_zoom_on_ios=false;static async changeCamera(event)
{Common.debugMessage("cameraPicker","in onchange",true);let caller=event.target||event.srcElement;let cameraId=caller.dataset.value;let cameraLabel=caller.dataset.label;Barkoder.stopScanner();await Common.wait(400);Common.debugMessage("cameraPicker",caller.value,true);Common.debugMessage("cameraPicker",caller.dataset.value,true);Common.debugMessage("cameraPicker",caller.dataset.label,true);Barkoder.setCameraId(cameraId);{if((cameraLabel.toLowerCase().includes("dual wide"))||(cameraLabel.toLowerCase().includes("triple")))
{JS_media.correct_zoom_on_ios=true;}
else
{JS_media.correct_zoom_on_ios=false;}}
Barkoder.startScanner(Decoder.cameraScanner.config.result_callback);}
static startCamera(video,videoStreamData_handler,inactiveStream_handler){if(!this.supported){if(location.protocol!="https:")this.handleError({name:"SecurityError",message:"Not using HTTPS."});return;}
this.browser_supported_constraints=navigator.mediaDevices.getSupportedConstraints();this.constraints_init();navigator.mediaDevices.getUserMedia(this.constraints).then(function(stream){let context=JS_media;Common.debugMessage("JS_media","context = JS_media in getUserMedia",false);Common.debugMessage("",context,false);context.mediaStream=stream;if(typeof inactiveStream_handler=='function')
stream.oninactive=inactiveStream_handler;const track=stream.getVideoTracks()[0];context.videoTrack=track;context.videoTrackEnded_handler_wrapper=function(e){Common.debugMessage("JS_media","videoTrack ended event",false);Common.debugMessage("",e,false);JS_media.handleError({name:"StreamEnded",message:`The video stream from camera '${e.currentTarget.label}' ended.`});};track.onended=context.videoTrackEnded_handler_wrapper;context.runtime_settings_videoTrack=track.getSettings();if(context.initial){context.capabilitiesHandler();let activeCamera=Barkoder.getActiveCamera();if(activeCamera!=null)context.initial_cameraId=activeCamera.id;if(!JS_media.has_userSetCameraId&&!JS_media.using_cachedCameraId)
{DOM_elements.cameraPreview.style.visibility="visible";Barkoder.stopScanner();setTimeout(function(){context.initial=false;if(!Decoder.cameraScanner.config.stop_after_initial_camera_start)Barkoder.startScanner(Decoder.cameraScanner.config.result_callback);else
Barkoder.events.dispatchStartInitEvent();},context.initialTimeout);return;}}
Common.debugMessage("JS_media",`Using "${context.videoTrack.label}" camera.`,true);if(!JS_media.has_cachedCameraId&&Decoder.startCounter==2)
{let activeCamera=Barkoder.getActiveCamera();let activeCameraId=(activeCamera!=null)?activeCamera.id:"";localStorage.setItem(JS_media.CACHED_CAMERA_ID_KEY,activeCameraId);Common.debugMessage("JS_media",`Cached "${context.videoTrack.label}" camera.`,true);}
context.hardwareCameraResolution.width=context.runtime_settings_videoTrack.width;context.hardwareCameraResolution.height=context.runtime_settings_videoTrack.height;context.capabilitiesHandler();Common.debugMessage("JS_media","in getUserMedia after capabilitiesHandler()",true);Common.debugMessage("JS_media","video",false);Common.debugMessage("",video,false);if(typeof videoStreamData_handler=='function')
{let initial_s=JS_media.initial;context.videoStreamData_handler_wrapper=function(){videoStreamData_handler(initial_s);};video.addEventListener('loadeddata',context.videoStreamData_handler_wrapper);}
Common.debugMessage("JS_media","in getUserMedia after videoStreamData_handler is added as EL for loadeddata",true);video.srcObject=context.mediaStream;video.onloadedmetadata=function(e){this.muted=true;Common.debugMessage("JS_media","in getUserMedia in onloadedmetadata handler before play",true);this.play().catch(function(e){Common.debugMessage("JS_media","video",false);Common.debugMessage("",this,false);Common.debugMessage("JS_media","play error",false);Common.debugMessage("",e,false);});context.applyFlash(false);Common.debugMessage("JS_media","in getUserMedia in onloadedmetadata handler after play",true);let decoder_timeout=Decoder.cameraScanner.config.timeout;if(decoder_timeout!=0)
context.scanner_timeout=setTimeout(async function(){DOM_elements.stopPreview();Barkoder.events.dispatchTimeoutEvent();},decoder_timeout*1000);};}).catch(function(e){JS_media.handleError(e);});};}
class Bridge{static initialized=false;static initialized_ctx=false;static hideDuringResize=false;static numberOfSupportedDecoders=40;static enabledDecoders=0;static untouchedROIArray=[];static viewfinder={x:0,y:0,width:0,height:0,orientation:0};static untouchedROIUnion={x:0,y:0,width:100,height:100};static is_portrait=false;static viewfinderAppearance={overlay:{roiVisible:true,lineWidth:1.5,lineColor:"#ff3347",backgroundFillColor:"rgba(0, 0, 0, 0.5)"}};static cameraResolution_values=[[640,480],[1280,720],[1920,1080]];static orientationType={"landscape-primary":0,"portrait-primary":1,"landscape-secondary":2};static screenOrientation=(typeof screen.orientation=='undefined')?'undefined':screen.orientation;static rotate(ROI,to_orientation){if(to_orientation<0||to_orientation>2)return ROI;let x1=ROI.x;let y1=ROI.y;let w1=ROI.width;let h1=ROI.height;let from_orientation=this.viewfinder.orientation;let rotate=[[{x:x1,y:y1,width:w1,height:h1},{x:y1,y:(100-x1-w1),width:h1,height:w1},{x:(100-x1-w1),y:(100-y1-h1),width:w1,height:h1}],[{x:(100-y1-h1),y:x1,width:h1,height:w1},{x:x1,y:y1,width:w1,height:h1},{x:y1,y:(100-x1-w1),width:h1,height:w1}],[{x:(100-x1-w1),y:(100-y1-h1),width:w1,height:h1},{x:(100-y1-h1),y:(100-x1-w1),width:h1,height:w1},{x:x1,y:y1,width:w1,height:h1}]];return rotate[from_orientation][to_orientation];};static scale(ROI,viewfinderScale,scaleHeight){if(viewfinderScale<0.01||viewfinderScale>1.0||scaleHeight<0||scaleHeight>1)return ROI;var x1=ROI.x;var y1=ROI.y;var w1=ROI.width;var h1=ROI.height;var cropScaleP=(1-viewfinderScale)*100;var scale_and_center=[{x:((cropScaleP/2)+(x1*viewfinderScale)),y:y1,width:(w1*viewfinderScale),height:h1},{x:x1,y:((cropScaleP/2)+(y1*viewfinderScale)),width:w1,height:(h1*viewfinderScale)}];return scale_and_center[scaleHeight];};static calculateROI(cameraPreview_AR_is_higher_than_camera_AR,croppedCameraAreaScale)
{let is_portrait=this.is_portrait;let viewfinderAreaScale=(1-croppedCameraAreaScale);let widthIndex=(is_portrait)?1:0;let heightIndex=(is_portrait)?0:1;if((!is_portrait&&cameraPreview_AR_is_higher_than_camera_AR)||(is_portrait&&!cameraPreview_AR_is_higher_than_camera_AR))
{let roi;for(let i=0;i<this.numberOfSupportedDecoders;i++){roi=this.rotate(this.untouchedROIArray[i],this.viewfinder.orientation);roi=this.scale(roi,viewfinderAreaScale,heightIndex);Connector.setRegionOfInterest(roi.x,roi.y,roi.width,roi.height);}}
else
{let roi;for(let i=0;i<this.numberOfSupportedDecoders;i++){roi=this.rotate(this.untouchedROIArray[i],this.viewfinder.orientation);roi=this.scale(roi,viewfinderAreaScale,widthIndex);Connector.setRegionOfInterest(roi.x,roi.y,roi.width,roi.height);}}};static calculatePreview(hardwareCameraResolution){let previewFrame=DOM_elements.cameraPreview;let preview=DOM_elements.preview;let windowWidth=window.innerWidth;let windowHeight=window.innerHeight;let window_AR=windowWidth/windowHeight;let cameraPreviewWidth=previewFrame.offsetWidth;let cameraPreviewHeigth=previewFrame.offsetHeight;let cameraPreview_AR=cameraPreviewWidth/cameraPreviewHeigth;let cameraWidth=preview.videoWidth;;let cameraHeight=preview.videoHeight;let camera_AR=cameraWidth/cameraHeight;if(cameraPreview_AR==camera_AR)return;else if(cameraPreview_AR>camera_AR)
{let scalingFactor=cameraPreviewWidth/cameraWidth;let new_cameraHeight=cameraHeight*scalingFactor;let croppedCameraArea=new_cameraHeight-cameraPreviewHeigth;let croppedCameraAreaScale=croppedCameraArea/new_cameraHeight;let translatedCameraTopPercent=-(croppedCameraAreaScale/2)*100;preview.style.cssText="position: absolute; margin: auto; top: 0; bottom: 0; width: 100%; height: auto;";this.calculateROI(true,croppedCameraAreaScale);}
else if(cameraPreview_AR<camera_AR)
{let scalingFactor=cameraPreviewHeigth/cameraHeight;let new_cameraWidth=cameraWidth*scalingFactor;let croppedCameraArea=new_cameraWidth-cameraPreviewWidth;let croppedCameraAreaScale=croppedCameraArea/new_cameraWidth;let translateCameraLeftPercent=-(croppedCameraAreaScale/2)*100;let croppedinDivAreaScale=croppedCameraArea/cameraPreviewWidth;translateCameraLeftPercent=-(croppedinDivAreaScale/2)*100;preview.style.cssText="position: absolute; margin-left: "+translateCameraLeftPercent+"%; width: auto; height: 100%;";this.calculateROI(false,croppedCameraAreaScale);}};static ctx=null;static handleOverlay(){let canvasOverlay=DOM_elements.overlay;let viewfinder=this.viewfinder;let mode=1;if(!Bridge.initialized_ctx){Bridge.ctx=canvasOverlay.getContext("2d",{willReadFrequently:true});Bridge.initialized_ctx=true;}
var ctx=Bridge.ctx;if(mode==0){ctx.clearRect(0,0,canvasOverlay.width,canvasOverlay.height);}
else if(mode==1)
{if(!this.viewfinderAppearance.overlay.roiVisible){ctx.clearRect(0,0,canvasOverlay.width,canvasOverlay.height);return;}
ctx.fillStyle=this.viewfinderAppearance.overlay.backgroundFillColor;ctx.fillRect(0,0,canvasOverlay.width+10,canvasOverlay.height+10);ctx.clearRect(viewfinder.x,viewfinder.y,viewfinder.width,viewfinder.height);if(true)
{ctx.lineWidth=this.viewfinderAppearance.overlay.lineWidth;ctx.strokeStyle=this.viewfinderAppearance.overlay.lineColor;ctx.strokeRect(viewfinder.x,viewfinder.y,viewfinder.width,viewfinder.height);}
Common.debugMessage("Bridge","in handleOverlay() after mode 1 completed",true);}
if(Decoder.cameraScanner.overlay.centerMarkType==1)
{let centerX=viewfinder.x+viewfinder.width/2;let centerY=viewfinder.y+viewfinder.height/2
let size=4;ctx.strokeStyle=this.viewfinderAppearance.overlay.lineColor;ctx.lineWidth=this.viewfinderAppearance.overlay.lineWidth;ctx.beginPath();ctx.moveTo(centerX,centerY-size);ctx.lineTo(centerX,centerY+size);ctx.stroke();ctx.beginPath();ctx.moveTo(centerX-size,centerY);ctx.lineTo(centerX+size,centerY);ctx.stroke();}
if(Bridge.enabledDecoders==0)
{let middleWidth=canvasOverlay.width/2;let middleHeight=canvasOverlay.height/2;let fontSize=20;ctx.font=`${fontSize}px Arial`;ctx.fillStyle="red";ctx.textAlign="center";ctx.fillText("There are no enabled symbologies.",middleWidth,middleHeight-fontSize);ctx.fillText("The scanner is not scanning for any barcodes.",middleWidth,middleHeight+fontSize);}};static resizeOverlay(){let viewfinderUnionROI=this.untouchedROIUnion;let cameraPreview=DOM_elements.cameraPreview;let canvasOverlay=DOM_elements.overlay;let cameraPickerUI=DOM_elements.cameraPickerUI;let flash=DOM_elements.flash;let zoom=DOM_elements.zoom;let close=DOM_elements.close;let cameraPicker=DOM_elements.cameraPicker;let viewfinder=this.viewfinder;canvasOverlay.style.top=cameraPreview.style.top;canvasOverlay.style.left=cameraPreview.style.left;canvasOverlay.width=cameraPreview.offsetWidth;canvasOverlay.height=cameraPreview.offsetHeight;Common.debugMessage("Bridge","in resizeOverlay after overlay TLWH is set",true);flash.style.top=(canvasOverlay.offsetTop+2)+"px";flash.style.left=canvasOverlay.offsetLeft+"px";zoom.style.top=(canvasOverlay.offsetTop+2)+"px";zoom.style.left=((canvasOverlay.offsetWidth+canvasOverlay.offsetLeft)-zoom.offsetWidth)+"px";close.style.top=((canvasOverlay.offsetTop+canvasOverlay.height)-((close.offsetHeight*1.5)+2))+"px";close.style.left=((canvasOverlay.offsetWidth+canvasOverlay.offsetLeft)-(close.offsetWidth*1.5))+"px";cameraPicker.style.top=((canvasOverlay.offsetTop+canvasOverlay.height)-((cameraPicker.offsetHeight*1)+2))+"px";cameraPicker.style.left=canvasOverlay.offsetLeft+"px";let cameraPickerUI_height_percent=cameraPickerUI.offsetHeight/cameraPreview.offsetHeight;let cameraPickerUI_top_percent=Number(((1.0-cameraPickerUI_height_percent)/2.0).toFixed(2));let cameraPickerUI_height_half=Number((cameraPickerUI_height_percent/2.0).toFixed(2));Common.debugMessage("resizeOverlay in handler",`${cameraPickerUI_height_percent} ${cameraPickerUI_top_percent} ${cameraPickerUI_height_half}`,false);cameraPickerUI.style.top=(cameraPickerUI_top_percent*100)+"%";viewfinder.x=canvasOverlay.width*(viewfinderUnionROI.x/100);viewfinder.y=canvasOverlay.height*(viewfinderUnionROI.y/100);viewfinder.width=canvasOverlay.width*(viewfinderUnionROI.width/100);viewfinder.height=canvasOverlay.height*(viewfinderUnionROI.height/100);this.handleOverlay();};static resizePreview(){let hideDuringResize=this.hideDuringResize;let cameraPreview=DOM_elements.cameraPreview;let hardwareCameraResolution=JS_media.hardwareCameraResolution;if(hideDuringResize){cameraPreview.style.visibility="hidden";}
Common.debugMessage("Bridge","in resizePreview, before calling calculatePreview()",true);Common.debugMessage("",this,false);this.calculatePreview(hardwareCameraResolution);this.resizeOverlay();if(hideDuringResize){setTimeout(function(){cameraPreview.style.visibility="visible";},1500);}};static init_ROIs(){let numberOfSupportedDecoders=this.numberOfSupportedDecoders;let untouchedROIArray=this.untouchedROIArray;let untouchedROIUnion=this.untouchedROIUnion;if(!this.initialized)
{for(let i=0;i<numberOfSupportedDecoders;i++)
{let rect=Connector.getRegionOfInterest();untouchedROIArray.push(rect);}
this.initialized=true;}
else
{for(let i=0;i<numberOfSupportedDecoders;i++)
{let rect=Connector.getRegionOfInterest();untouchedROIArray[i]=rect;}}
let ROIUnion=Connector.getRegionOfInterest();untouchedROIUnion.x=ROIUnion.x;untouchedROIUnion.y=ROIUnion.y;untouchedROIUnion.width=ROIUnion.width;untouchedROIUnion.height=ROIUnion.height;};static resizeHandler(){Bridge.resizePreview();let RP_properties=RefreshPreview.properties;RP_properties.resizeHandlerCallCount++;Common.debugMessage("resizeHandler",`resizeHandlerCallCount: ${RP_properties.resizeHandlerCallCount} at resizeEventCount: ${RP_properties.resizeEventCount}`,true);if(RefreshPreview.useRecursiveRefresh)
{let currentValues=RefreshPreview.getValuesForResize();RP_properties.previousValues=JSON.parse(JSON.stringify(currentValues));RefreshPreview.refresh(++RP_properties.resizeEventCount);}};static orientationChangeHandler(){let orientation_int=(Bridge.screenOrientation=='undefined')?Number(window.innerWidth<window.innerHeight):Bridge.orientationType[Bridge.screenOrientation.type];let is_portrait=((orientation_int%2)==1);Bridge.viewfinder.orientation=orientation_int;Bridge.is_portrait=is_portrait;let videoWidth=DOM_elements.preview.videoWidth;let videoHeight=DOM_elements.preview.videoHeight;let larger=videoWidth;let smaller=videoHeight;if(videoWidth<videoHeight)
{larger=videoHeight;smaller=videoWidth;}
JS_media.hardwareCameraResolution.width=larger;JS_media.hardwareCameraResolution.height=smaller;};static visibilityChangeHandler(){if(document.hidden){Barkoder.stopScanner();}};}
class BarkoderEvents extends EventTarget{constructor(){super();this.events={dispatchStartInitEvent:()=>{let startEvent=new CustomEvent("startScannerInit",{detail:"Camera initialized."});this.dispatchEvent(startEvent);},dispatchStartEvent:()=>{let startEvent=new CustomEvent("startScanner",{detail:"Camera started."});this.dispatchEvent(startEvent);},dispatchStopEvent:()=>{let stopEvent=new CustomEvent("stopScanner",{detail:"Camera stopped."});this.dispatchEvent(stopEvent);},dispatchTimeoutEvent:()=>{let timeoutEvent=new CustomEvent("scannerTimeout",{detail:"Scanner timed out."});this.dispatchEvent(timeoutEvent);}};}}
class RefreshPreview{static useRecursiveRefresh=true;static properties={previousValues:null,resizeEventCount:0,resizeHandlerCallCount:0};static clearProperties(){this.properties.previousValues=null;this.properties.resizeEventCount=0;this.properties.resizeHandlerCallCount=0;};static getValuesForResize(){let cameraPreview=DOM_elements.cameraPreview;let orientation=Bridge.viewfinder.orientation;let is_portrait=Bridge.is_portrait;let cameraPreviewTop=cameraPreview.offsetTop;let cameraPreviewLeft=cameraPreview.offsetLeft;let cameraPreviewWidth=cameraPreview.offsetWidth;let cameraPreviewHeigth=cameraPreview.offsetHeight;let cameraWidth=DOM_elements.preview.videoWidth;let cameraHeight=DOM_elements.preview.videoHeight;let values={cameraPreviewTop:cameraPreviewTop,cameraPreviewLeft:cameraPreviewLeft,cameraPreviewWidth:cameraPreviewWidth,cameraPreviewHeigth:cameraPreviewHeigth,cameraWidth:cameraWidth,cameraHeight:cameraHeight,orientation:orientation,is_portrait:is_portrait};return values;};static checkSameValuesForResize(){let previousValues=this.properties.previousValues;let currentValues=this.getValuesForResize();return((currentValues.cameraPreviewTop==previousValues.cameraPreviewTop)&&(currentValues.cameraPreviewLeft==previousValues.cameraPreviewLeft)&&(currentValues.cameraPreviewWidth==previousValues.cameraPreviewWidth)&&(currentValues.cameraPreviewHeigth==previousValues.cameraPreviewHeigth)&&(currentValues.cameraWidth==previousValues.cameraWidth)&&(currentValues.cameraHeight==previousValues.cameraHeight)&&(currentValues.orientation==previousValues.orientation)&&(currentValues.is_portrait==previousValues.is_portrait));};static refresh(resizeEventCount_at){let refreshDuration=0;let refreshRate=50;let refreshFinish=400;let recursiveRefresh=setInterval(function()
{refreshDuration+=refreshRate;let resizeEventCount=RefreshPreview.properties.resizeEventCount;let RP_properties=RefreshPreview.properties;let cameraScannerProperties=Decoder.cameraScanner;const active=cameraScannerProperties.runningState.active;if(!active){Common.debugMessage("RefreshPreview",`cleared recursiveRefresh at ${refreshDuration}ms because the decoder is not active`,true);clearInterval(recursiveRefresh);return;}
if(refreshDuration>refreshFinish){Common.debugMessage("RefreshPreview",`cleared recursiveRefresh at ${refreshDuration}ms because it passed the limit of ${refreshFinish}ms`,true);clearInterval(recursiveRefresh);}
if(resizeEventCount>resizeEventCount_at){Common.debugMessage("RefreshPreview",`cleared recursiveRefresh at ${refreshDuration}ms because more resize events (and subsequent resizeHandler calls) were already done i.e. ${resizeEventCount} > ${resizeEventCount_at}`,true);clearInterval(recursiveRefresh);}
var current_valuesForResize=RefreshPreview.getValuesForResize();if(RefreshPreview.checkSameValuesForResize())return;Common.debugMessage("RefreshPreview",`recursiveRefresh[${resizeEventCount_at}] at ${refreshDuration}ms`,true);RP_properties.previousValues=JSON.parse(JSON.stringify(current_valuesForResize));Bridge.orientationChangeHandler();Bridge.resizeHandler();},refreshRate);};}
class AudioHandler{static webAudio_supported=('AudioContext'in window||'webkitAudioContext'in window);static webAudio_initialized=false;static AudioContext=null;static context=null;static gainNode=null;static beepBuffer=undefined;static async webAudio_audio_init(){window.fetch(AudioHandler.Beep.dataURI).then(response=>response.arrayBuffer()).then(arrayBuffer=>AudioHandler.context.decodeAudioData(arrayBuffer,audioBuffer=>{AudioHandler.beepBuffer=audioBuffer;},error=>console.error(error)));};static webAudio_audio_play(audioBuffer){var source=AudioHandler.context.createBufferSource();source.buffer=audioBuffer;source.connect(AudioHandler.context.destination);source.start();};static webAudio_unlock(){Common.debugMessage("AudioHandler","Try to unlock the audio context.",true);var buffer=AudioHandler.context.createBuffer(1,1,22050);var source=AudioHandler.context.createBufferSource();source.buffer=buffer;source.connect(AudioHandler.context.destination);source.start?source.start(0):source.noteOn(0);};static async webAudio_init(){if(AudioHandler.webAudio_supported&&!AudioHandler.webAudio_initialized){Audi