///////////////////////////////////////////////////////////////////////////////
//
// (C) 2015 ICE TEA GROUP LLC - ALL RIGHTS RESERVED
//
// 
//
// ALL INFORMATION CONTAINED HEREIN IS, AND REMAINS
// THE PROPERTY OF ICE TEA GROUP LLC AND ITS SUPPLIERS, IF ANY.
// THE INTELLECTUAL PROPERTY AND TECHNICAL CONCEPTS CONTAINED
// HEREIN ARE PROPRIETARY TO ICE TEA GROUP LLC AND ITS SUPPLIERS
// AND MAY BE COVERED BY U.S. AND FOREIGN PATENTS, PATENT IN PROCESS, AND
// ARE PROTECTED BY TRADE SECRET OR COPYRIGHT LAW.
//
// DISSEMINATION OF THIS INFORMATION OR REPRODUCTION OF THIS MATERIAL
// IS STRICTLY FORBIDDEN UNLESS PRIOR WRITTEN PERMISSION IS OBTAINED
// FROM ICE TEA GROUP LLC.
//
///////////////////////////////////////////////////////////////////////////////

/**
 * Wisej Loader
 *
 * Loads all the related javascript and stylesheet resources.
 */

var App = App || {};
var Wisej = Wisej || {};

(function (options) {

	options = options || {};

	var doc = document;
	var offlineUrl = options.offlineUrl;

	window.sessionStorage.setItem("Wisej.StartupUrl", location.href);

	// check browser compatibility.
	if (!checkBrowser(options))
		return;

	// show the loader.
	showLoader(options);

	// install the PWA service worker.
	installServiceWorker(options);

	// get the list of resources to load.
	loadResources(options, function (resources) {

		// did the server return an error?
		if (resources && resources.error)
		{
			alert(resources.error);
			return;
		}

		// add the resources to the page.
		if (resources && resources.length > 0) {

			// find the head element to inject the resources.
			var head = doc.getElementsByTagName("head")[0];

			// load css async.
			for (var i = 0; i < resources.length; i++) {
				var href = resources[i];
				if (href.indexOf(".css") > -1)
					loadCss(head, href);
			}

			// load js async in a dependency cascade.
			var jslist = [];
			for (var i = 0; i < resources.length; i++) {
				var href = resources[i];
				if (href.indexOf(".js") > -1)
					jslist.push(href);
			}
			if (jslist.length > 0) {
				var i = 0;
				var loadClosure = function () {
					if (i < jslist.length) {
						i++;
						loadScript(head, jslist[i - 1], loadClosure);
					}
				};
				loadClosure();
			}
		}
	});

	function loadCss(head, href) {

		var node = document.createElement("link");
		node.rel = "stylesheet";
		node.type = "text/css";
		node.href = href;
		head.appendChild(node);

	}

	function loadScript(head, href, callback) {

		var node = document.createElement("script");
		node.type = "text/javascript";
		//node.async = false;

		node.onreadystatechange = function () {
			if (this.readyState === "loaded" || this.readyState === "completed") {
				if (!this.__loaded) {
					this.__loaded = true;
					callback();
				}
			}
		};
		node.onload = function () {
			if (!this.__loaded) {
				this.__loaded = true;
				callback();
			}
		};

		node.src = href;
		head.appendChild(node);
	}

	/**
	 * loadResources
	 *
	 * Retrieves the list javascript and css files to load.
	 */
	function loadResources(options, callback) {

		if (options.enablePWA && !navigator.onLine) {
			location.href = offlineUrl;
			return;
		}

		var xhr = new XMLHttpRequest();
		xhr.open("GET", "resource.wx/init?_sc=" + new Date().getTime(), true);
		xhr.timeout = (options.responseTimeout || 120) * 1000;
		xhr.setRequestHeader("X-Referrer", location.href);
		xhr.setRequestHeader("X-Wisej-RequestType", "Resource");
		xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");

		xhr.onreadystatechange = function () {
			if (xhr.readyState == 4) {

				if (xhr.status == 200) {
					var resources = JSON.parse(xhr.responseText);
					callback(resources);
				}
				else {

					if (options.enablePWA) {
						location.href = offlineUrl;
					}
					else {
						alert("Loader Error: " + xhr.statusText);
					}
				}
			}
		};
		xhr.ontimeout = function () {

			if (options.enablePWA) {
				location.href = offlineUrl;
			}
			else {
				alert("Loader Timeout!");
			}
		};

		xhr.send();
	}

	/**
	 * showLoader
	 *
	 * Displays the Wisej loader, it can be overridden in the application.
	 */
	function showLoader(options) {

		if (options.showLoader === false)
			return;

		if (!doc.body) {
			window.addEventListener("load", function () {
				showLoader(options);
			});

			return;
		}

		var loader = options.loader || "resource.wx/loader.svg";
		var el = doc.createElement("div");
		el.innerHTML =
			"<img id='wisej.loader'" +
			" src='" + loader + "'" +
			" style='display:block;position:fixed;top:50%;left:50%;transform:translateX(-50%) translateY(-50%)'/>";
		doc.body.appendChild(el.firstChild);
	}

	/**
	 * checkBrowser
	 *
	 * Verifies the minimum browser requirements:
	 *  
	 *  - Must support Ajax
	 *  - Must support addEventListener
	 *  - Optionally verify the custom browser check.
	 */
	function checkBrowser(options) {

		var supported =
			window.XMLHttpRequest
			&& window.addEventListener;

		if (supported && options.browserCheck)
		{
			try {
				supported = eval(options.browserCheck) !== false;
			}
			catch (e) { }
		}

		if (!supported) {

			// redirect to the not-supported page configured in the options.
			if (options.notSupportedUrl)
				location.href = options.notSupportedUrl;

			return false;
		}

		return true;
	}

	/**
	 * installServiceWorker
	 * 
	 * Downloads and installs the PWA service worker.
	 */
	function installServiceWorker(options) {

		if (!options.enablePWA)
			return;

		// saves the install prompt and loads the service worker.

		if ("serviceWorker" in navigator) {

			window.addEventListener("beforeinstallprompt", function(e) {

				// save the prompt event to allow the app to call
				// Wisej.Core.showPWAPrompt().
				window.$$deferredPrompt = e;

			});

			navigator.serviceWorker.register("resource.wx?f=wisej-worker.js&v=3.5.12.4");
		}
	}

})({"loader":null,"enablePWA":false,"offlineUrl":"","showLoader":false,"responseTimeout":300,"browserCheck":null,"notSupportedUrl":"resource.wx/Wisej.Framework/NotSupported.html"});
