// Table Hauptdatei
// Robert Blutner, 08.08.2010

var tables = new Array();

function Table(tableId, moduleName, currentPage, countPages)
{
	tables.push(this);
	
	this.pathPageFirst = "waf/templates/icons/resultset_first.png";
	this.pathPageFirstD = "waf/templates/icons/resultset_first_d.png";
	this.pathPagePrev = "waf/templates/icons/resultset_previous.png";
	this.pathPagePrevD = "waf/templates/icons/resultset_previous_d.png";
	this.pathPageNext = "waf/templates/icons/resultset_next.png";
	this.pathPageNextD = "waf/templates/icons/resultset_next_d.png";
	this.pathPageLast = "waf/templates/icons/resultset_last.png";
	this.pathPageLastD = "waf/templates/icons/resultset_last_d.png";
	
	/**
	 * @type Table
	 */
	var instance = this;
	
	this.tableId = tableId;
	this.moduleName = moduleName;
	
	this.element = $("#" + tableId);
	this.thead = this.element.find("thead");
	this.tbody = this.element.find("tbody");

	this.head = $("#" + tableId + "_head");
	
	this.imgPageFirst = this.head.find("img.first");
	this.imgPagePrev = this.head.find("img.prev");
	this.imgPageNext = this.head.find("img.next");
	this.imgPageLast = this.head.find("img.last");
	this.spanPages = this.head.find("span.pages");
	this.cmbSearch = this.head.find("select.cmbSearch");
	this.txtSearchExpression = this.head.find("input.txtSearchExpression");
	
	this.ckbSelectAll = $("#" + tableId + "_selectAll");
	this.rowCheckboxes = this.tbody.find("input[type=checkbox]");
	
	this.linkTemplate = null;
	
	this.onRowDoubleClick = null;
	
	this.searchExpression = null;
	this.searchColumn = null;
	
	this.customParams = new Array();
	this.customParamPrefix = "";
	
	this.registerCustomParam = function(paramName, paramValue)
	{
		instance.customParams[paramName] = paramValue;
	};
	
	this.setCustomParamPrefix = function(value)
	{
		instance.customParamPrefix = value;
	};
	
	/**
	 * Aktuelle Seite.
	 */
	this.currentPage = currentPage;
	
	/**
	 * Anzahl der Seiten.
	 */
	this.countPages = countPages;
	
	this.hide = function()
	{
		this.element.hide();
	};
	
	this.setLinkTemplate = function(value)
	{
		instance.linkTemplate = value;
	};
	
	/**
	 * Wird aufgerufen, wenn sich der Checked-Status der Checkbox
	 * "Alle selektieren" geändert hat.
	 */
	this.selectAllChanged = function()
	{
		if(instance.ckbSelectAll.attr("checked"))
		{
			instance.rowCheckboxes.attr("checked", "checked");
		}
		else
		{
			instance.rowCheckboxes.attr("checked", null);
		}
	};
	
	/**
	 * Wird aufgerufen, wenn sich der Checked-Status einer Checkbox
	 * im Tabellenkörper verändert hat (Zeile wurde selektiert oder
	 * deselektiert).
	 */
	this.checkChanged = function()
	{
		// Prüfen: Wie viele Zeilen sind selektiert
		var count = instance.countCheckedRows();
		if(count > 0 && count == instance.rowCheckboxes.length)
		{
			// Es wurden alle Zeilen selektiert
			instance.ckbSelectAll.attr("checked", "checked");
		}
		else
		{
			instance.ckbSelectAll.attr("checked", null);
		}
	};
	
	/**
	 * Gibt die Anzahl der selektierten Zeilen zurück.
	 * @return int
	 */
	this.countCheckedRows = function()
	{
		var count = 0;
		
		instance.rowCheckboxes.each(function() {
			if($(this).attr("checked")) count++;
		});
		
		return count;
	};
	
	/**
	 * Gibt die Ids aller selektierten Zeilen in einem Array zurück.
	 * @return Array
	 */
	this.getSelectedRowIds = function()
	{
		var result = new Array();
		
		instance.rowCheckboxes.each(function() {
			if($(this).attr("checked"))
			{
				var rowId = $(this).parent().parent().attr("row_id");
				result.push(rowId);
			}
		});
		
		return result;
	};
	
	this.pageFirstClicked = function()
	{
		instance.navigateToPage(0);
	};
	
	this.pagePrevClicked = function()
	{
		instance.navigateToPage(instance.currentPage - 1);
	};
	
	this.pageNextClicked = function()
	{
		instance.navigateToPage(instance.currentPage + 1);
	};
	
	this.pageLastClicked = function()
	{
		instance.navigateToPage(instance.countPages - 1);
	};
	
	this.cmbSearchChanged = function()
	{
		instance.searchChanged();
	}
	
	this.txtSearchExpressionChanged = function()
	{
		instance.searchChanged();
	}
	
	this.searchChanged = function()
	{
		instance.searchColumn = instance.cmbSearch.val();
		instance.searchExpression = instance.txtSearchExpression.val();
		
		instance.refresh();
	}
	
	/**
	 * Navigiert zu der angegebenen Seite.
	 * @param page Seite, zu welcher navigiert werden soll.
	 */
	this.navigateToPage = function(page)
	{
		if(page < 0) page = 0;
		if(page >= instance.countPages) page = instance.countPages - 1;
		instance.currentPage = page;
		instance.refreshPageNavigator();
		instance.refreshBody();
	};
	
	this.refreshPageNavigator = function()
	{
		var title = (this.currentPage + 1) + " von " + this.countPages;
		if(this.countPages == 0) title = "0 von 0";
		instance.spanPages.html(title);
		
		if(instance.currentPage == 0)
		{
			// Erste Seite
			instance.imgPageFirst.attr("src", instance.pathPageFirstD);
			instance.imgPageFirst.css("cursor", "default");
			instance.imgPagePrev.attr("src", instance.pathPagePrevD);
			instance.imgPagePrev.css("cursor", "default");
		}
		else
		{
			// Nicht erste Seite
			instance.imgPageFirst.attr("src", instance.pathPageFirst);
			instance.imgPageFirst.css("cursor", "pointer");
			instance.imgPagePrev.attr("src", instance.pathPagePrev);
			instance.imgPagePrev.css("cursor", "pointer");
		}
		
		if(instance.currentPage == instance.countPages - 1 || instance.countPages == 0)
		{
			// Letzte Seite
			instance.imgPageNext.attr("src", instance.pathPageNextD);
			instance.imgPageNext.css("cursor", "default");
			instance.imgPageLast.attr("src", instance.pathPageLastD);
			instance.imgPageLast.css("cursor", "default");
		}
		else
		{
			// Nicht letzte Seite
			instance.imgPageNext.attr("src", instance.pathPageNext);
			instance.imgPageNext.css("cursor", "pointer");
			instance.imgPageLast.attr("src", instance.pathPageLast);
			instance.imgPageLast.css("cursor", "pointer");
		}
	};
	
	/**
	 * Baut die Tabelle neu auf.
	 * @return
	 */
	this.refresh = function()
	{
		// Rahmendaten neu laden:
		// - Anzahl der Seiten
		
		var params = {
			"tableId" : instance.tableId,
			"moduleName" : instance.moduleName,
			"searchColumnName": instance.searchColumn,
			"searchExpression": instance.searchExpression
		};
		
		for(paramName in instance.customParams)
		{
			eval("params." + instance.customParamPrefix + paramName + " = '" + instance.customParams[paramName] + "';");			
		}
		
		waf.startToolRequest("table", "GetTableInformation", params, function(msg) {
			eval("var getTableInformationResult = " + msg + ";");
			
			if(getTableInformationResult.error != undefined)
			{
				alert("Fehler beim Laden der Tabelle:\r\n" + getTableInformationResult.error);
				return;
			}
			
			instance.countPages = getTableInformationResult.countPages;
			instance.currentPage = 0;
			
			// Tabelleninhalt neu Laden
			instance.refreshPageNavigator();
			instance.refreshBody();
		});
	};
	
	this.refreshBody = function()
	{
		var params = {
				"tableId" : instance.tableId,
				"moduleName" : instance.moduleName,
				"searchColumnName": instance.searchColumn,
				"searchExpression": instance.searchExpression,
				"page" : instance.currentPage
			};
		
		for(paramName in instance.customParams)
		{
			eval("params." + instance.customParamPrefix + paramName + " = '" + instance.customParams[paramName] + "';");			
		}
		
		waf.startToolRequest("table", "GetTableBody", params, function(msg) {
			instance.tbody.html(msg);
			instance.initializeRows();
		});
	};
	
	this.initializeRows = function()
	{
		instance.rowCheckboxes = instance.tbody.find("input[type=checkbox]");
		instance.rowCheckboxes.change(instance.checkChanged);
		
		instance.checkChanged();
		
		this.tbody.find("tr[class!=no-elements-message]").each(function() {
			$(this).hover(
				function() {
					$(this).find("td").css("backgroundColor", "#edeef5");
				},
				function() {
					$(this).find("td").css("backgroundColor", "white");
				}
			);
			
			$(this).find("td[class!=supress-click-action]").css("cursor", "pointer");
			
			$(this).find("td[class!=supress-click-action]").click(function() {
				if(instance.linkTemplate == null)
				{
					alert("WAF Table Fehler\r\nEs wurde kein Link-Template angegeben.");
				}
				
				var rowId = $(this).parent().attr("row_id");
				var newLocation = instance.linkTemplate.replace(/@row_id/, escape(rowId));
				location = newLocation;
			});
		});
	}
	
	// Event Handlers zuweisen
	
	this.ckbSelectAll.change(this.selectAllChanged);
	
	this.imgPageFirst.click(this.pageFirstClicked);
	this.imgPagePrev.click(this.pagePrevClicked);
	this.imgPageNext.click(this.pageNextClicked);
	this.imgPageLast.click(this.pageLastClicked);
	
	this.cmbSearch.change(this.cmbSearchChanged);
	this.txtSearchExpression.change(this.txtSearchExpressionChanged);
	this.txtSearchExpression.keyup(this.txtSearchExpressionChanged);
	
	this.refreshPageNavigator();
	this.initializeRows();
};

function TableTools()
{
	this.getTable = function(tableId)
	{
		for(var i = 0; i < tables.length; i++)
		{
			var table = tables[i];
			if(table.tableId == tableId) return table;
		}
		
		return null;
	};
};

var TableTools = new TableTools();
