window.cascadingStateInstanceReference = (dotNetReference) => {
	try {
		window.cascadingStateInstance = dotNetReference
	} catch (e) {
		console.error(e)
	}
}
window.logFromJs = (message, where) => {
	try {
		if (!window.cascadingStateInstance ||
				typeof window.cascadingStateInstance.invokeMethodAsync != "function")
			return
		window.cascadingStateInstance.invokeMethodAsync('LogFromJs', message, where)
	} catch (e) {
		console.error(e)
	}
}
window.isServiceWorkerAvailable = () => {
	try {
		return navigator.serviceWorker.valueOf().controller != null
	} catch (e) {
		console.error(e)
		window.logFromJs(e.message, "isServiceWorkerAvailable")
	}
}
window.getLanguage = () => {
	try {
		return navigator.language.substr(0, 2)
	} catch (e) {
		console.error(e)
		window.logFromJs(e.message, "getLanguage")
	}
}
window.setLanguage = (lang) => {
	try {
		navigator.language = lang
	} catch (e) {
		console.error(e)
		window.logFromJs(e.message, "setLanguage")
	}
}
window.isOnline = async () => {
	try {
		const isOnline = navigator.onLine
		//const url = "https://contents.nuvola.xyz/api/assets/6d9f5e55-2034-456f-92e7-d9ec51066443"
		//let isOnlineStatusCode = true
		
		//try {
		//	const online = await fetch(url)
		//	isOnlineStatusCode = online.status >= 200 && online.status < 399
		//} catch (_) {
		//	isOnlineStatusCode = false
		//}
		
		if (navigator.connection !== undefined &&
				navigator.connection.effectiveType !== undefined &&
				navigator.connection.type !== undefined) {
			if (!isOnline)
				return isOnline
			
			return navigator.connection.type === "cellular" ?
					navigator.connection.effectiveType.indexOf("2g") === -1 /*&& isOnlineStatusCode*/ :
					true
		} else
			return isOnline //&& isOnlineStatusCode
	} catch (e) {
		console.error(e)
		window.logFromJs(e.message, "isOnline")
	}
}
window.clearCache = async () => {
	try {
		const cachesNames = await caches.keys()
		for (let i = 0; i < cachesNames.length; i++)
			await caches.delete(cachesNames[i])
	} catch (e) {
		console.error(e)
		window.logFromJs(e.message, "clearCache")
	}
}
window.clearLocalStorage = () => {
	try {
		localStorage.removeItem("PrivateCacheData")
		localStorage.removeItem("AuthData")
	} catch (e) {
		console.error(e)
		window.logFromJs(e.message, "clearLocalStorage")
	}
}
window.reloadPage = () => {
	try {
		location.reload(true)
	} catch (e) {
		console.error(e)
		window.logFromJs(e.message, "reloadPage")
	}
}
window.getHeight = (classId) => {
	try {
		const elements = document.querySelectorAll(classId)
		let px = 0
		if (!elements) return 0
		elements.forEach(v => px += v.offsetHeight)
		return px
	} catch (e) {
		console.error(e)
		window.logFromJs(e.message, "getHeight")
	}
}
window.setAppBadge = (counter) => {
	try {
		navigator.setAppBadge(counter)
	} catch (e) {
		console.error(e)
		window.logFromJs(e.message, "setAppBadge")
	}
}
window.clearAppBadge = () => {
	try {
		navigator.clearAppBadge()
	} catch (e) {
		console.error(e)
		window.logFromJs(e.message, "clearAppBadge")
	}
}
window.isMobileMedia = () => {
	try {
		return ((window.innerWidth > 0) ? window.innerWidth : screen.width) <= 768
	} catch (e) {
		console.error(e)
		window.logFromJs(e.message, "isMobileMedia")
	}
}
window.canShareStuff = () => {
	try {
		return navigator.share !== undefined
	} catch (e) {
		console.error(e)
		window.logFromJs(e.message, "canShareStuff")
	}
}
window.shareTextUrl = (title, text, url) => {
	try {
		navigator.share({
			title: title,
			text: text,
			url: url
		})
	} catch (e) {
		console.error(e)
		window.logFromJs(e.message, "shareTextUrl")
	}
}
window.shareText = (title, text) => {
	try {
		navigator.share({
			title: title,
			text: text
		})
	} catch (e) {
		console.error(e)
		window.logFromJs(e.message, "shareText")
	}
}