/*dependency:de.datev.dom*/

/*global de*/
de = this.de || {};
de.datev = de.datev || {};
de.datev.portal = de.datev.portal || {};
de.datev.portal.clientsort = function () {
    var thisNamespace = de.datev.portal.clientsort || {};

	////////////////////////////////////////////////////////////////
	/////////// Clientseitiges Sortieren ///////////////////////////
	////////////////////////////////////////////////////////////////

	var initClientSort = function () {
		// Header SOFORT anzeigen
		var allHeaders = de.datev.dom.getElementsByTagAndClassName("div", "clientsortheader");
		if (allHeaders.length>0) for (var i=0; i<allHeaders.length; i++)
		{
			allHeaders[i].style.display = "block";
		}

		// Hier beginnt eigentliche Initialisierung
		var sortLists = de.datev.dom.getElementsByTagAndClassName("div", "clientsortlist");

		if (sortLists.length>0) for (var listIndex in sortLists)
		{
		  var thisList = sortLists[listIndex];
	      thisList.sort = sortListNumeric;
	      thisList.refresh = updateView;
	      thisList.records = de.datev.dom.getChildrenByClassName(thisList, "clientsortrecord");
	      thisList.currentSorting = null;
	      thisList.criteria = {};

	      // Radionbuttons suchen und zuordnen. Suche im DOM nach:
	      // previous:div.teaserhead/div.clientsortheader/form/p/label.sortierungDatev/input
	      var teaserHead = thisList;
		  while (teaserHead && teaserHead.className != "teaserhead")
		  {
		    teaserHead = teaserHead.previousSibling;
		  }

		  // Theoretisch sollte das immer der Fall sein:
		  if (teaserHead != null && teaserHead.childNodes.length > 0)
	      {
	         var sortHeader = null;
	         for (var childIndex in teaserHead.childNodes)
	         {
	           if (teaserHead.childNodes[childIndex].className == "clientsortheader")
	           {
	             sortHeader = teaserHead.childNodes[childIndex];
	             break;
	           }
	         }
	         // Auch das sollte immer vorhanden sein
	         if (sortHeader != null && sortHeader.childNodes.length > 0)
	         {
	             var myForm = null;
	             for (var childIndex in sortHeader.childNodes)
	             {
	               if (sortHeader.childNodes[childIndex].nodeName == "FORM")
	               {
	                 myForm = sortHeader.childNodes[childIndex];
	                 break;
	               }
	             }
	             // Auch das sollte es geben Gleich haben wir's!
	             if (myForm != null && myForm.childNodes.length > 0)
	             {
	                 var p = null;
	                 for (var childIndex in myForm.childNodes)
	                 {
	                   if (myForm.childNodes[childIndex].nodeName == "P")
	                   {
	                     p = myForm.childNodes[childIndex];
	                     break;
	                   }
	                 }
	                 // nur noch ein p!
	                 if (p != null && p.childNodes.length > 0)
	                 {
	                     for (var childIndex in p.childNodes)
	                     {
	                       var label = p.childNodes[childIndex];
	                       if (label.nodeName == "LABEL" && label.className != null)
	                       {
	                         for (var inputIndex in label.childNodes)
	                         {
	                           var input = label.childNodes[inputIndex];
	                           if (input.nodeName == "INPUT" && input.type == "radio")
	                           {
	                            // jetzt haben wir einen Sortier-Radiobutton!
	                            // dem verpassen wir eine eindeutige Id und seinem Label das zugehörige for-Attribut
	                            var labelId = "_" + listIndex + "_" + childIndex
	                            label.htmlFor = label.htmlFor + labelId;
	                            input.id = input.id + labelId;

								//input.label = label;
								input.onclick = function(evt){};

								// der Label darf geklickt werden:
								label.radio = input;
	                            label.sortList = thisList;
								label.sortCriterion = label.className.replace(/clientsortcriterion/,"").replace(/ defaultsorting/,"").toLowerCase();
								label.onclick = function(evt)
								{
								  this.radio.checked = true;
								  this.sortList.currentSorting = this.sortCriterion;
								  this.sortList.sort();
								  this.sortList.refresh();
								  evt = evt?evt:window.event;
								  if (evt)
								  {
								   evt.cancelBubble = true;
								  }
								};

								if (label.className.indexOf("defaultsorting")!=-1)
								{
									label.sortList.currentSorting = label.sortCriterion;
									label.radio.checked = true;
								}

								break;
	                           }
	                         }
	                       }
	                     }


	                      // Liste initialisieren wenn ein Button seine Defaultsortierung eingetragen hat
	                      if (thisList.currentSorting != null)
	                      {
	                        thisList.sort();
	                        thisList.refresh();
	                      }
	                   }
	                }
	            }
	        }
		}
	};

	// TODO EH asc/desc
	var sortListNumeric = function () {
		var criterion = this.currentSorting;

		// Sortierungsfunktion
		var criterionAttrName = "clientsort" + criterion;
		var criterionIntAttrName = criterionAttrName + "_INT";
		function numSorter(recordA, recordB)
		{
			//Datum anders herum sortieren
			if(criterionIntAttrName ==="clientsortdatum_INT") {
				return (recordB[criterionIntAttrName] - recordA[criterionIntAttrName]);
			}
			else {
				return (recordA[criterionIntAttrName] - recordB[criterionIntAttrName]);
			}
		}
		var i;
		for (i = 0; i < this.records.length; i += 1)
		{
			var r = this.records[i];
			r[criterionIntAttrName] = parseInt(r.getAttribute(criterionAttrName));
		}
		this.records.sort(numSorter);
	};


	// View
	var updateView = function () {
		// Datenbereich leeren
		while (this.firstChild)
		{
			this.removeChild(this.firstChild);
		}

		// EH TODO Styles obsolet? Datenbereich neu aufbauen
		var self = this;
		foreachArray(this.records, function(row)
		{
			self.appendChild(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.initClientSort = initClientSort;

    return thisNamespace;
}(); // de.datev.portal.clientsort

////////////////////////////////////////////////////////////////
// Ausfuehrung
////////////////////////////////////////////////////////////////
de.datev.events.addEvent(window, "load", de.datev.portal.clientsort.initClientSort);
