(function() {
	var jsURLs = [{ url: "https://static.favro.com/38aca0918beadd9e6a66903de686cc7a49b03e9f.js?meteor_js_resource=true", size: 8486258 }];
	var cssURLs = [{ url: "https://static.favro.com/a887373b2fa27952150eb5979328b3f91cc27c2f.css?meteor_css_resource=true", size: 4130707 }];

	function doLoading() {

		var isDesktopApp = window.desktopAppInfo !== undefined;
		var isIOSApp = (typeof webkit !== "undefined" && webkit.messageHandlers && webkit.messageHandlers.interOp);
		var isAndroidApp = (typeof FavroAndroid !== "undefined");

		function sendInteropMessage(message) {
			if (isDesktopApp)
				ipcRenderer.send("asynchronous-message", message);
			else if (isIOSApp)
				webkit.messageHandlers.interOp.postMessage(message);
			else if (isAndroidApp)
				FavroAndroid.receiveMessage(JSON.stringify(message, null, 2));
		}


		var totalLoaded = 0;
		var percentFinished = 0;
		var lastPercentFinished = 0;

		var totalSize = 0;

		for (var i = 0; i < jsURLs.length; ++i)
			totalSize += jsURLs[i].size;

		for (var i = 0; i < cssURLs.length; ++i)
			totalSize += cssURLs[i].size;

		var totalResources = jsURLs.length + cssURLs.length + 1;
		var numAddedResources = 0;
		var isUpgrading = false;
		try {
			isUpgrading = sessionStorage.getItem("favroIsUpgrading") == "true";
		} catch (error) {
		}

		if (window.meteorExtraReadyHolds === undefined)
			window.meteorExtraReadyHolds = 0;
		++window.meteorExtraReadyHolds;

		var reloadScheduled = false;

		function resourceError() {
			if (reloadScheduled)
				return;

			reloadScheduled = true;

			updateProgress("Error loading resource…", 0.0);
			setTimeout(function() {
				updateProgress("Retrying…", 0.0);
				setTimeout(function() {
					location.reload();
				}, 1000);
			}, 1000 + Math.random()*3000);
		}

		function resourceAdded() {
			++numAddedResources;
			if (numAddedResources == totalResources) {
				try {
					sessionStorage.removeItem("favroIsUpgrading");
				} catch (error) {
				}

				--window.meteorExtraReadyHolds;

				if (window.Meteor)
					Meteor.maybeReady();
			}
		}

		function getAbsoluteURL(url) {
			if (/^https?:\/\//.test(url))
				return url;
			else
				return location.origin + url;
		}

		var progressElement = document.getElementsByClassName("fui-loading-progress")[0];
		var progressInnerElement = document.getElementsByClassName("fui-loading-progress-inner")[0];
		var progressTextElement = document.getElementsByClassName("fui-loading-text")[0];

		function updateProgress(text, progress) {
			progressInnerElement.style.width = progress + "%";
			progressTextElement.textContent = text;

			if (progress < 10.0)
				progressElement.classList.remove("mod-shimmer-left");
			else
				progressElement.classList.add("mod-shimmer-left");

			sendInteropMessage({
				command: "loadProgress",
				data: { text: text, progress: progress },
			});
		}

		var loadedResources = 1;

		function loadResource(resource, onLoaded) {
			var request = new XMLHttpRequest();
			request.withCredentials = true;
			var lastLoaded = 0;

			function reportLoaded(loaded) {
				totalLoaded += (loaded - lastLoaded);
				lastLoaded = loaded;

				percentFinished = (totalLoaded / totalSize) * 100.0;

				updateProgress(isUpgrading ? "Upgrading…" : "Loading…", percentFinished);
			}

			request.onerror = request.onload = function() {
				reportLoaded(resource.size);

				++loadedResources;
				if (loadedResources == totalResources)
					updateProgress("Initializing…", 100.0);

				onLoaded(resource);
			};

			request.addEventListener("progress", function(event) {
				reportLoaded(event.loaded);
			});

			request.open("GET", getAbsoluteURL(resource.url));
			request.send();
		}

		var scriptElement = document.getElementsByClassName("scripts")[0];

		function addScriptToDOM(jsURL) {
			var script = document.createElement("script");
			script.type = "text/javascript";
			script.src = getAbsoluteURL(jsURL.url);

			script.onload = function() {
				jsURL.added = true;
				resourceAdded();
				addScripts();
			};
			script.onerror = resourceError;

			scriptElement.appendChild(script);
		}

		var nextJSToAdd = 0;
		function addScripts() {
			for (; nextJSToAdd < jsURLs.length; ++nextJSToAdd) {
				var jsURL = jsURLs[nextJSToAdd];
				if (!jsURL.readyToAdd)
					break;
				if (nextJSToAdd > 0 && !jsURLs[nextJSToAdd - 1].added)
					break;

				addScriptToDOM(jsURL);
			}
		}

		for (var i = 0; i < jsURLs.length; ++i) {
			loadResource(jsURLs[i], function(resource) {
				resource.readyToAdd = true;
				addScripts();
			});
		}

		for (var i = 0; i < cssURLs.length; ++i) {
			loadResource(cssURLs[i], function(resource) {
				var link = document.createElement("link");
				link.rel = "stylesheet";
				link.type = "text/css";
				link.className = "__meteor-css__";
				link.href = resource.url;
				link.onload = resourceAdded;
				link.onerror = resourceError;
				document.head.appendChild(link);
			});
		}

		resourceAdded();
	}

	if (jsURLs.length)
		document.addEventListener("DOMContentLoaded", doLoading);
	else
		doLoading();
})();
