/*

Tabellensortierung 
Autor: Carsten Meyer

Alphabetische und numerische spaltenweise Sortierung von HTML-Tabellen
Die Einträge der Tabellenkopfzeile werden klickbar gemacht und sortieren
die Tabelle nach der jeweiligen Spalte.

In der Initialisierungsmethode werden die ID der Tabelle, die Anzahl der Tabellezeilen pro Seite
und optional ein Array von Funktionen angegeben, die auf die Inhalte der jeweiligen Spalte angewendet werden sollen.


*/

Array.prototype.bubbleArraySort = function(index){

/*
Prototypische Erweiterung des Array-Objekts:
bei zweidimensionalen Arrays gibt index die Spalte an, nach der sortiert werden soll
*/
 
   var n  = this.length;
   
   do{
   weitertauschen = false;
   for(var i=0; i < (n-1); i++){
      
	  
   	  if(this[i][index] > this[i+1][index]){
	  	x = this[i];
		this[i] = this[i+1];
		this[i+1] = x;
		weitertauschen = true;
	  }
   
   }
   
   
   }
   while(weitertauschen && (n >= 1))



}




var SorTable = function(){

var table,tbody,spalten,columns,rows,methods,pages,entries;
var ActivePage = 0;
var ColumnLinks = new Array();
var classes = new Object();
var usecolumn = new Array();
var breite,hoehe;
var links = new Array();
var navlinks = new Array();

classes['table'] = 's-table';
classes['tbody'] = 's-tbody';
classes['thead'] = 's-thead';
classes['th'] = 'col';
classes['pagenav'] = 's-pagenav';
classes['pagenav-akt'] = 'bold';
classes['aufsteigend'] = 'aufsteigend';
classes['absteigend'] = 'absteigend';
classes['links'] = 'pf-links';
classes['rechts'] = 'pf-rechts';



var stripTags = function(w){

return  w.replace(/<[^>]*>/g, "");
}


this.setClass = function(name,value){
	
	classes[name] = value;
}

this.initColumns = function(arr){
	
	for(var i=0; i<arr.length;i++)
	usecolumn.push(arr[i]);
		
}

var showPage = function(nr){

    for(var i=0; i < rows.length; i++){
	
		rows[i].style.display = 'none';
	}
	for(var i= (nr*entries); i < (nr*entries) + entries; i++)
	try{
		try{rows[i].style.display = 'table-row';}catch(e){rows[i].style.display = 'block';}
	}catch(e){}
	
	
	for(var i=0; i < navlinks.length; i++){
		
		navlinks[i].className = '';
	}
        try{
	navlinks[nr].className = classes['pagenav-akt'];}catch(e){};
}



		var applyColMethods = function(methods){
		
		     var tr = tbody.getElementsByTagName('tr');
			 for(var i=0; i < tr.length; i++)
			 {
			 	var td = tr[i].getElementsByTagName('td');
			 	for(var j=0; j < methods.length; j++){
			     
			    	 var func = methods[j];
					     td[j].innerHTML =  func(td[j].innerHTML);
			              
			 	
			 	}
			 }
		
		}
		
		var setPageNav = function(){
		
			var div = document.createElement('div');
                div.style.width = breite+'px';
                div.style.textAlign = 'center';
                div.className = classes['pagenav'];
                
            var bl = document.createElement('button');  
                bl.className = classes['links'];
                bl.nr = 0;
                bl.onclick = function(){
                	
                	this.blur();
                	this.nr = ActivePage - 1;
                	if(this.nr == -1) {this.nr = 0;}
                	ActivePage = this.nr;
                	showPage(this.nr);
                }
            var br = document.createElement('button');  
                br.className = classes['rechts'];
                br.nr = pages - 1;
                br.onclick = function(){
                	
                	this.blur();
                	this.nr = ActivePage + 1;
                	if(this.nr == pages) {this.nr = pages -1;}
                	ActivePage = this.nr;
                	showPage(this.nr);
                }
			   div.appendChild(bl);	
			   for(var i=0; i < pages; i++){
			   
			   		var a = document.createElement('a');
					    a.href='javascript:void(0);';
						a.style.margin = '2px';
						a.nr = i;
						a.onclick = function(){
						
							showPage(this.nr);
							ActivePage = this.nr;
						
						}
						a.innerHTML = i+1;
						navlinks.push(a);
						div.appendChild(a);
			   }
			   div.appendChild(br);
			   if(pages > 1)			
			   table.parentNode.insertBefore(div,table.nextSibling);
			
		}
		
		
		var setHeader = function(){
			
		var z1 = 	table.getElementsByTagName('tbody')[0].removeChild(table.getElementsByTagName('tbody')[0].getElementsByTagName('tr')[0]);
		
	    var head = document.createElement('thead');                                                               
			head.appendChild(z1); 
		var td = head.getElementsByTagName('td');
		var tr = head.getElementsByTagName('tr')[0];
		var len = td.length;
		    for(var i=0; i < len; i++){
		    	
		    	var th = document.createElement('th');
		    	    
		    	    th.innerHTML = td[i].innerHTML;
		    	    tr.appendChild(th);
		    }

                    
                   var td = tr.getElementsByTagName('td');
                   var len = td.length;
                   
		   for(var i=0; i < len; i++)
                   
		   {tr.removeChild(td[0]);}
		   
		    table.insertBefore(head,table.firstChild);
		}
		
	
		this.init = function(cid,entriesPerPage,colMethods){
		

			
		     entries = entriesPerPage;
		     methods = colMethods;
			 
		     table = document.getElementById(cid) || cid;
			 table.className = classes['table'];
			 
			 
			 if(table.getElementsByTagName('thead').length == 0)
			 setHeader();
		     
			 tbody = document.getElementById(cid).getElementsByTagName('tbody')[0] || cid.getElementsByTagName('tbody')[0];
			 tbody.className = classes['tbody'];
			 
			 
			 rows  = tbody.getElementsByTagName('tr');
			 
			 pages = Math.ceil(rows.length/entriesPerPage);
			 table.getElementsByTagName('thead')[0].className = classes['thead'];
			 columns = table.getElementsByTagName('thead')[0].getElementsByTagName('tr')[0].getElementsByTagName('th');
			 spalten = new Array();
			 if(usecolumn.length == 0)
				 for(var i=0; i < columns.length; i++)	
					 usecolumn.push(true);
					 
					 
					 
			 for(var i=0; i < columns.length; i++){
				 
				 	 
				    spalten[i] = new Array();
				 	createHeaderLinks(columns[i],i,usecolumn[i]);
					for(j=0; j < rows.length; j++){
					    var td = rows[j].getElementsByTagName('td');
						if(parseFloat(td[i].innerHTML).toString().indexOf('NaN') > -1)
						{spalten[i][j] = new Array(stripTags(td[i].innerHTML),rows[j].cloneNode(true));}
						else
						{spalten[i][j] = new Array(parseFloat(td[i].innerHTML),rows[j].cloneNode(true));}
					}
				 	
			 }
			
			breite = $(cid).getWidth(); 
			hoehe = $(cid).getHeight(); 
			
			 
			if(colMethods)applyColMethods(colMethods);
			setPageNav();showPage(ActivePage);
		} 










		
		
		var createHeaderLinks = function(node,nr,use){
		
		     var a = document.createElement('a');
			     a.col = nr;
				 a.href= 'javascript:void(0);';
				 a.isSorted = false;
				 a.methodArray = methods;
				 a.myMethod = applyColMethods;
				 node.className = classes['th']+'-'+nr;
				 
				 if(use)
				 a.onclick = function(){
				 
				 for(var i=0; i< ColumnLinks.length; i++){
				 
				 	ColumnLinks[i].className = '';
				 }
				 
				 	if(this.isSorted){
					    
						    this.className = classes['aufsteigend'];
						   
							if((spalten[this.col][0][0]/1) == 'NaN')
				 				{spalten[this.col].sort();}
							else
								{spalten[this.col].bubbleArraySort(0);}
						
				 		spalten[this.col].reverse();
						this.isSorted = false;
				 	}
				 	else
				 	{
					    this.className = classes['absteigend'];
					    if((spalten[this.col][0][0]/1) == 'NaN')
				 		spalten[this.col].sort();
						else
						spalten[this.col].bubbleArraySort(0);
				 		this.isSorted = true;
				 	}
				 
				 	while(tbody.hasChildNodes()){
				 
				    	tbody.removeChild(tbody.firstChild);
				 	
				 	}
				 
				 	for(var i= 0; i < spalten[this.col].length; i++){
				 	
						tbody.appendChild(spalten[this.col][i][1].cloneNode(true));
				 	}
					
					if(this.methodArray)this.myMethod(this.methodArray);
					
				 
				 showPage(ActivePage);
				 }
				 
				 a.appendChild(node.firstChild);
				 links.push(a);
				 node.appendChild(a);
				 ColumnLinks.push(a);
		}
		

		this.initialSort = function(nr,down){
			
			
			if((spalten[nr][0][0]/1) == 'NaN')
				{spalten[nr].sort();alert('Okay');}
		        else
			{spalten[nr].bubbleArraySort(0);}
			
		 	while(tbody.hasChildNodes()){
				 
		    	tbody.removeChild(tbody.firstChild);
		 	
		 	}

                        if(down) spalten[nr].reverse();
		 
		 	for(var i= 0; i < spalten[nr].length; i++){
		 	
				tbody.appendChild(spalten[nr][i][1].cloneNode(true));
		 	}
			
			if(methods)applyColMethods(methods);
			links[nr].isSorted = true;
			links[nr].className = classes['absteigend'];
			showPage(ActivePage);
		}


}






var foo = function(d){
	
	return d;
}

var setGerDate = function(d){
  d = d.split('-');
  return d[3].substr(0,2)+'.'+d[2]+'.'+d[1];
  
}


