
		window.tableColumnVisibility = function (dv, col, vis) {
			if (typeof dv === 'string') {
				dv = $('#' + dv + '-table');
			}
			var tblrow = dv.find('.fop-table-header .fop-table-column');
			var idx; // index of our col
			tblrow.each(function (i, headercol) {
				headercol = $(headercol);
				if (headercol.data('column') == col) {
					idx = i; // save index for all rows
					headercol.data('collapsed', vis ? 0 : 1);

					// save to db
					var updateData = {dataview: tblrow.closest('.fop-table').data('table-id'), columns: {}};
					updateData.columns[col] = {
						width: headercol.data('width'),
						order: headercol.data('order'),
						collapsed: headercol.data('collapsed')
					}
					$.get('FOP/Index/dataview?data=' + encodeURIComponent(JSON.stringify(updateData)));


					if (vis) {
						headercol.show();
					} else {
						headercol.hide();
					}
				}
			});
			dv.find('.fop-table-body-inner .fop-table-row, .fop-table-row-aggregate').each(function (i, row) {
				var xcol = $(row).find('.fop-table-column')[idx];
				if (vis) {
					$(xcol).show();
				} else {
					$(xcol).hide();
				}
			});
		}
		$(function () {
			var isDown = false, x;
			function upgradeTable(tblrow) {
				if (!tblrow.length) return;
				// updateSort(tblrow); // TODO: aktivieren, sobald im header und je Item data-column und data-order gesetzt ist (z.B. aus Session-Daten)
				tblrow.find('.fop-column-handle').each(function (i, handle) {
					// Resize-Funktion je Titel
					$(handle).mousedown(function (e) { isDown = handle.parentNode; x = e.pageX; e.preventDefault(); });
				});

				// Sortierbarkeit der Items
				tblrow.sortable({cursor: 'grabbing', axis: 'x', handle: '.title', update: function (event, ui) {
					// Nummerierung der trs updaten
					tblrow.find('.fop-table-column').each(function (i, el) {
						$(el).data('order', i+1);
					});
					// alle Zellen umsortieren
					updateSort(tblrow);
				}});

				// Summenzeile in den CF-Header kopieren
				var feature = tblrow.closest('.fop-form-feature');
				feature.find('.fop-form-feature-title-addon').text(feature.find('.fop-table-row-aggregate').text());

				// Summen-Zellen in den DV-Kopf kopieren
				tblrow.closest('.fop-dv').find('.fop-table-column-aggregate').each(function(i, v) {
					v = $(v);
					var col = v.data('column');
					tblrow.closest('.fop-dv').find('.fop-dv-aggregate[data-column="'+col+'"]').css('display', 'inline-block');
					tblrow.closest('.fop-dv').find('.fop-dv-aggregate[data-column="'+col+'"] .fop-dv-aggregate-value').html(v.html());
				});
			}
			// Sortierung nach data-sort erzwingen
			function updateSort(tblrow) {
				// Sortierung aufbauen
				var columns = {};
				var updateData = {dataview: tblrow.closest('.fop-table').data('table-id'), columns: {}};
				tblrow.find('.fop-table-column').each(function (i, el) {
					var column = $(el).data('column') || '_header';
					var order = $(el).data('order');
					columns[column] = order;
					if (column != '_header') {
						updateData.columns[column] = {width: $(el).data('width'), order: order, collapsed: $(el).data('collapsed')};
					}
				});
				// jede Zeile gleich sortieren
				tblrow.closest('.fop-table').find('.fop-table-row').each(function (i, row) {
					$(row).find('.fop-table-column').sort(function (a, b) {
						return columns[$(a).data('column') || '_header'] - columns[$(b).data('column') || '_header'];
					}).appendTo(row);
				});
				// neue Zuordnung speichern
				$.get('FOP/Index/dataview?data=' + encodeURIComponent(JSON.stringify(updateData)));
			}
			// Hilfsfunktion, um globales Move der Splitter zu behandeln
			function stopDrag() { isDown = false; };
			function onMove(e) {
				if (isDown) {
					var col = $(isDown);
					var index = col.closest('.fop-table-header').find('.fop-table-column').toArray().indexOf(col[0]);
					var newWidth = col.outerWidth() - x + e.pageX;
					if (newWidth < 40) newWidth = 40;
					col.css({width: newWidth + 'px'});
					col.data('width', newWidth);
					x = e.pageX;
					col.closest('.fop-table').find('.fop-table-row').each(function (i, e) {
						$($(e).find('.fop-table-column')[index]).css({width: newWidth + 'px'});
					});
					var columns = {};
					columns[col.data('column')] = {'width': newWidth, 'order': col.data('order'), 'collapsed': col.data('collapsed')};
					$.get('FOP/Index/dataview?data=' + encodeURIComponent(JSON.stringify({'dataview': col.closest('.fop-table').data('table-id'), 'columns': columns})));
					e.preventDefault();
				}
			};
			$(window.document).on('mousemove', onMove);
			$(window.document).on('mouseup', stopDrag);

			$('.fop-table-header').each(function (i, tblrow) {
				upgradeTable($(tblrow));
			});
			window.upgradeTable = upgradeTable;
		});
	