function tableIndex(table, indexEl){
	var tableFX = jQuery.noConflict();
	var tableElements = table + " tr";
	if ( indexEl === undefined ) {
		return false;
	}
	var showChar = indexEl.innerHTML.substr(0,1).toLowerCase();
	var altChar = null;
	switch (showChar) {
		case 'a':
				altChar = 'ä';
			break;
		case 'u':
				altChar = 'ü';
			break;
		case 'o':
				altChar = 'ö';
			break;
		default:
				altChar = null;
			break;
	}

	if (showChar == '/') {
		tableFX(tableElements).each(function(i){
			this.style.display = "";
		});
	} else {
		if (showChar == '#') {
			var curChar = '';
			tableFX(tableElements).each(function(i){
				curChar = this.getElementsByTagName("td")[0].innerHTML.substr(0,1).toLowerCase();
				if ( 
					curChar != 'a' && curChar != 'ä' &&
					curChar != 'b' &&
					curChar != 'c' &&
					curChar != 'd' &&
					curChar != 'e' &&
					curChar != 'f' &&
					curChar != 'g' &&
					curChar != 'h' &&
					curChar != 'i' &&
					curChar != 'j' &&
					curChar != 'k' &&
					curChar != 'l' &&
					curChar != 'm' &&
					curChar != 'n' &&
					curChar != 'o' && curChar != 'ö' &&
					curChar != 'p' &&
					curChar != 'q' &&
					curChar != 'r' &&
					curChar != 's' &&
					curChar != 't' &&
					curChar != 'u' && curChar != 'ü' &&
					curChar != 'v' &&
					curChar != 'w' &&
					curChar != 'x' &&
					curChar != 'y' &&
					curChar != 'z'
					) {
					this.style.display = "";
				} else {
					this.style.display = "none";
				}
			});
		} else {
			tableFX(tableElements).each(function(i){
				if (this.getElementsByTagName("td")[0].innerHTML.substr(0, 1).toLowerCase() == showChar || (altChar !== null && this.childNodes[1].innerHTML.substr(0, 1).toLowerCase() == altChar)) {
					this.style.display = "";
				}
				else {
					this.style.display = "none";
				}
			});
		}
	}
	layoutTables();
	return true;
}



var csvXmlTables = new Array();	
		/**
		 * find elements by their CSS classnames
		 * @param {string} searchClassName
		 * @param {Object} [optional node to start the search, document if null]
		 * @param {string} [optional element tag to seach for]
		 * @return Array of dom objects or an empty array  
		 * 
		 * <c> christian novak - cnovak@gmx.net
		 * 
		 * Usage example:
		 * aTd = getElementsByClass("left", document, "td") 
		 * searches for all TD's within the document node having a class name = "left"
		 * 
		 * always try to provide a starting node to limit the iterations over the 
		 * complete dom tree 
		 */
		function getElementsByClass(searchClass, node, tag) {
			var classElements = new Array();
			if (node == null) {
				node = document;
			}
			if (tag == null) {
				tag = '*';
			}
			var elements = node.getElementsByTagName(tag);
			var elsLen = elements.length;
			var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
			var i, j;
			for (i = 0, j = 0; i < elsLen; i++) {
				if (pattern.test(elements[i].className)) {
					classElements[j] = elements[i];
					j++;
				}
			}
			return classElements;
		}
	
		/**
		 * return the style of an element after it has been rendered
		 * @param {Object} oEle
		 * @param {String} strCssRule
		 * @return {String} elements rendered value if any
		 * 
		 * <c> www.quirksmode.com, modifications by triplex GmbH www.triplex.de
		 * 
		 * @todo: fix IE box model issues
		 */
		function getStyle(oEle, strCssRule) {
			var strValue = "";
			// mozilla specific
			if(document.defaultView && document.defaultView.getComputedStyle){
				strValue = document.defaultView.getComputedStyle(oEle, "").getPropertyValue(strCssRule);
			}
			// IE und Webkit (iPhone, Safari) specfic code
			else if(oEle.currentStyle) {
				strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1) {
					return p1.toUpperCase();
				});
				switch (strCssRule) {
					case "width" :
						strValue = oEle.offsetWidth;
						break;
					case "height" :
						strValue = oEle.offsetHeight;
						break;
					case "top" :
						strValue = oEle.offsetTop;
						break;
					case "left" :
						strValue = oEle.offsetLeft;
						break;
					default : 
						strValue = oEle.currentStyle[strCssRule];			
						break;
				}
			}
			return strValue;
		}
	
		
		/**
		 * layout tables with td's having the classNames tableHead & tableContent
		 * 
		 * @param {String} [optional css className for the header cell, dafault "tableHead"]
		 * @param {String} [css className for the content td, default, "tableContent"]
		 * @param {String} [element name for the header element, default "th"]
		 * @param {String} [element name for the footer element, default "td"]
		 * 
		 * <c> triplex.GmbH www.triplex.de
		 * 
		 * Note: für jede th mit dem Classname "tableHead" muss eine td mit dem 
		 * ClassName "tableContent" existieren, ansonsten wird ein Fehler erzeugt
		 */
		function layoutTables(containerClass, sHeadCssClass, sContentCssClass, sHeadTag, sContentTag) {
			if ( containerClass !== null ) {
				var containerElements = getElementsByClass(containerClass, document, 'div');
			} else {
				var containerElements = new Array(document);
			}

			var tableFX = jQuery.noConflict();
			var containers = containerElements.length;
			var containerNo = 0;
			for (containerNo = 0; containerNo < containers; containerNo++) {
				var headCssClass = sHeadCssClass == null ? "tableHead" : sHeadCssClass;
				var contentCssClass = sContentCssClass == null ? "tableContent" : sContentCssClass;
				var headTag = sHeadTag == null ? "th" : sHeadTag;
				var contentTag = sContentTag == null ? "td" : sContentTag;
	
				if (typeof layoutTables.aTableHeads == 'undefined') {
					var aTableHeads = getElementsByClass(headCssClass, containerElements[containerNo], headTag);
				}
	
				if (typeof layoutTables.aTableContent == 'undefined') {
					var aTableContent = getElementsByClass(contentCssClass, containerElements[containerNo], contentTag);
				}
	
				var i, j;
				j = aTableHeads.length;
				if (j == 0) {
					return;
				}
		
				var iWidth		= 0;
				var tmp			= 0;
				if(document.defaultView && document.defaultView.getComputedStyle){
					for(i = 0; i < j; i++) {
						tmp = 0;
						iWidth	= parseInt( getStyle(aTableContent[i], "width") );
						tmp		= parseInt( getStyle(aTableContent[i], "padding-left")) - parseInt( getStyle(aTableHeads[i], "padding-left"));
						tmp		+= parseInt( getStyle(aTableContent[i], "padding-right")) - parseInt( getStyle(aTableHeads[i], "padding-right"));
						if ( i%2 == 0 ) {
							tmp += 1;
						}
						aTableHeads[i].style.width = iWidth + tmp + "px";
					}
				} else {
					var iBorderL	= 0;
					var iBorderR	= 0;
					
					aTableHeads[0].style.width = tmp + "px";
					for(i = 0; i < j; i++) {
						iWidth		= parseInt( getStyle(aTableContent[i], "width") );
						iBorderL	= parseInt( getStyle(aTableContent[i], "borderLeftWidth") );
						iBorderR	= parseInt( getStyle(aTableContent[i], "borderRightWidth") );
		
						if ( isNaN(iBorderL) == true ) {
							iBorderL = 0;
						}
						if ( isNaN(iBorderR) == true ) {
							iBorderR = 0;
						}
	
						if ( getStyle(aTableHeads[i], "border-collapse") == "collapse" ) {
							if ( iBorderL < 3 ) {
								tmp = iWidth - iBorderL - iBorderR - (iBorderL/2);
							} else {
								tmp = iWidth - iBorderL - iBorderR + (iBorderL/4);
							}
						} else {
							tmp = iWidth - iBorderL - iBorderR - 2;
						}
		
						if ( i%iBorderL == 1 ) {
							tmp += 1;
						}
						if ( i == j-2 && iBorderL >= 2 ) { tmp = tmp + 1; }
						if ( i == j-1) { tmp = tmp - 1; }
						aTableHeads[i].style.width = tmp + "px";
					}
				}

				tableFX(aTableContent[1].offsetParent.getElementsByTagName('tr')).each(function(i){
					tableFX(this.getElementsByTagName('td')).each(function(i){
						this.width = aTableHeads[i].style.width;
					});
				});
			}
		}
