/**
 * Managed die Repräsentation der Daten einer Kategorie.
 */
var SearchalyzrDataRepresentationManager = Class.create({
	/**
	 * Erzeugt eine neue Daten-Representation für eine Kategorie.
	 * 
	 * @param builder [SearchalyzrBuilder]
	 * Der HTML-Builder.
	 * 
	 * @param container [Object]
	 * Der Kategorie-Container, der mit builder.createCategory erzeugt wurde.
	 */
	initialize: function(systemManager, container) {
		var self = this;
		
		/**
		 * Der zugehörige SystemManager.
		 */
		this.systemManager = systemManager;
		/**
		 * Der Kategorie-Container.
		 */
		this.container = container;
		/**
		 * Der aktuelle Datenbestand.
		 */
		this.data = null;
		
		/**
		 * Aktueller Offset-Index.
		 * 
		 * @sameas this.data.offset
		 * @type integer
		 */
		this.offset = 0;
		
		/**
		 * Die erste vom Suchsystem zurückgelieferte Seite
		 * definiert diesen Wert.
		 */
		this.pageCount = null;
		
		/**
		 * Aktuelles Sortierfeld.
		 * 
		 * @sameas this.data.sorting
		 * @type ?
		 */
		this.sorting = null;
		
		/**
		 * Die Tabelle zur Repräsentation in Tabelarischer-Form.
		 * 
		 * @type Object
		 */
		this.table = null;
		/**
		 * Zeiger, der anzeigt, dass diese Kategorie die einzig sichtbare
		 * in diesem Tab ist.
		 */
		this.uniq = false;
		var builder = this.systemManager.searchalyzr.builder;
		
		// Erzeuge die Tabelle und Liste
		this.table = builder.createTable();
		/**
		 * Die Liste zur Repräsentation in Listen-Form.
		 */
		this.list = builder.createList();
		// Erzeuge den PageBrowser, mit Prev-/Next-Funktion
		/**
		 * Der PageBrowser für diese Kategorie.
		 * 
		 * @type Object
		 */
		this.pageBrowser = builder.createPageBrowser(
				function() {
					if (!self.data)
						return;
					if (self.pageCount == null)
						self.pagecount = self.data.rows.length;
					var offsetPrev = self.offset - self.pageCount;
					if (offsetPrev<0)
						offsetPrev = 0;
					self.systemManager.updateCategory(self.data.id, offsetPrev);
				},
				function() {
					if (!self.data)
						return;
					if (self.pageCount == null)
						self.pageCount = self.data.rows.length;
					self.systemManager.updateCategory(self.data.id, self.offset + self.pageCount);
				});
		builder.addRefreshFunction(container, function (){
					if (!self.data)
						return;
					self.systemManager.updateCategory(self.data.id, self.offset);
				});
		// Füge die Elemente in den Kategorie-Container ein.
		builder.addTable(container, this.table);
		builder.addList(container, this.list);
		builder.addPageBrowser(container, this.pageBrowser);
	},
	
	/**
	 * @param data [Object] - die JSON Antwort des searchalyzrs
	 * Daten-Definitionen:
	 * {
	 *   rows: [
	 *     {
	 *       cells: [
	 *         { linkTarget: <string>, text: <string>, style: <string>, link: <string> },
	 *         ...
	 *       ]
	 *     },
	 *     ...
	 *   ],
	 *   label: <string>,
	 *   totalHits: <integer>,
	 *   columnDefinition: [
	 *     { label: <string>, align: <string>, sortable: <boolean>, id: <string> },
	 *     ...
	 *   ],
	 *   offset: <integer>,
	 *   sorting: <string | null>,
	 *   id: <string>
	 * }
	 */
	setData: function(data, system) {
		var builder = this.systemManager.searchalyzr.builder;
		this.data = data;
		if (data == null) {
			this.offset = 0;
			this.sorting = null;
		} else {
			this.offset = data.offset;
			this.sorting = data.sorting;
			if (data.rows.size() > 0) {
				if (this.pageCount == null)
					this.pageCount = data.rows.length;
				Element.extend(this.table);
				Element.extend(this.list);
				Element.extend(this.container);
				builder.updateTableHeaders(this.table, data.columnDefinition, this.sorting, this.container);
				builder.updateTableData(this.table, data.rows, system);
				builder.showTable(this.table);
				builder.hideList(this.list);
				if (data.totalHits < this.systemManager.searchalyzr.pageCount) {
					builder.hidePageBrowser(this.pageBrowser);
				} else {
					builder.showPageBrowser(this.pageBrowser);	
					builder.updatePageBrowser(this.pageBrowser, this.pageCount, this.offset, data.totalHits);
				}
				builder.showCategory(this.container);
				return;
			}
		}

		Element.extend(this.table);
		Element.extend(this.list);
		Element.extend(this.container);
		builder.hideTable(this.table);
		builder.hideList(this.list);
		builder.hideCategory(this.container);
	},
	
	isVisible: function() {
		return this.systemManager.searchalyzr.builder.isCategoryVisible(this.container);
	},
	
	isUniq: function() {
		return this.uniq;
	},
	
	setUniq: function(uniq) {
		this.uniq = uniq;
		if (uniq) {
			this.systemManager.searchalyzr.builder.hideCategoryTitle(this.container);
		} else {
			this.systemManager.searchalyzr.builder.showCategoryTitle(this.container);
		}
	}
	
});
