var SortTable = {
	
	regExp_Currency:        /^[£$€]/,
	regExp_Number:          /^(\-)?[0-9]+(\.[0-9]*)?$/,
	pos:                    -1,
	
// **********************************	
// ** INIT
// **********************************

	init: function(sTableID,sortrow,sorttype,scrollposition) {
//		alert('Function : init');

// ****************************
// **	Cookies holen		
		
		if (sortrow <= -1) {
    	if (document.cookie.indexOf('sortrow'+ sTableID) >= 0) {
      	sortrow = SortTable.getcookie('sortrow' + sTableID);
      } else {
      	sortrow = -sortrow;
      }
    }
			
		if (!sorttype) {
			if (document.cookie.indexOf('sorttype'+ sTableID) >=0) {
				sorttype = SortTable.getcookie('sorttype' + sTableID);
			}
		}
    
    if (scrollposition == '-1') {
    	if (document.cookie.indexOf('scrollposition'+ sTableID) >=0) {
      	 		scrollposition = SortTable.getcookie('scrollposition'+ sTableID);
      } else {
      	scrollposition = 0;
      }
   	}
   	
// **********************************	
// ** Initiale Scrollposition setzten
  	
   	divs = document.getElementsByTagName('div');       
    for (var z=0, div; div = divs[z]; z++) {       
    	if(div.id.match(sTableID+'scroller')) {
				div.scrollTop=scrollposition;
       }
    }

// **********************************	
// ** Initiale Scrollposition setzten

	SortTable.Stripe(sTableID);



// **********************************	
// ** Initialisiere Table HEAD

		var tables = document.getElementsByTagName("table");
		for(var x=0;x!=tables.length;x++){
			var table = tables[x]
			if (table.id.match(sTableID+'head')) {
//				alert('HEAD found.');
       	var theaders = table.getElementsByTagName("th"); 	
       	for (var z = 0; z < theaders.length; z++) {         	
					var th = theaders[z];
// Mouse onClick Event verankern					
					if (th.id.match('sortable')) {
         		th.onclick = SortTable.SortEvent;
          	th.appendChild(document.createElement('span'));
//						th.firstChild.onclick = 'return false';
						if ((z+1)==sortrow) {
							SortTable.Sort(th,sTableID,sorttype);
						}
          }
				}				
			}
		}
	},

// **********************************	
// ** STRIPE
// **********************************

	Stripe: function(sTableID) {
// **********************************	
// ** Initialisiere Table BODY
		var tables = document.getElementsByTagName("table");

		for(var x=0;x!=tables.length;x++){
			var table = tables[x]
			if (table.id.match(sTableID+'body')) {

				var tbodies = table.getElementsByTagName("tbody");
				for (var h = 0; h < tbodies.length; h++) {
					var even = false;
					var trs = tbodies[h].getElementsByTagName("tr");
					for (var i = 0; i < trs.length; i++) {
						trs[i].onmouseover=function(){
							this.style.background = '#005050';
							this.style.color = '#FFFFFF';
							return false;
						}
						trs[i].onmouseout=function(){
							if (this.id.indexOf('odd')>=0) {
								this.style.background = '#002C42';
							}
							if (this.id.indexOf('even')>=0) {
								this.style.background = '#003955';
							}
							if (this.id.indexOf('selected')>=0) {
								this.style.background = '#005050';
								this.style.color = '#ffffff';
							}
							return false;
						}
						if(even) {
							trs[i].id = "even " + trs[i].id;
						} else {
							trs[i].id = "odd " + trs[i].id;
						}
						even = !even;
					}
				}
			}
		}
	},
	
// **********************************	
// ** SORT
// **********************************

	Sort: function(sorthead,sTableID,sorttype) {

		
// **********************************	
// ** pos holen
			
		SortTable.pos = 0;
		var curr = sorthead;
    // Get the column position
    while(curr.previousSibling) {
    	if(curr.previousSibling.nodeType != 3) SortTable.pos++;
    	curr = curr.previousSibling;
		}

// **********************************	
// ** Save sortrow in cookie

    document.cookie="sortrow" + sTableID + "=" + (SortTable.pos+1) + ";";
      
// **********************************	
// ** Header bereinigen
   
		var thCollection = curr.parentNode.getElementsByTagName('th');
		for(var i=0, th; th=thCollection[i]; i++) {
			if(i != SortTable.pos) {
    		th.className = th.className.replace('reverseSort','');                                
				var span = th.getElementsByTagName('span');
				if(span.length > 0) {
        	var span = th.getElementsByTagName('span')[span.length - 1];
					span.className='';
				}
			}
		}

// **********************************	
// ** Hole die entsprechende Body Tabelle   
    
		var tables = document.getElementsByTagName("table");
		var table;
		for(var x=0;x!=tables.length;x++){
			if (tables[x].id.match(sTableID+'body')) table = tables[x];
		}
	
// **********************************	
// ** Tablebody holen  

    if(table.getElementsByTagName('tbody')) {
    	table = table.getElementsByTagName('tbody')[0];
    }

// **********************************	
// ** Hole die TR Tags  

    var trs = table.getElementsByTagName('tr');
    var trCollection = new Array();

// **********************************	
// ** If the current tr has any th child elements then skip it..  

    for(var i = 0, tr; tr = trs[i]; i++) {
    	if(tr.getElementsByTagName('th').length == 0) trCollection.push(tr);
    }

// **********************************	
// ** Datentyp der Spalte ermitteln  

    var sortFunction;
    var txt = "";
		
		for(i = 0; i < trCollection.length; i++) {
    	txt = SortTable.getInnerText(trCollection[i].getElementsByTagName('td')[SortTable.pos]);
      if(txt != "") break;
    }

// **********************************	
// ** Entsprechende Sortierfunktion zuweisen
		
    if(SortTable.dateFormat(txt) != 0)            sortFunction = SortTable.sortDate;
    else if(txt.match(SortTable.regExp_Number))   sortFunction = SortTable.sortNumeric;
    else if(txt.match(SortTable.regExp_Currency)) sortFunction = SortTable.sortCurrency;
    else                                          sortFunction = SortTable.sortCaseInsensitive;		
		
// **********************************	
// ** Sortierfunktion ausführen

    trCollection.sort(sortFunction);
    
// **********************************	
// ** Sortierung umkehren ?

		var arrow;
		if((sorthead.className.match('reverseSort')) || (sorttype =='reverse')) {
			trCollection.reverse();
			document.cookie="sorttype" + sTableID + "=reverse;";
			sorthead.className = '';
			arrow = "Up";
		} else {
			sorthead.className = 'reverseSort';
			document.cookie="sorttype" + sTableID + "=normal;";
			arrow = "Down";
		}
								
// **********************************	
// ** Image als Class des Span setzten

		var span = sorthead.getElementsByTagName('span');
		if(span.length > 0) {
			var span = sorthead.getElementsByTagName('span')[span.length - 1];
			if(span.firstChild) span.removeChild(span.firstChild);
			span.className = 'image' + arrow;
		}

// **********************************	
// ** Streifen setzten

		
		var even = false;		
		for(var k = 0, tr; tr = trCollection[k]; k++) {
			if (tr.id.indexOf('selected')>=0) {
				tr.id = 'selected'
				tr.style.background = '#005050';
				tr.style.color ='#ffffff';
				if(even) {
					tr.id = 'even selected';
				} else {
					tr.id = 'odd selected';
				}
			} else {
				if(even) {
					tr.id = 'even';
					tr.style.background = '#003955';
				} else {
					tr.id = 'odd';
					tr.style.background = '#002C42';
				}					
			}
			even = !even;
			table.appendChild(tr);
		}
	},
	
// **********************************	
// ** SORTEVENT
// **********************************

	SortEvent: function(e) {
		
		// Get the table
    var element = this;
    while(element.tagName.toLowerCase() != 'table' && element.parentNode) {
    	element = element.parentNode;
    }
		sTableID = element.id.substring(0,1);
		SortTable.Sort(this,sTableID,'')
	},
	
// **********************************	
// ** SAVESCROLLPOSITION
// **********************************

	savescrollposition: function(sTableID) {
 		divs = document.getElementsByTagName('DIV');     
 		for (var z=0, div; div = divs[z]; z++) {
	 		if(div.id.match(sTableID+'scroller')) {
  			document.cookie="scrollposition" + sTableID + "=" + div.scrollTop+";";
    	}
    }
	},

// **********************************	
// ** GETCOOKIE
// **********************************
	
	getcookie: function(cname) {
	
		var search = cname + "="
		var returnvalue = "";
		if (document.cookie.length > 0) {
			offset = document.cookie.indexOf(search);
  		if (offset != -1) { 
  			offset += search.length;
  			end = document.cookie.indexOf(";", offset);
    		if (end == -1) end = document.cookie.length;
    		returnvalue=unescape(document.cookie.substring(offset, end))
    	}
		}
  	return returnvalue;
	},

// **********************************	
// ** GETINNERTEXT
// **********************************
	
  getInnerText: function(el) {
  	if (typeof el == "string" || typeof el == "undefined") return el;
  	if(el.innerText) return el.innerText;
  	var txt = '', i;
  	for (i = el.firstChild; i; i = i.nextSibling) {
  		if (i.nodeType == 3)            txt += i.nodeValue;
  		else if (i.nodeType == 1)       txt += SortTable.getInnerText(i);
  	}
  	return txt;
  },
	
// **********************************	
// ** Sortierfunktionen
// **********************************	
	
  dateFormat: function(dateIn) {

  	var y, m, d, res;
  	
  	if(dateIn.match(/^(0[1-9]|1[012])([- \/.])(0[1-9]|[12][0-9]|3[01])([- \/.])(\d\d?\d\d)$/)) {
  		res = dateIn.match(/^(0[1-9]|1[012])([- \/.])(0[1-9]|[12][0-9]|3[01])([- \/.])(\d\d?\d\d)$/);
  		y = res[5];
  		m = res[1];
  		d = res[3];
  	} else if(dateIn.match(/^(0[1-9]|[12][0-9]|3[01])([- \/.])(0[1-9]|1[012])([- \/.])(\d\d?\d\d)$/)) {
  	  res = dateIn.match(/^(0[1-9]|[12][0-9]|3[01])([- \/.])(0[1-9]|1[012])([- \/.])(\d\d?\d\d)$/);
  	  y = res[5];
  	  m = res[3];
  	  d = res[1];
  	} else if(dateIn.match(/^(\d\d?\d\d)([- \/.])(0[1-9]|1[012])([- \/.])(0[1-9]|[12][0-9]|3[01])$/)) {
  	  res = dateIn.match(/^(\d\d?\d\d)([- \/.])(0[1-9]|1[012])([- \/.])(0[1-9]|[12][0-9]|3[01])$/);
  	  y = res[1];
  	  m = res[3];
  	  d = res[5];
  	} else return 0;
  	
  	if(m.length == 1) m = "0" + m;
  	if(d.length == 1) d = "0" + d;
  	if(y.length != 4) y = (parseInt(y) < 50) ? '20' + y : '19' + y;
  	
  	return y+m+d;
  },

  sortDate: function(a,b) {
  	aa = SortTable.dateFormat(SortTable.getInnerText(a.getElementsByTagName('td')[SortTable.pos]));
  	bb = SortTable.dateFormat(SortTable.getInnerText(b.getElementsByTagName('td')[SortTable.pos]));
  	if (aa == bb) return 0;
  	if (aa < bb)  return -1;
  	return 1;
  },

  sortCurrency:function(a,b) {
  	aa = SortTable.getInnerText(a.getElementsByTagName('td')[SortTable.pos]).replace(/[^0-9.]/g,'');
  	bb = SortTable.getInnerText(b.getElementsByTagName('td')[SortTable.pos]).replace(/[^0-9.]/g,'');
  	if(isNaN(aa) || aa == "") aa = 0;
  	if(isNaN(bb) || bb == "") bb = 0;
  	return parseFloat(aa) - parseFloat(bb);
  },

  sortNumeric:function (a,b) {
  	aa = parseFloat(SortTable.getInnerText(a.getElementsByTagName('td')[SortTable.pos]));
  	if(isNaN(aa) || aa == "") aa = 0;
  	bb = parseFloat(SortTable.getInnerText(b.getElementsByTagName('td')[SortTable.pos]));
  	if(isNaN(bb) || bb == "") bb = 0;
  	return aa-bb;
  },

  sortCaseInsensitive:function (a,b) {
  	aa = SortTable.getInnerText(a.getElementsByTagName('td')[SortTable.pos]).toLowerCase();
  	bb = SortTable.getInnerText(b.getElementsByTagName('td')[SortTable.pos]).toLowerCase();
  	if(aa == bb) return 0;
  	if(aa < bb)  return -1;
  	return 1;
  }
}