/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ var platform_type = ""; var platform_theme = "md"; var app_version = "unknown"; var nw_tray = null; /** * If true and animations are set to "auto", animations should be disabled. * @type Boolean */ var auto_disable_animations = false; var openBrowser = function (url) { window.open(url); } var openSystemBrowser = function (url) { window.open(url); } var scanBarcode = function (success, error) { app.dialog.alert("You can't scan barcodes with this device.", "Sorry!"); } var appTheme = "light"; var scanningBarcode = false; var getLocation = function (success, error) { if ("geolocation" in navigator) { navigator.geolocation.getCurrentPosition(function (position) { success(position); }, function (err) { if (typeof error == "function") { error(err.message); } }, { enableHighAccuracy: true, timeout: 5000, maximumAge: 0 }); } else { if (typeof error == "function") { error("Location is unavailable."); } } } function setupHTML5BarcodeScanner() { $("body").append(''); scanBarcode = function (success, error) { scanningBarcode = true; $("#web-barcode-ui").removeClass("hidden"); // Stolen from https://zxing-js.github.io/library/examples/multi-camera/ const codeReader = new ZXing.BrowserMultiFormatReader(); console.log("Info", 'ZXing code reader initialized'); codeReader.getVideoInputDevices() .then((videoInputDevices) => { if (videoInputDevices.length == 0) { codeReader.reset(); $("#web-barcode-ui").addClass("hidden"); error("A camera is required to scan barcodes."); return; } selectedDeviceId = videoInputDevices[0].deviceId; codeReader.decodeFromInputVideoDeviceContinuously(selectedDeviceId, 'barcode-viewer', (result, err) => { scanningBarcode = false; if (result) { codeReader.reset(); $("#web-barcode-ui").addClass("hidden"); success(result.text); return; } if (err && !(err instanceof ZXing.NotFoundException)) { console.error(err); codeReader.reset(); $("#web-barcode-ui").addClass("hidden"); error(err); return; } }); }) .catch((err) => { scanningBarcode = false; console.error(err); }); $("#web-barcode-ui").on("click", function () { codeReader.reset(); scanningBarcode = false; $("#web-barcode-ui").addClass("hidden"); }); }; } function setupCordovaBarcodeScanner() { scanBarcode = function (success, error) { scanningBarcode = true; cordova.plugins.barcodeScanner.scan( function (result) { scanningBarcode = false; if (!result.cancelled) { success(result.text); } }, function (err) { scanningBarcode = false; if (typeof error == "function") { error(err); } }, { showTorchButton: true, showFlipCameraButton: true, prompt: "Scan barcode", resultDisplayDuration: 0, disableSuccessBeep: true, formats: "QR_CODE,DATA_MATRIX,CODE_39,CODE_93,CODE_128,CODABAR,PDF_417" } ); }; } function initCordova() { platform_type = "cordova"; // Handle back button to close things document.addEventListener("backbutton", handleBackButton, false); document.addEventListener("deviceready", function () { // Make sure the status bar color is set properly applyColorTheme(); if (typeof device != "undefined" && device.platform != "browser") { setupCordovaBarcodeScanner(); } else { setupHTML5BarcodeScanner(); } cordova.plugins.ThemeDetection.isAvailable(function (resp) { if (resp.value == true) { cordova.plugins.ThemeDetection.isDarkModeEnabled(function (resp) { if (resp.value == true) { appTheme = "dark"; } else { appTheme = "light"; } applyColorTheme(); }, function (err) {}); } }, function (err) {}); }, false); openBrowser = function (url) { cordova.InAppBrowser.open(url, '_blank', 'location=yes'); } openExternalBrowser = function (url) { window.open(url, '_system', ''); } // Handle geo: urls $("#app").on("click", "a[href^='geo:']", function (evt) { window.open($(this).attr("href"), "_system"); evt.preventDefault(); }); } function initNW() { platform_type = "nw"; platform_theme = "md"; openBrowser = function (url) { nw.Window.open(url, { id: url }, function (browserwin) { // Add menubar so the user can navigate around if they click a link var browsermenu = new nw.Menu({type: 'menubar'}); browsermenu.append(new nw.MenuItem({ label: "Back", click: function () { browserwin.window.history.back(); } })); browsermenu.append(new nw.MenuItem({ label: "Forward", click: function () { browserwin.window.history.forward(); } })); browsermenu.append(new nw.MenuItem({ label: "Home", click: function () { browserwin.window.location.href = url; } })); browserwin.menu = browsermenu; }); } openExternalBrowser = function (url) { require('nw.gui').Shell.openExternal(url); } setupHTML5BarcodeScanner(); // Handle geo: urls $("#app").on("click", ".geolink", function (evt) { require('nw.gui').Shell.openExternal($(this).attr("href")); evt.preventDefault(); }); // automatic theme, default light if (typeof Framework7.device.prefersColorScheme() !== 'undefined' && Framework7.device.prefersColorScheme() == "dark") { appTheme = "dark"; } else { appTheme = "light"; } applyColorTheme(); } function initBrowser() { platform_type = "browser"; platform_theme = "md"; openBrowser = function (url) { window.open(url); } openExternalBrowser = function (url) { window.open(url); } setupHTML5BarcodeScanner(); $("#app").on("click", ".geolink", function (evt) { window.open($(this).attr("href"), "_blank"); evt.preventDefault(); }); // automatic theme, default light if (typeof Framework7.device.prefersColorScheme() !== 'undefined' && Framework7.device.prefersColorScheme() == "dark") { appTheme = "dark"; } else { appTheme = "light"; } applyColorTheme(); } function initPlatform() { if (typeof cordova !== 'undefined') { initCordova(); } else if (typeof nw !== 'undefined') { initNW(); } else { initBrowser(); } $.getJSON("package.json", function (data) { app_version = data.version; }); }