/*global de*/
de = this.de || {};
de.datev = de.datev || {};
de.datev.portal = de.datev.portal || {};
de.datev.portal.produkte = de.datev.portal.produkte || {};
de.datev.portal.produkte.seminarsortierung = function () {
    var thisNamespace = de.datev.portal.produkte.seminarsortierung || {};


////////////////////////////////////////////////////////////////////
/////////// Sortierung der Seminartermine //////////////////////////
////////////////////////////////////////////////////////////////////

//(1)
var initSeminartermine = function () {
	var dom = de.datev.dom;

	// Header SOFORT anzeigen
	var allHeaders = dom.getElementsByTagAndClassName("div", "seminarheader");
	if (allHeaders && allHeaders.length > 0) for (var i=0; i<allHeaders.length; i++)
	{
		allHeaders[i].style.display = "block";
	}

	// Hier beginnt eigentliche Initialisierung
	var sortLists = dom.getElementsByTagAndClassName("tbody", "seminarliste");
	if (sortLists && sortLists.length > 0) foreachArray(sortLists, function(thisList) {

		thisList.sort = sortListNumeric;
		thisList.refresh = updateView;

		var termine = [];
		termine = dom.getElementsByTagAndClassName("tr", "terminsortrecord");
		thisList.records = termine;


		thisList.criteria = {};
		thisList.currentSorting = {
			"criterion" : null,
			"order" : "desc"
		};
		var sortByDefault = null;

		if (thisList.records.length > 0)
		{
			// Sort-Header einsammeln
			thisList.sortHeader = dom.getParent(thisList, 'table');
			while (!thisList.sortHeader || thisList.sortHeader.className != "seminarheader")
			{
				thisList.sortHeader = thisList.sortHeader.previousSibling;
			}

			foreachArray(thisList.sortHeader.childNodes, function(curr, loopControl)
			{
				if (!curr.className || curr.className.indexOf("clientsortcriterion") != 0)
				{
					loopControl.setContinue = true;
					return;
				}
				curr.name = curr.className.substr("clientsortcriterion".length);
				thisList.criteria[curr.name] = curr;

				// Linkanker (Buttons) einsammeln
				foreachArray(curr.childNodes, function(clickNode)
				{
					if (clickNode.className && (clickNode.className.indexOf("clientsortdesc")!=-1
						|| clickNode.className.indexOf("clientsortasc")!=-1))
					{
						var img = {};

						// Bilder sammeln (das erste Bild ist inaktiv, das zweite aktiv)
						foreachArray(clickNode.childNodes, function(child, loopControl)
						{
							if (child.nodeName == "IMG" && !img.inactive)
							{
								img.inactive = child;
							}
							else if (child.nodeName == "IMG") // ascImg
							{
								img.active = child;
								loopControl.setBreak = true;
								return;
							}
						});


						if (clickNode.className.indexOf("clientsortdesc")!=-1)
						{
							curr.desc = img;
							clickNode.onclick = function(evt)
							{
								thisList.currentSorting = {
									"criterion" : curr.name,
									"order" : "desc"
								};
								thisList.sort();
								thisList.refresh();
								evt = evt?evt:window.event;
								if (evt) {
									evt.cancelBubble = true;
								}
							};
							if (clickNode.className.indexOf("defaultsorting")!=-1)
							{
								sortByDefault = clickNode.onclick;
							}
						}
						else // asc
						{
							curr.asc = img;
							clickNode.onclick = function(evt)
							{
								thisList.currentSorting = {
									"criterion" : curr.name,
									"order" : "asc"
								};
								thisList.sort();
								thisList.refresh();
								evt = evt?evt:window.event;
								if (evt) {
									evt.cancelBubble = true;
								}
							};
							if (clickNode.className.indexOf("defaultsorting")!=-1)
							{
								sortByDefault = clickNode.onclick;
							}
						}
					}
				});
			});
			thisList.sortHeader.style.display = "block";
		}

		if (sortByDefault) sortByDefault();
	});
};


var sortListNumeric = function () {

	var ascOrDesc = this.currentSorting.order;
	var criterion = this.currentSorting.criterion;

	// Sortierungsfunktion
	var sortingFactor = (ascOrDesc == "asc") ? 1 : -1;
	var criterionAttrName = "CLIENTSORT" + criterion;
	var criterionIntAttrName = criterionAttrName + "_INT";
	function numSorter(recordA, recordB)
	{
		return (recordA[criterionIntAttrName] - recordB[criterionIntAttrName]) * sortingFactor;
	}
	var i;
	//var tmp;
	for (i = 0; i < this.records.length; i += 1)
	{
		var r = this.records[i];
		//tmp += r + "[" + de.datev.typeOf(r) +"]\n";
		r[criterionIntAttrName] = parseInt(r.getAttribute(criterionAttrName));
		//alert(r);
	}
	//alert(tmp);
	this.records.sort(numSorter);
};


// View
var updateView = function () {

	// Zuerst Feedback geben
	for (var crit in this.criteria)
	{
		this.criteria[crit].desc.active.style.display = "none"
		this.criteria[crit].desc.inactive.style.display = "inline"
		this.criteria[crit].asc.active.style.display = "none"
		this.criteria[crit].asc.inactive.style.display = "inline"
	}
	this.criteria[this.currentSorting.criterion][this.currentSorting.order].inactive.style.display = "none";
	this.criteria[this.currentSorting.criterion][this.currentSorting.order].active.style.display = "inline";

	// Datenbereich leeren
	while (this.firstChild)
	{
		this.removeChild(this.firstChild);
	}

	// Datenbereich neu aufbauen
	var self = this;
	var lastRow = null;
	foreachArray(this.records, function(row)
	{
		self.appendChild(row);
		lastRow = row;
	});
};


///////////////////////////////////////////////////////
// Helpers
///////////////////////////////////////////////////////
var foreachArray = function (arr, functionTakingItemAsArgument) {
	var loopControl = {
		setContinue: false,
		setBreak: false
	};
	for (var i = 0; i < arr.length; i++) {

		loopControl.setContinue = false;
		loopControl.setBreak = false;
		functionTakingItemAsArgument(arr[i], loopControl);
		if (loopControl.setBreak) break;
		if (loopControl.setContinue) continue;
	}
};


    //////////////////////////////////////////////////////
    // PUBLIC
    //////////////////////////////////////////////////////
    thisNamespace.initSeminartermine = initSeminartermine;


    return thisNamespace;
}(); // de.datev.portal.seminarsortierung



////////////////////////////////////////////////////////////////
// (1) Ausfuehrung
////////////////////////////////////////////////////////////////
de.datev.events.addEvent(window, "load", de.datev.portal.produkte.seminarsortierung.initSeminartermine);