var wacker = wacker || {};
wacker.textTableFilterShowAll = wacker.textTableFilterShowAll || 'alle anzeigen';
wacker.textTableFilterInit = wacker.textTableFilterInit || 'Filter einschalten';
wacker.textTableFilterRemove = wacker.textTableFilterRemove || 'Filter ausschalten';

jQuery(document).ready(function ($) {
	
	
	// strip unnecessary white-space
	var regexNormalizeSpaces = /\s+/g;
	function normalizeSpaces(str) {
		str = $.trim(str);
		str = str.replace(regexNormalizeSpaces, ' ');
		return str;
	}
	
	

	$('table.fn-filter').each(function (numTable) {
		var table = $(this);
		var toggleFilter; // link zum aktivieren des filters
		var thead; 
		var firstRow; // letzte zeile mit überschriften
		var shown = false; // togglefilter geklickt?
		var rows; // datenzeilen
		var filterControlRow; // zeile mit einstellungen der spalten
		var rowNumHeader = /header-row-(\d+)/.exec(this.className); // unter welcher zeile soll der filter angezeigt werden, 1-basiert
		rowNumHeader = +(rowNumHeader && (rowNumHeader[1] - 1)) || 0;
		
		// hat diese tabelle einen header?
		if (!table.find('thead').length) {
			firstRow = table.find('tr:eq(' + rowNumHeader + ')');
			rows = table.find('tr:gt(' + rowNumHeader + ')');
			filterControlRow = table.find('tr:eq(0)').children();
		} else {
			thead = table.find('thead:eq(0)')
			firstRow = thead.children('tr:eq(' + rowNumHeader + ')');
			rows = table.find('tbody > tr');
			filterControlRow = thead.children('tr:eq(0)').children();
		}
		
		var filterRow = $('<tr style="display:none;" class="space"/>'); // die spätere zeile mit filtern
		var currentFilterLink; // aktuell ausgewählter filter
		var currentListItem; // li-element um aktuellen filter... :|
		
		
		firstRow.children().each(function (numHeaderCell) {
			var th = $(this);
			var tds = rows;
			var filterHead = $('<td headers="' + (this.id || (this.id = 'mdm-head-' + numTable + '-' + numHeaderCell)) + '" class="' + this.className + '"/>');
			var filterCell;
			var filterList;
			var text;
			var liFirst = $('<li style="display:none"/>');
			filterRow.append(filterHead);
			if (filterControlRow.eq(numHeaderCell).hasClass('fn-filter')) {
				tds = rows.find('td:eq('+ numHeaderCell + ')')
				filterList = $('<ul/>').append(liFirst);
				filterCell = $('<div class="tooltip-navigation"/>').hover(function (e) {
					filterList.show();
				}, function (e) {
					filterList.hide();
				});
				filterHead.append(filterCell);
				var column = {};
				var numFilterValues = 0;
				var headLink = $('<a href="#">' + wacker.textTableFilterShowAll + '</a>').click(function (e) {
					rows.show();
					currentFilterLink && currentFilterLink.returnToInit();
					currentListItem && $(currentListItem).show();
					return false;
				});
				var currentFilter = $('<a href="#" style="display:none" onclick="return false;"/>');
				currentFilter.returnToInit = function () {
					this.before(headLink).hide();
					filterList.hide();
					liFirst.hide();
					$(currentListItem).show();
				};
				tds.each(function (k) {
					var text = $(this).text();
					text = normalizeSpaces(text);
					if (text) {
						if (!column.hasOwnProperty(text)) {
							column[text] = [this.parentNode];
							++numFilterValues;
						} else {
							column[text].push(this.parentNode);
						}
					}
				});
				
				// spalte nur filterbar, wenn mehr als ein konkreter filterwert gefunden wurde
				if (numFilterValues > 1) {
					filterCell.append($('<ul class="filter"/>').append($('<li/>').append(headLink).append(currentFilter).append(filterList)));
					// closure je listeneintrag (für text)
					function step(text) {
						filterList.append(
							$('<li/>').append(
								$('<a href="#">' + text + '</a>').click(function (e) {
									rows.hide();
									$(column[text]).show();
									currentFilterLink && currentFilterLink.returnToInit();
									currentFilter.html(text).show();
									liFirst.prepend(headLink).show();
									filterList.hide();
									currentFilterLink = currentFilter;
									currentListItem = this.parentNode;
									$(this.parentNode).hide();
									return false;
								})
							)
						);
					}
					for (text in column) {
						step(text);
					}
				}
			}
		});
		
		// filterlink erzeugen -- momentan nicht verwendet
		toggleFilter = $('<a class="toggleFilter" href="#">' + wacker.textTableFilterInit + '</a>').click(function (e) {
			if (shown = !shown) {
				filterRow.show();
				$(this).html(wacker.textTableFilterRemove);
			} else {
				filterRow.hide();
				rows.show();
				currentFilterLink && currentFilterLink.returnToInit();
				$(this).html(wacker.textTableFilterInit)
			}
			return false;
		});
		
		// wenn gefilterte spalten, dann anzeigen
		if (filterControlRow.filter('.fn-filter').length > 0) {
			firstRow.after(filterRow);
			//table.before(toggleFilter);
			toggleFilter.click();
		}
		
	});

});

