
var dateSyntax = "dd.mm.yyyy";
var sep1 = ".";
var sep2 = ".";
var dayIndex = 0;
var monthIndex = 1;
var yearIndex = 2;
var fullYear = false;   //fulYear = true -> yyyy

var dom = (document.getElementsByTagName) ? true : false;
var ie5 = (document.getElementsByTagName && document.all) ? true : false;
var arrowUp, arrowDown;

if (ie5 || dom)
	initSortTable();

function initSortTable() {
	arrowUp = document.createElement("SPAN");
	var tn = document.createTextNode("5");
	arrowUp.appendChild(tn);
	arrowUp.className = "arrow";

	arrowDown = document.createElement("SPAN");
	var tn = document.createTextNode("6");
	arrowDown.appendChild(tn);
	arrowDown.className = "arrow";
}



function sortTable(tableNode, nCol, bDesc, sType) {
	//alert('sortTable');
	var tBody = tableNode.tBodies[0];
	var trs = tBody.rows;
	
	
	
	var newTable = new Array();
	var rowType = undefined
	var finished = false;	
	var nofSorted = 0;
	var i = 0;
	while (!finished)
	{		
		var a = new Array();
		var rowTypeChange = false;
		while (i<trs.length && !rowTypeChange) 
		{			
			if (trs[i].rowtype == rowType)
			{
				a[i-nofSorted] = trs[i];
				i++;
			}
			else
			{
				rowType = trs[i].rowtype;
				rowTypeChange = true;
			}
		}
		if (a.length > 0)
		{		
			a.sort(compareByColumn(nCol,bDesc,sType));		
			for (var j=0; j<a.length; j++) {				
				newTable[j+nofSorted] = a[j];
			}			
		}
		nofSorted = i;
		finished = !rowTypeChange;
	}
	for (var i=0; i<newTable.length; i++) {
		tBody.appendChild(newTable[i]);
	}
}

function CaseInsensitiveString(s) {
	return String(s).toUpperCase();
}

function parseDate(inDate) {	
	if (!inDate || inDate.replace(/ /g, '') == "")
	{
		return 0;
	}
	var sep1Index = inDate.indexOf(sep1);
	var sep2Index = inDate.lastIndexOf(sep2);
	if (sep1Index == -1 || sep2Index == -1)
	{
    	alert("Error in date");
		return false;	
	}	
	var datefields = new Array();
	datefields[0] = inDate.substring(0,sep1Index);
	datefields[1] = inDate.substring(sep1Index + 1, sep2Index);
	datefields[2] = inDate.substring(sep2Index + 1);	
		
	var day = datefields[dayIndex];
	var month = datefields[monthIndex];
	var year = datefields[yearIndex];	
	var ret = new Date();

	if (fullYear)
	{
		ret.setFullYear(year);
	}
	else
	{
		ret.setYear(year);
	}
	ret.setMonth(month -1);
	ret.setDate(day);
	
	return ret.getTime();
	//return Date.parse(s.replace(/\D/g, '/'));
}

/* alternative to number function
 * This one is slower but can handle non numerical characters in
 * the string allow strings like the follow (as well as a lot more)
 * to be used:
 *    "1,000,000"
 *    "1 000 000"
 *    "100cm"
 */

function toNumber(s) {
    return Number(s.replace(/[^0-9\.]/g, ""));
}

function compareByColumn(nCol, bDescending, sType) {
	var c = nCol;
	var d = bDescending;
	
	var fTypeCast = String;
	
	if (sType == "Number")
		fTypeCast = Number;
	else if (sType == "Date")
		fTypeCast = parseDate;
	else if (sType == "CaseInsensitiveString")
		fTypeCast = CaseInsensitiveString;
	
	return function (n1, n2) {
		if (fTypeCast(getInnerText(n1.cells[c])) < fTypeCast(getInnerText(n2.cells[c])))
			return d ? -1 : +1;
		if (fTypeCast(getInnerText(n1.cells[c])) > fTypeCast(getInnerText(n2.cells[c])))
			return d ? +1 : -1;
		return 0;
	};
}


function sortColumn(e) {	
	var tmp, el, tHeadParent;

	if (ie5)
		tmp = e.srcElement;
	else if (dom)
		tmp = e.target;

	tHeadParent = getParent(tmp, "THEAD");
	el = getParent(tmp, "TD");
	if (el.getAttribute("type") && el.getAttribute("type") != "")
	{
		if (tHeadParent == null)
			return;
			
		if (el != null) {
			var p = el.parentNode;
			var i;
	
			if (el._descending)	// catch the null
				el._descending = false;
			else
				el._descending = true;
			
			if (tHeadParent.arrow != null) {
				if (tHeadParent.arrow.parentNode != el) {
					tHeadParent.arrow.parentNode._descending = null;	//reset sort order		
				}
				tHeadParent.arrow.parentNode.removeChild(tHeadParent.arrow);
			}
	
			if (el._descending)
				tHeadParent.arrow = arrowDown.cloneNode(true);
			else
				tHeadParent.arrow = arrowUp.cloneNode(true);
	
			el.appendChild(tHeadParent.arrow);
	
				
	
			// get the index of the td
			for (i=0; i<p.cells.length; i++) {
				if (p.cells[i] == el) break;
			}
	
			var table = getParent(el, "TABLE");
			// can't fail
			
			sortTable(table,i,el._descending, el.getAttribute("type"));
		}
	}
}


function getInnerText(el) {
	//alert(el.innerHTML);
	var prefix = el.sortPrefix;
	if (!prefix)
	{
		prefix = "";
	}
	if (ie5) return prefix + el.innerText;	//Not needed but it is faster
	
	var str = "";
	
	for (var i=0; i<el.childNodes.length; i++) {
		switch (el.childNodes.item(i).nodeType) {
			case 1: //ELEMENT_NODE
				str += getInnerText(el.childNodes.item(i));
				break;
			case 3:	//TEXT_NODE
				str += el.childNodes.item(i).nodeValue;
				break;
		}		
	}
	
	return prefix + str;
}

function getParent(el, pTagName) {
	if (el == null) return null;
	else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase())	// Gecko bug, supposed to be uppercase
		return el;
	else
		return getParent(el.parentNode, pTagName);
}
// added 01.09.20002
var selectedRow;
function selectedArt(tr)  
{	
	if (selectedRow)
	{
		selectedRow.style.backgroundColor='#FFFFFF';	
	}
	tr.style.backgroundColor='#EEEEEE'; 
	selectedRow = tr;
}
// function hoover(tr)  {tr.style.backgroundColor='#C1D2EE'; }
// function hooverOut(tr) {tr.style.backgroundColor='white'; }
 function hover(tr)  {tr.className='gridHover'; }
 function hoverOut(tr)  {tr.className='trsort'; }
 
function setDateSyntax(syntax)
{
	dateSyntax = syntax;
	var sep1Index;
	var sep2Index;
	
	sep1 = "";
	sep2 = "";
	dayIndex = "";
	monthIndex = "";
	yearIndex = "";
		
	for (i=0; i < syntax.length; i++)
	{
		var c = syntax.charAt(i);
		if ( (c == ".") || (c == "/") || (c == "-") )
		{
			if (!sep1)
			{
				sep1Index = i;
				sep1 = c;
			}
			else if (!sep2)
			{
				sep2Index = i;
				sep2 = c;
			}
			else
			{
				alert("error in datesyntax");
				return;
			}				
		}
	}
	if (sep1 && sep2)
	{
		var datefields = new Array();
		datefields[0] = syntax.substring(0,sep1Index);
		datefields[1] = syntax.substring(sep1Index + 1, sep2Index);
		datefields[2] = syntax.substring(sep2Index + 1);		
		for (i=0; i < datefields.length; i++)
		{
			if (datefields[i] == "dd")
			{
				dayIndex = i;
			}
			else if (datefields[i] == "mm")
			{
				monthIndex = i;
			}
			else if (datefields[i] == "yyyy")
			{
				yearIndex = i;	
				fullYear = true;
			}
			else if (datefields[i] == "yy")
			{
				yearIndex = i;
				fullYear = false;	
			}			
			else
			{
				alert("error in datesyntax");
				return;
			}
		}
	}
	else
	{
		alert("error in datesyntax");
		return;
	}	
}
 

