/**
 * @fileoverview
 * atoolo - Cynapsis Kommunikationsagentur
 * @author Holger Veltrup
 * @version 0.9.2
 */

/**
 * Erzeugt ein neues Konfigurations-Objekt. Die Konfigurationsdaten werden per JSON-Request
 * vom Server geladen. Das AtooloConfig-Objekt sollte nicht mehrmals erzeugt werden.
 * Das einmal geladene AtooloConfig-Objekt, kann mit AtooloConfig.getInstance() erhalten werden.
 * @throws Error Wird geworfen, wenn bereits eine Instanz von AtooloConfig existiert.
 * @class
 * Die Atoolo-Konfiguration enthaelt Nutzer-, Server- und Tool-Spezifische Konfigurationsdaten,
 * die ueber AtooloConfig abgerufen werden koennen. Die Daten werden beim Erzeugen des
 * Konfigurations-Objektes vom Server mit Hilfe der '<code>/json/getConfiguration.jsp</code>'
 * geladen. Diese Daten enthalten zunaechst nur die allgemeinen Konfigurationsdaten.
 * Toolspezifische Konfigurationsdaten werden ueber die Methode {@link AtooloConfig#getWindowConfig}
 * bei Bedarf nachgeladen.
 */
//function AtooloConfig() {
//	if (AtooloConfig.instance != null) {
//		throw new Error(Lina.translate( "js.AtooloConfig.text1" ));
//	}
//	this.config = ResourceLoader.getJsonObject("/json/getConfiguration.jsp");
//	AtooloConfig.instance = this;
//}

AtooloConfig = {

	load: function(){
		this.config = ResourceLoader.getJsonObject("/json/getConfiguration.jsp");
	},

/**
 * Enthalt die Atoolo Konfiguration-Daten
 * @private
 */
	config: null,

///**
// * Enthalt die Atoolo Konfiguration-Instanz
// * @private
// */
//AtooloConfig.instance = null;

/**
 * Liefert das Konfigurations-Objekt
 * @return Konfigurations-Objekt
 * @type AtooloConfig
 */
	getInstance: function () {
		return this;
	},

/**
 * Loescht die Singleton-Instance
 */
	reset: function() {
		if (this.config.tools != null) {
			delete this.config.tools
		}
		if (this.config.user != null) {
			delete this.config.user
		}
	},


/**
 * Liefert das Root-Konfigurations-Element.
 * @return Root-Konfigurations-Element mit folgender Struktur:<br>
 * <pre>
 *	{<br>
 *		"scheme" : "http",<br>
 *		"host" : "atoolo.cynapsis.com",<br>
 *		"base" : "http://atoolo.cynapsis.com/",<br>
 *		"version" : "0.9.3",<br>
 *		"user" : null,<br>
 *		"advertisingUrl" : "62.112.130.1",<br>
 *		"debug" : "0",<br>
 *		"resources" : {<br>
 *			"main" : [<br>
 *				{<br>
 *					"id" : "idjsDatejs",<br>
 *					"type" : "js",<br>
 *					"os" : "",<br>
 *					"browser" : "",<br>
 *					"media" : "",<br>
 *					"url" : "/js/Date.js"<br>
 *				},<br>
 *				...<br>
 *				{<br>
 *					"id" : "idjsflashSniffer_helpervb",<br>
 *					"type" : "vb",<br>
 *					"os" : "",<br>
 *					"browser" : "msie",<br>
 *					"media" : "",<br>
 *					"url" : "/js/flashSniffer_helper.vb"<br>
 *				}<br>
 *			],<br>
 *			"init" : [...],<br>
 *			"registration" : [...],<br>
 *			"login" : [...],<br>
 *			"windowManager" : [...],<br>
 *			"desktop" : [...],<br>
 *		},<br>
 * 		"startmenu" : [<br>
 *			{<br>
 * 				"tool" : "myAdress",<br>
 *				"window" : "main",<br>
 *				"title" : "meine Adressen"<br>
 * 			},<br>
 *			{ ... }<br>
 *		],<br>
 *		"systembar" : [<br>
 *			{<br>
 *				"id" : "myMessageCenter",<br>
 * 				"title" : "Message Center"<br>
 * 			},<br>
 *			{ ... }<br>
 *		]<br>
 *	}<br>
 * </pre>
 * @type JSONObject
 */
	getRoot: function() {
		if (this.config == null){
	//		AT.log("invalid configuration", "error");
			return null;
		}
		return this.config;
	},

/**
 * Liefert den angemeldeten Nutzer oder <code>null</code>, wenn der Nutzer nicht angemeldet ist.
 * @return Der angemeldete Nutzer. Das JSONObject hat folgende Struktur:<br>
 *	<pre>
 *		{<br>
 *			"name" : "Peter Mustermann",<br>
 *			"firstName" : "Peter",<br>
 *			"lastName" : "Mustermann",<br>
 *			"salutation" : "gent", (bzw. "female")<br>
 *			"id" : "300000000000030",<br>
 *			"login" : "mustermann",<br>
 *			"session" : "7EEC95F570C67D14F2EEE67195F8B779.node2"<br>
 *		}<br>
 *	</pre>
 * @type JSONObject
 */
	getUser: function() {
		if (this.config == null){
			AT.log("invalid configuration", "error");
			return null;
		}
		return this.config.user;
	},

/**
 * Liefert die atoolo Version
 * @return atoolo Version
 * @type String
 */
	getVersion: function() {
		if (this.config == null){
			AT.log("invalid configuration", "error");
			return null;
		}
		return this.config.version;
	},

/**
 * Liefert die URL fuer die Werbung
 * @return URL fuer die Werbung
 * @type String
 */
	getAdvertisingUrl: function() {
		if (this.config == null){
			AT.log("invalid configuration", "error");
			return null;
		}
		return this.config.advertisingUrl;
	},

/**
 * Liefert den Debug-Level
 * @return Debug-Level
 * @type int
 */
	getDebugLevel: function() {
		if (this.config == null){
			AT.log("invalid configuration", "error");
			return null;
		}
		return this.config.debug;
	},

/**
 * Lieferot Resourcen des Desktop
 * @param {String} type Gibt den Typ der Resourcen an, die zurueckgegeben werden sollen.
 * @return Resourcen (css, js, vb) fuer den Desktop
 * @type Array
 */
	getResources: function(type) {
		if (this.config == null){
			AT.log("invalid configuration", "error");
			return null;
		}
		return this.config.resources[type];
	},

/*
 * Liefert die Tool-Konfiguration
 * @param {String} toolId Id des Tools vom dem eine Window-Konfiguration zurueckgegeben werden soll
 * @return Tool Konfiguration. Das JSONObject hat folgende Struktur:<br>
 * <pre>
 *	{<br>
 *		"id" : "myMeetings",<br>
 *		"base" : "/myMeetings",<br>
 *		"notifier" : null,<br>
 *		"windows" : {<br>
 *			<windowId> : <window-config>,<br>
 *			...<br>
 *		}<br>
 * </pre>
 */
	getToolConfig: function (toolId) {

	  if (this.config == null) {
			AT.log("invalid configuration", "error");
			return null;
		}
		if (this.config.tools == null) {
			this.config.tools = {};
		}
		var tool = this.config.tools[toolId];
		if (tool == null) {
	//    AT.log("tool");
			tool = ResourceLoader.getJsonObject("/json/getConfiguration.jsp?tool=" + toolId);
	    if (tool == null || tool.id == null) {
	//			AT.log("tool " + toolId + " not found", "error");
				return null;
			}
			this.config.tools[toolId] = tool;
	//    AT.log("this.config.tools[toolId]:"+this.config.tools[toolId]);
		}
	//  AT.log("toolConfig found:"+tool, "warn")
		return tool;
	},

/**
 * Liefert die Window-Konfiguration
 * @param {String} toolId Id des Tools vom dem eine Window-Konfiguration zurueckgegeben werden soll
 * @param {String} windowId Id des Windows das zurueckgegeben werden soll
 * @return Window Konfiguration. Das JSONObject hat folgende Struktur:<br>
 * <pre>
 *	{<br>
 *		"id" : "main",<br>
 *		"type" : "application",<br>
 *		"title" : "meine Adressen",<br>
 *		"jsClass" : "myAdress",<br>
 *		"url" : "/myAdress2/index.jsp",<br>
 *		"helpUrl" : "/myAdress2/help.jsp",<br>
 *		"width" : 550,<br>
 *		"height" : 365,<br>
 *		"minWidth" : 550,<br>
 *		"minHeight" : 365,<br>
 *		"functions" : {<br>
 *			"measurement" : true,<br>
 *			"minimize" : true,<br>
 *			"close" : true,<br>
 *			"help" : true<br>
 *		},<br>
 *		"resources" : [<br>
 *			{<br>
 *				"id" : "idmyAdresscssallcss",<br>
 *				"type" : "css",<br>
 *				"os" : "",<br>
 *				"browser" : "",<br>
 *				"media" : "",<br>
 *				"url" : "/myAdress2/css/all.css"<br>
 *			},<br>
 *			{ ... }<br>
 *		]<br>
 *	}<br>
 * </pre>
 * @type JSONObject
 */
	getWindowConfig: function (toolId, windowId) {
	//  AT.log("windowId:"+windowId);
		var tool = this.getToolConfig(toolId);
		if (tool == null) {
			return null;
		} else {
			var w = tool.windows[windowId];
			if (w == null) {
				AT.log("window '" + windowId + "' of tool '" + toolId + "' not found", "error");
				return null;
			}
			if (w.type == null) {
	  		AT.log("window '" + windowId + "' of tool '" + toolId + "' has no type" , "error");
				return null;
			}
	    tool.windows[windowId].title = Lina.translate("config."+toolId+"_"+windowId, null, "application");
	//    AT.log("|--windowconfigfound:"+tool.windows[windowId]+":"+tool.windows[windowId].title, "warn");
			return w;
		}
	},

/**
 * Ueberschreibt die Konfigurationsdaten fuer die Groesse eines Fensters. Die Daten werden nicht
 * auf dem Server gespeichert und gehen beim neu-laden von Atoolo verloren. Die Fenstergroesse wird
 * gespeichert um nach dem schliessen des Fensters, dieses wieder in der letzten grosse anzuzeigen
 *
 * @param {String} toolId Id des Tools, dessen Fenstergroesse gesetzt werden soll
 * @param {String} windowId Id des Fensters dessen Groesse gesetzt werden soll
 * @param {int} width Breite des Fensters in Pixel
 * @param {int} height Hoehe des Fensters in Pixel
 */
	setSize: function (toolId, windowId, width, height) {
		var w = this.getWindowConfig(toolId, windowId);
		if (w != null) {
			w.width = width;
			w.height = height;
		} else {
			AT.log("AtooloConfig.prototype.setSize: window " + windowId + " of tool " + toolId + " not found", "error");
		}
	},

/**
 * Setzt die Position eines Fensters. Die Daten werden nicht auf dem Server gespeichert und gehen beim
 * neu-laden von Atoolo verloren. Die Fensterposition wird gespeichert um nach dem schliessen des Fensters,
 * dieses wieder an der letzten Position zu positionieren
 *
 * @param {String} toolId Id des Tools, dessen Fensterposition gesetzt werden soll
 * @param {String} windowId Id des Fensters dessen Position gesetzt werden soll
 * @param {int} quadrant
 *	Der Quadrant gibt an, auf welche Seiten des Desktop sich die <code>x</code>- und </code>y</code>-Werte
 *	beziehen. Der Desktop ist in vier Quandranten aufgeteilt:
 *
 *	<br>
 *	<table border="1">
 *		<tr><td></td><td><code>x</code> pixel von links</td><td><code>x</code> pixel von rechts</td></td></tr>
 *		<tr><td><code>y</code> pixel von oben</td><td>1</td><td>2</td></tr>
 *		<tr><td><code>y</code> pixel von unten</td></td><td>4</td><td>3</td></tr>
 *	</table>
 *	<br>
 *	Ist <code>quadrant</code> gleich <code>null</code>, dann wird Quadrant <code>1</code> verwendet
 * @param {int} x Horizontale Position in Pixeln, abhaengig vom Quadranten
 * @param {int} y Vertikale Position in Pixeln, abhaengig vom Quandranten
 * @type void
 */
	setPosition: function (toolId, windowId, quadrant, x, y) {
		var w = this.getWindowConfig(toolId, windowId);
		if (w != null) {
			if (quadrant == null || quadrant == 1) {
				w.left = x;
				w.top = y;
				delete w.bottom;
				delete w.right;
			} else if (quandrand == 2) {
				delete w.left;
				w.top = y;
				delete w.bottom;
				w.right = x;
			} else if (quandrand == 3) {
				delete w.left;
				delete w.top;
				w.bottom = y;
				w.right = x;
			} else if (quandrand == 4) {
				w.left = x;
				delete w.top;
				w.bottom = y;
				delete w.right;
			} else {
	//			AT.log("AtooloConfig.prototype.setPosition: invalid quadrant " + quadrant, "error");
			}
		} else {
	//		AT.log("AtooloConfig.prototype.setPosition: window " + windowId + " of tool " + toolId + " not found", "error");
		}
	}
}