/**
 * Der SystemRepresentationManager verwaltet die Darstellung der einzelnen Systeme
 * in Tabs.
 */
var SearchalyzrSystemRepresentationManager = Class.create({
	/**
	 * Erzeugt einen neuen SystemRepresentationManager.
	 * 
	 * @param builder [SearchalyzrBuilder]
	 * Der HTML-Builder.
	 * 
	 * @param container [DOMObject]
	 * HTML-DOM-Objekt in das die Tab-Container jetzt eingefügt werden.
	 */
	initialize: function(builder, container) {
		/**
		 * Instance von SearchalyzrBuilder
		 * 
		 * @type SearchalyzrBuilder
		 */
		this.builder = builder;
		/**
		 * ID des aktuell aktiven Tab's.
		 */
		this.active = null;
		/**
		 * Container für die Tab-Title-Objekte.
		 * 
		 * @see SearchalyzrBuilder.createTabTitleContainer
		 * @type Object
		 */
		this.titleContainer = this.builder.createTabTitleContainer();
		/**
		 * Container für die Tab-Content-Objekte
		 * 
		 * @see SearchalyzrBuilder.createTabContentContainer
		 * @type Object
		 */
		this.contentContainer = this.builder.createTabContentContainer();
		
		this.summaryContainer = this.builder.createSummaryContainer();
		
		/**
		 * Hashliste aller Tabs.
		 * 
		 * @type Hash: System-ID => { id: <string>, label: <string>, titleElement: <object>, contentElement: <object> }
		 */
		this.tabs = {};
		
		this.builder.addTabContainer(
				container,
				this.titleContainer,
				this.contentContainer,
				this.summaryContainer);
	},
	
	/**
	 * Erzeugt, wenn noch nicht vorhanden, einen Tab für das System.
	 * 
	 * @param system [String]
	 * Tab-ID des Systems.
	 * 
	 * @param label [String]
	 * Bezeichner des Systems.
	 * 
	 * @return void
	 */
	provideTab: function(system, label, header) {
		if (this.tabs[system])
			return;
		
		var tab = {
				id: system,
				label: label
		};
		tab.titleElement = this.builder.createTabTitle(system, label);
		tab.contentElement = this.builder.createTabContent(system, label, header);
		
		var self = this;
		this.builder.addTabAction(tab.titleElement, function(event) {
			self.activateTab(system);
		});
		
		this.builder.addTabTitle(this.titleContainer, tab.titleElement);
		this.builder.addTabContent(this.contentContainer, tab.contentElement);
		
		this.tabs[system] = tab;
	},

	/**
	 * Gibt das Titelelement des Tabs zurück oder
	 * <i>null</i> wenn kein Tab für das System verfügbar ist.
	 *  
	 * @param system [String]
	 * ID des Systems.
	 * 
	 * @return [Object]
	 */
	getTabTitleContainer: function(system) {
		return this.tabs[system].titleElement;
	},
	
	/**
	 * Gibt das Inhaltselement des Tabs zurück oder
	 * <i>null</i> wenn kein Tab für das System verfügbar ist.
	 *  
	 * @param system [String]
	 * ID des Systems.
	 * 
	 * @return [Object]
	 */
	getTabContentContainer: function(system) {
		return this.tabs[system].contentElement;
	},
	
	/**
	 * Gibt die ID des ersten sichtbaren Tab zurück oder <i>null</i> wenn alle ausgeblendet sind.
	 * 
	 * @return string | null
	 */
	getRecent: function() {
		var self = this;
		var recent = null;
		Object.keys(this.tabs).each(function(tab) {
			if (self.builder.isTabVisible(self.tabs[tab].titleElement, self.tabs[tab].contentElement)) {
				recent = tab;
				throw $break;
			}
		});
		return recent;
	},
	
	/**
	 * @param system [String]
	 * ID des Systems.
	 * 
	 * @return void
	 */
	showTab: function(system) {
		this.builder.showTab(
				this.tabs[system].titleElement,
				this.tabs[system].contentElement);
	},
	
	/**
	 * @param system [String]
	 * ID des Systems.
	 * 
	 * @return void
	 */
	hideTab: function(system) {
		if (this.builder.isTabActive(
				this.tabs[system].titleElement,
				this.tabs[system].contentElement)) {
			this.activateTab(this.getRecent());
		}
		
		this.builder.hideTab(
				this.tabs[system].titleElement,
				this.tabs[system].contentElement);
	},
	
	/**
	 * Aktiviert den Tab und deaktiviert den aktiven Tab.
	 * 
	 * @param system [String]
	 * ID des Systems.
	 * 
	 * @return void
	 */
	activateTab: function(system) {
		if (this.active) {
			this.builder.deactivateTab(
					this.tabs[this.active].titleElement,
					this.tabs[this.active].contentElement);
			this.active = null;
		}
		
		if (system) {
			this.builder.activateTab(
					this.tabs[system].titleElement,
					this.tabs[system].contentElement);
			this.active = system;
		}
	}
	
});

