/**
 * @fileoverview
 * Atoolo - Cynapsis Kommunikationsagentur
 * @author Holger Veltrup
 * @version 0.9.3
 */

AtooloLoadingBar = {

/**
 * Konstruktor
 * @class
 * Die Loading-Bar zeigt einen Fortschrittsbalken fuer zu ladene Resource
 */
	init: function AtooloLoadingBar() {
		this.loader = {};
		this.onLoadCallbackHandler = [];
	},

/**
 * Aktuallisierungs-Intarvall in Millsekunden
 * @private
 */
	REFRESH_INTERVAL: 200,

/**
 * Zur Zeit aktive Loader
 * @private
 */
	loader: null,

/**
 * Anzahl der aktiven Loader
 * @private
 */
	loaderCounter: 0,

/**
 * HTML-Div-Element der Status-Bar
 * @private
 */
	barStatus: null,

/**
 * HTML-Div-Element der Status-Bar
 * @private
 */
	refresher: null,

/**
 * Liste von Funktionen, die ausgefuehrt werden sollen, wenn
 * alle Resources geladen wurden
 * @private
 */
	onLoadCallbackHandler: null,

/**
 * Fuegt eine Funktion hinzu, die ausgefuehrt werden soll, wenn
 * alle Resourcen geladen wurden
 * @param {Function} callback auszufuehrende Funktion
 * @type void
 */
	addOnLoadCallbackHandler: function(callback) {
		this.onLoadCallbackHandler.push(callback);
	},

/**
 * Fuehgt einen neuen ResourceLoader hinzu
 * @param {ResourceLoader} loader Hinzuzufuegender Resource-Loader
 * @type void
 */
	addLoader: function(loader) {
		if (loader.getAsynchronLoadStatus() < 100) {
			if (!this.loader[loader.getId()]) {
				this.loader[loader.getId()] = loader;
				this.loaderCounter++;
			}
			if (this.refresher == null) {
				this.refresh();
				this.refresher = window.setInterval("AtooloLoadingBar.refresh()", this.REFRESH_INTERVAL);
			}
		}
	},

/**
 * Liefert den aktuellen Lade-Status
 * @return Akueller Stand des zu ladenen Resoucen in Prozent
 * @type int
 */
	getStatus: function() {
		if (this.loaderCounter == 0) {
			return 100;
		}

		var toRemove = [];

		var status = 0;
		for (id in this.loader) {

			var loaderStatus = 0;
			if (ResourceLoader.exists(id)) {
				loaderStatus = this.loader[id].getAsynchronLoadStatus();
			} else {
				loaderStatus = 100;
			}

			if (loaderStatus == 100) {
				toRemove.push(id);
			}
			status += loaderStatus;
		}

		var total = (status) / this.loaderCounter;

		for (var i = 0; i < toRemove.length; i++) {
			delete this.loader[toRemove[i]];
			this.loaderCounter--;
		}

		return total;
	},

/**
 * Aktuellisiert den Ladebalken
 * @type void
 * @private
 */
	refresh: function() {
		var status = this.getStatus();
		this.show(status);
		if (status == 100) {
			if (this.refresher != null) {
				window.clearInterval(this.refresher);
				this.refresher = null;
			}
			for (var i = 0; i < this.onLoadCallbackHandler.length; i++) {
				try {
					this.onLoadCallbackHandler[i]();
				} catch (e) {
					AT.log("onLoadCallbackHandler error: " + e, "error", e);
				}
			}
			this.onLoadCallbackHandler = [];
			this.hide();
		}
	},

/**
 * Zeigt den Ladebalken auf dem Desktop
 * @type void
 */
	hide: function() {
		if (this.barStatus != null) {
			Lina.get("loadingBar").style.visibility = "hidden";
			this.barStatus.style.width = "0%";
		}
	},

/**
 * Zeigt den Ladebalken auf dem Desktop
 * @type void
 */
	show: function(value) {

		this.barStatus = Lina.get("loadingProcessBarStatus");

		if (this.barStatus == null) {

			var barMain = document.createElement("div");
			barMain.id = "loadingBar";

			var title = document.createElement("div");
			title.innerHTML = Lina.translate("js.AtooloLoadingBar.text1", null, "application");
			barMain.appendChild(title);

			var bar = document.createElement("div");
			bar.id = "loadingProcessBar";
			barMain.appendChild(bar);

			this.barStatus = document.createElement("div");
			this.barStatus.id = "loadingProcessBarStatus";
			bar.appendChild(this.barStatus);

			document.body.appendChild(barMain);
		}
		this.barStatus.style.width = value + "%";
		Lina.get("loadingBar").style.visibility = "visible";
	}
}