/*
 * Javascript-Bibliothek zur Matrix42-Events Extension
 *
 * @author Maximilian Hundertmark <max.hundertmark@dkd.de>
 * @version 0.2 <stable>
 */
/**
 * Hilfsfunktion: Liefert den Textinhalt des übergebenen Knotens zurück
 *
 * @param	HTML Object	node	der Knoten, dessen Textinhalt gesucht wird
 * @return	string		value	der Textinhalt des gesuchten Knotens
 */
function getValue(node) {
	while((node.nodeType != 3) && (node.firstChild != null)) {
		node = node.firstChild;
	}

	if (node.nodeType == 3) {
		value = node.nodeValue;
	} else {
		value = null;
	}

	if (datum = testDate(value)) {
		value = datum;
	}

	return value;
}

/**
 * Prüft, ob es sich bei dem übergebenen String um ein Datum handelt
 *
 * @param	string	text	der zu prüfende String
 * @return	mixed			UNIX-Timestamp, wenn es ein Datum ist, sonst false
 */
function testDate(text) {
	var pCount = 0;
	var mCount = 0;

	for (var i = 0; i < text.length; i++) {
		if (text[i] == '.') {
			pCount++;
		}
		if (text[i] == '-') {
			mCount++;
		}
	}

	var elemente = false;

	if ((pCount == 2) || ((pCount == 3) && (mCount == 1))) {
		if (pCount == 3) {
			var jahr = text.substr(14, 4);
			text = text.substr(0, 5) + '.'+jahr;
		}
		elemente = text.split('.');
	} else {
		if ((mCount == 2) || (mCount == 4)) {
			if (mCount == 4) {
				text = text.substr(0, 10);
			}
			elemente = text.split('-');
		}
	}

	if (elemente) {
		if (elemente[0].length == 4) {
			text = elemente[0]+'/'+elemente[1]+'/'+elemente[2];
		} else {
			text = elemente[2]+'/'+elemente[1]+'/'+elemente[0];
		}
	} else {
		var dt = false;
	}

	return text;
}

/**
 * Sortiert eine HTML-Tabelle anhand einer bestimmten Spalte und mittels des
 * übergebenen Kriteriums
 *
 * @param	string		tabellenID	die HTML id der Tabelle
 * @param	HTML Object	spalte		das HTML Element der Spalte, nach der sortiert werden soll
 * @param	string		kriterium	Art der Sortierung "aufsteigend/absteigend"
 * @return	void
 */
function sortTable(tabellenID, spalte, kriterium) {
	tabellenkopf = document.getElementById(tabellenID).getElementsByTagName('thead')[0];
	tabelle = document.getElementById(tabellenID).getElementsByTagName('tbody')[0];
	spalten = tabellenkopf.firstChild.childNodes;
	sortierkriterium = spalte.firstChild.nodeValue;

	if (tabelle.hasChildNodes()) {
		zeilen = tabelle.childNodes;

		for (var i=0; i < spalten.length; i++) {
			spaltentitel = spalten[i].firstChild.firstChild.nodeValue;
			if (spaltentitel == sortierkriterium) {
				sortierendeSpalte = i;
			}
		}

		spaltenwerte = new Array();

		for (var i=0; i < zeilen.length; i++) {
			knoten = zeilen[i].childNodes[sortierendeSpalte].firstChild;
			wert = getValue(knoten);
			spaltenwerte.push(wert);
		}

		sortiert = spaltenwerte.sort();
		sortierteKnoten = new Array();

		while (sortiert.length > 0) {
			vergleichswert = sortiert.pop();
			var i = 0;
			for (var i = 0; i < zeilen.length; i++) {
				if (getValue(zeilen[i].childNodes[sortierendeSpalte].firstChild) == vergleichswert) {
					sortierteKnoten.push(zeilen[i]);
					tabelle.removeChild(zeilen[i]);
				}
			}
		}

		if (kriterium == 'aufsteigend') {
			sortierteKnoten = sortierteKnoten.reverse();
			spalte.setAttribute('onclick', 'sortTable(\''+tabellenID+'\', this, \'absteigend\'); return false;');
		} else {
			spalte.setAttribute('onclick', 'sortTable(\''+tabellenID+'\', this, \'aufsteigend\'); return false;');
		}

		// Tabelle neu befüllen mit sortierten Elementen
		for (var i = 0; i < sortierteKnoten.length; i++) {
			tabelle.appendChild(sortierteKnoten[i]);
		}
	}
}

/**
 * Filtert eine HTML-Tabelle anhand der Klassennamen der einzelnen Zeilen
 *
 * @param	string		tableID	die HTML id der Tabelle
 * @param 	HTML Object	element	das HTML-Element, welches den Wert des Filters enthält
 * @return	void
 */
function filterTable(tableID, element, msg) {
	var table = document.getElementById(tableID).getElementsByTagName('tbody')[0];
	var events = table.getElementsByTagName("tr");
	var category = element.value;
	var shownItems = 0;
	var i;

	for (i = 0; i < events.length; i++) {
		classname = events[i].getAttribute("class");
		// wenn classname == null, dann wahrscheinlich ie6
		if (classname == null) {
			attribs = events[i].attributes;
			var j = 0;
			for ( j  =0; j < attribs.length; j++) {
				if ((attribs[j].nodeType == 2) && (attribs[j].nodeName == "class")) {
					classname = attribs[j].nodeValue;
				}
			}
		}

		if (!classname) {
			return;
		}

		if ((classname == category) || (category == 'alle')) {
			// Alte Variante mit Checkboxen
			/*
			if (checkbox.checked == true) {
				events[i].style.display = "";
			} else {
				events[i].style.display = "none";
			}
			*/
			shownItems++;
			events[i].style.display = "";
		} else {
			events[i].style.display = "none";
		}
	}
	if (shownItems == 0) {
		document.getElementById('matrix42_event_listing_msg').appendChild(document.createTextNode(msg));
	} else {
		if (document.getElementById('matrix42_event_listing_msg').innerHTML) {
			document.getElementById('matrix42_event_listing_msg').removeChild(document.getElementById('matrix42_event_listing_msg').firstChild);
		}
	}
}

/**
 * Wendet den aktiv in der Selectbox ausgewählten Filter an
 * benötigt, bei der Rückkehr zur Eventliste aus einer Detailansicht, wegen
 * history.back()
 */
function applyLastFilter(msg) {
	var forms = document.getElementsByTagName('form');
	var filter = false;
	for (var i = 0; i < forms.length; i++) {
		if (forms[i].getAttribute('class') == 'event_filters_form') {
			filter = forms[i].firstChild.firstChild;
		}
	}

	if (filter) {
		filterTable('matrix42_event_listing', filter, msg);
	}
}