/**
 * SuperFilter Parser und Extraktionsfunktionen
 *
 * @author Volker Kokula
 * @date 2009-08-19
 */





/**
 * Superfilter Funktionssammlung um Namensraum nicht zu vollzuspammen
 */
function SuperFilter(table) {

	/**
	 * Zaehlt die Anzahl der aktuell sichtbaren Spalten in der Tabelle
	 */
	this.visibleColumns = function () {
		var count = 0;
		
		$(table +" thead th").each(function (index, domElement) {
			if ("none" != $(domElement).css("display")) {
				++count;
			}
		});
		
		/* Die Spalten ,,Produktname'' und ,,Preis'' sind immer sichtbar
		 */
		return count - 2;
	}

	/**
	 * Hooks fuer Begin und Ende der Sortierung definieren. Es muss die
	 * Hintergrundfarbe entsprechend der neuen Sortierung alternierend
	 * angepasst werden
	 */
	$(table).bind("sortEnd", function() {
		$(table +" tbody tr:even").css("background-color", "#EBEFF2");
		$(table +" tbody tr:odd").css("background-color", "transparent");
	});


	/**
	 * Filter scharf machen (bei Klick wird aktueller Status der Checkbox
	 * ausgelesen und entsprechend die Spalte hinzugefuegt oder entfernt
	 */
	var self = this;
	$(table +"-filter li.filter").click(function () {
		var li_id = $(this).attr("id");
		var attr_id = li_id.replace(/^filter-/, '');
		var checkbox_id = "filter-checkbox-"+ attr_id;
		var checkbox = document.getElementById(checkbox_id);

		var show_column = checkbox.checked;
		
		if (show_column) {
		
			/* Wenn Spalte bereits sichtbar ist haben wir zwar ein Logikproblem
			 * aber das muessen wir dem Benutzer ja nicht noch per Warnmeldung
			 * auf die Nase binden
			 */
			if ("none" != $(".column-"+ attr_id).css("display")) {
				return;
			}
		
			/* Es wird versucht eine Spalte anzuzeigen. Wenn bereits vier
			 * Spalten sichtbar sind, dann geben wir dem Benutzer einen
			 * Warnhinweis aus
			 */
			if (self.visibleColumns() < 4) {
				$(".column-"+ attr_id).show();
				checkbox.checked = true;
			} else {
			
				/* Checkbox deaktivieren, Warnhinweis einblenden, Warten (geht
				 * nur indem wir ein anderes Element toggeln) und anschliessend
				 * Warnhinweis wieder ausblenden
				 */
				checkbox.checked = false;
				$(table +"-warning-too-many").slideDown("slow", function () {
					$(table +"-warning-too-many .waiter").toggle(5000, function() {
						$(table +"-warning-too-many").slideUp("normal");
					});
				});
			}

		} else {
			$(".column-"+ attr_id).hide();
			checkbox.checked = false;
		}
	});
}



/**
 * Allgemeine Zahlenwertextraktion
 */
$.tablesorter.addParser({

	/* set a unique id
	 */
	id: 'european-numeric-value',

	/* return false so this parser is not auto detected
	 */
	is: function(s) {
		return false;
	},

	/* format your data for normalization
	 */
	format: function(s) {
		var float_str = "";
		
		if(-1 != s.search(/([0-9]+).?mcd/)) {
			s = s.split("mcd")[0];
		}
		
		var valid_characters = "0123456789,-";
		for (var i = 0; i < s.length; ++i) {
			if (-1 == valid_characters.indexOf(s.charAt(i))) {
				continue;
			}
			
			float_str += s.charAt(i);
		}

		
		/* Standardmaessig absteigende Sortierung zu erhalten ist der
		 * extrahierte Wert mit ^-1 zu potenzieren
		 */

		var res = 1.0 / float_str.replace(/,/, ".");
		
		return res;
	},

	/* set type, either numeric or text
	 */
	type: 'numeric'
});


