// 
// Globale JavaScript-Funktionen, die im TISIS immer wieder gebraucht werden
//
// created 01.09.2006
//
// Gerold Aschauer <uedvt017>



// an artificially created global Node element so that the Node constants can 
// be used with Internet Explorer as standardized by ECMA
if (!window.Node) {
	var Node = {ELEMENT_NODE: 1,
					ATTRIBUTE_NODE: 2,
					TEXT_NODE: 3,
					COMMENT_NODE: 8,
					DOCUMENT_NODE: 9,
					DOCUMENT_FRAGMENT_NODE: 11
	}
}

var searchFormElement = false;

// changes the expansion status of a table from expanded to retracted or vice versa
function changeTable(tableid) {
	var ele = document.getElementById(tableid);
	if (ele.expStatus == 'expanded') {
		retractTable(tableid);
	} else if (ele.expStatus == 'retracted') {
		expandTable(tableid);
	}
}

// function used to expand the rows of a table - table needs to have an ID
function expandTable(tableid) {
	var ele = document.getElementById(tableid);
	ele.expStatus = 'expanded';
	var subelements = ele.rows;
	for (var i=0;i<subelements.length;i++) {
		if (i>0) {
			subelements[i].style.display='';
		}
	}
}

// function used to retract the rows of a table - table needs to have an ID
function retractTable(tableid) {
	var ele = document.getElementById(tableid);
	ele.expStatus = 'retracted';
	var subelements = ele.rows;
	for (var i=0;i<subelements.length;i++) {
		if (i>0) {
			subelements[i].style.display='none';
		}
	}
}

// function used to expand a single html element - that element needs to have an ID
function expandElement(eleid) {
	document.getElementById(eleid).style.display='';
}

// function used to retract a single html element - that element needs to have an ID
function retractElement(eleid) {
	document.getElementById(eleid).style.display='none';
}

// function to calculate the IBAN for a bank account. BLZ and account number are
// needed  --> WARNING: this method only works for Austrian bank accounts
function calcIBAN(blz, knr) {
	blz = addNulls(blz,5);
	if (isNaN(knr)) {
		alert ('Die Kontonummer darf nur aus Ziffern bestehen!');
		return null;
	}
	knr = addNulls(knr,11);
	var ibanWithoutCheck = '' + blz + knr;
	var tempIban = '' + ibanWithoutCheck + '102900';
	if (tempIban.length == 22) {
		// 1. Teilabschnitt
		var partialCheck = tempIban.substring(0,9);
		var modresult = partialCheck % 97;
		// 2. Teilabschnitt
		partialCheck = '' + modresult + tempIban.substring(9,16);
		modresult = partialCheck % 97;
		// 3. (letzter) Teilabschnitt
		partialCheck = '' + modresult + tempIban.substring(16,22);
		var pruefziffer = 98 - (partialCheck % 97);
		pruefziffer = addNulls(pruefziffer.toString(),2);
		var iban = 'AT'+pruefziffer+ibanWithoutCheck;
		return iban;
	} else {
		alert ('Fehler bei der IBAN-Berechnung');
		return null;
	}
}

// takes a number or string as first argument and puts '0's in front of it
// until it has length finlen (second argument)
function addNulls(numb, finlen) {
	if (numb.length < finlen) {
		var nullStr = '';
		for (var i=0;i<finlen-numb.length;i++) {
			nullStr += '0';
		}
		numb = '' + nullStr + numb;
	}
	return numb;
}

// reliably returns which browser is used
function getBrowserName() {
	if (navigator.userAgent.search('Firefox') != -1) {
		return 'Firefox';
	} else if (navigator.userAgent.search('Opera') != -1) {
		return 'Opera';
	} else if (navigator.userAgent.search('Netscape') != -1) {
		return 'Netscape';
	} else if (document.all) {
		return 'Internet Explorer';
	} else {
		return 'unbekannter Browser';
	}
}

function getNodeText(elementid) {
	var myEl = document.getElementById(elementid);
   	if (myEl.textContent) {
		return myEl.textContent
   	}
   	if (myEl.innerText) {
		return myEl.innerText;
	}
   	return null;
}

/**
 * hat dieselbe Funktion wie String.trim() in JAVA (beseitigt Leerzeichen am Anfang
 * und am Ende eines Strings)
 */
function TrimString(sInString) {
  	sInString = sInString.replace( /^\s+/g, "" );// strip leading
  	return sInString.replace( /\s+$/g, "" );// strip trailing
}

function arrayContains(arr,checkStr) {
	for (var i=0;i<arr.length;i++) {
		if (checkStr == arr[i]) {
			return true;
		}
	}
	return false;
}

/**
 * sortiert das Objeckt, das den VoH von der Suche darstellt und somit auch den 
 * Table
 */
function sortDataObject(a, b) {
	try {
		var sortIndex = getIndexFor(dataObj.columns,sortNext);
		if (arrayContains(dateFields,sortNext)) {  // for Timestamps
			return (a[sortIndex].time>b[sortIndex].time) ? 1 : -1;
		} else if (numericSort) {  // for Numbers
			return (a[sortIndex]>b[sortIndex]) ? 1 : -1;
		} else {
			// for Strings 
			return (a[sortIndex].toLowerCase().replace(/ö/g, "o").replace(/ä/g, "a").replace(/ü/g, "u")>b[sortIndex].toLowerCase().replace(/ö/g, "o").replace(/ä/g, "a").replace(/ü/g, "u")) ? 1 : -1;
		}
	} catch (ex) {
		throw new Error('sortTable: '+ex.message);
	}
}

function deleteAllChildren(node){
	if(node){
		for(var x = node.childNodes.length - 1; x >= 0; x--){
			var childNode = node.childNodes[x];
 			if(childNode.hasChildNodes()){
				deleteAllChildren(childNode);
			}
			node.removeChild(childNode);
			if(childNode.outerHTML){
				childNode.outerHTML = '';
			}
			childNode=null;   
		}
	node=null;
	}
}

function getColumnIndicesFor(/* map */ spalten, compareStrings) {
	var indexArr = new Array();
	for (var i=0;i<compareStrings.length;i++) {
		indexArr[i] = getColumnIndexFor(spalten,compareStrings[i]);
	}
	return indexArr;
}

function getColumnIndexFor(/* map */ spalten, compareString) {
	var ctr = 0;
	for (var entry in spalten) {
		if (entry == compareString) {
			return ctr;
		}
		ctr++;
	}
	return -1;
}

function removeComboboxValues(ele) {
	while (ele.options.length > 1) {
		ele.options[ele.options.length-1] = null;
	}
}

function populateCombobox(ele,data,columnNames) {
	var indices = getColumnIndicesFor(data.columns, columnNames);
	for (var i = 0; i < data.valueList.length; i++) {
		var rowData = data.valueList[i];
		ele.options[i+1] = new Option(rowData[indices[0]],rowData[indices[1]],false,false);
	}
}

function runde(x, n) {
	if (x == '' || isNaN(x)) return false;
	if (n < 1 || n > 14) return false; // macht keinen Sinn
	var e = Math.pow(10, n);
	var k = (Math.round(x * e) / e).toString();
	if (k.indexOf('.') == -1) k += '.';
	k += e.toString().substring(1);
	return k.substring(0, k.indexOf('.') + n+1).replace(/\./, ",");
}

function reactOnKey(e) {
	if (searchFormElement) {
		if(!e){
	      	e = window.event;
		}
		// alert(e.getSource());
		if(e.keyCode == 13)
			suchen();
	}
}

var browserName = getBrowserName();
