
// SimpleTable: Schnelle Tabelle mit fixedlines/fixedcolumns u. Sortierung (keine Filtercombos)
// Im XML Template <simpletable ...>...</simpletable> verwenden.
//
// Diese Zeile muss noch in die "components" Map:
// simpletable|<div %attributes% sortarrowdown_img="/isycatgifs/a-z.gif" sortarrowup_img="/isycatgifs/z-a.gif" nosortarrow_img="/isycatgifs/empty.gif" style="%styles%; overflow: auto" %events%><table border="0" id="%id%_TABLE" style="width: 100%" %events% cellspacing="0">%components%</table></div><input type="hidden" name="%id%" value=""><script type="text/javascript" src="/isycatscripts/isytable.js"></script><script type="text/javascript" src="/isycatscripts/stable.js"></script><script>initFunctions += "mySimpleTableInit('%id%');";</script>|

// TODO: fixedlines in thead unterbringen damit tbody direkt sortiert werden kann.

var myBrowserId; 	// IE ver. > 0 ,  Moz. ver. < 0 , Rest 0
var myViewDelay=40;	// timeout für verzögerten View Refresh

function myRemoveNode(id)
{
	var obj=document.getElementById(id);
	if(obj && obj.parentNode)
	   obj.parentNode.removeChild(obj);
}


function myRuntimeStyle(obj)
{
	if(typeof getComputedStyle == 'function')
	{	// Mozilla, Firefox, ...
		return document.defaultView.getComputedStyle(obj,null);
	}
	else
	{	// IE
		return obj.currentStyle;
	}
}


// Liefert die IE Version als positive Zahl, die Mozilla Version als negative Zahl und 0 für den Rest.
function myCheckBrowserVersion()
{
	var sUserAgent = navigator.userAgent;
	var isOpera = sUserAgent.indexOf("Opera")>-1;
	var isKHTML = sUserAgent.indexOf("KHTML")>-1 || sUserAgent.indexOf("Konqueror")>-1 || sUserAgent.indexOf("AppleWebKit")>-1;
	var isMoz = sUserAgent.indexOf("Gecko")>-1 && !isKHTML;
	var isIE = sUserAgent.indexOf("compatible")>-1 && sUserAgent.indexOf("MSIE")>-1 && !isOpera;

	var res=0;
	if(isIE)
	{
		var reIE = new RegExp("MSIE (\\d+\\.\\d+)");
		reIE.test(sUserAgent);
		res=parseFloat(RegExp["$1"]);
	}
	else if(isMoz)
	{
		var reMoz = new RegExp("rv:(\\d+\\.\\d+(?:\\.\\d+)?)");
		reMoz.test(sUserAgent);
		res=0-parseFloat(RegExp["$1"]);
	}
	return res;
}


function myWaitElement()
{
	var el=document.getElementById("GUI_DISABLE");
	if(!el)
		el=document.getElementById("IsyDisable_CONTAINER");
		
	return el;
}


function myRemoveSortArrow(id)
{
	myRemoveNode(id+"_SORT_ARROW");
}


// fast unveränderte Funktion
function myGetElement(evt)
{
	var el;
	
	if (typeof(evt) == 'string')
	{
		el = document.getElementById(evt);
		
		if (el == 'undefined' || el == null) {
			if (debug) {
				alert('EasyGUI Debug Alert !\ngetElement("'+evt+'") failed. ID does not exist in document tree !');
			}
			
			return false;
		} else {
			return document.getElementById(evt);
		}
	}
	else if(typeof(evt) == 'object' && evt.target)
	{
		el= evt.target.tagName ? evt.target : evt.target.parentNode;
	}
	else
	{
		if (window.event)
		  	el = window.event.srcElement;
		else
		  	el = (event.target.tagName ? event.target : event.target.parentNode);
	}
	return el;
}


function myScrollToTableElement(rowId)
{
	if(typeof(rowId) != 'string') 
		return false;
	var oRow=document.getElementById(rowId);
	if(!oRow)
		return false;

	oRow.scrollIntoView(false);
	return true;
}

	
function myAddSortArrow(id, oArrow, asc)
{
	var oT=document.getElementById(id);
	var oImg=document.createElement("img");
	oImg.setAttribute("src", asc ? oT.getAttribute('sortarrowup_img') : oT.getAttribute('sortarrowdown_img'));
	oImg.id = id+"_SORT_ARROW";
	//oImg.attributes.getNamedItem("id").nodeValue = id+"_SORT_ARROW";
	var w=oArrow.offsetWidth, h=oArrow.offsetHeight;
		
	if(oArrow.lastChild!=null)
		oArrow.insertBefore(oImg, oArrow.lastChild);
	else
		oArrow.appendChild(oImg);

	if( w != oArrow.offsetWidth  ||  h != oArrow.offsetHeight )
		oArrow.removeChild(oImg);	// Sortierpfeil passt nicht
}


function myGetTableFrom(el)
{
	while(el.nodeName!="DIV")
		el=el.parentNode;
		
	return el.id;
}

function myGetRowFrom(el)
{	
	while(el.nodeName!="TR")
		el=el.parentNode;
	
	return el.id
}


// unveränderte Compare Funktion
function myCompareValues(a,b)
{
	a_tmp = parseFloat(a);
	b_tmp = parseFloat(b);
	
    if (!isNaN(a_tmp))
    {
    	a = a_tmp;
    }
    
    if (!isNaN(b_tmp))
    {
    	b = b_tmp;
    }
    
    var res;
    
    if (typeof(a) == typeof(b))
    {
	    if (a < b)
	    {
	    	res = -1;
	    }
	    else
	    {
	    	if (a == b)
	    	{
	    		res = 0;
	    	}
	    	else
	    	{
	    		res = 1;
	    	}
	    }
	}
	else
	{
		if (typeof(a) == "number")
		{
			res = -1;
		}
		else
		{
			res = 1;
		}
	}
    return res;
}


function myScrollHandler(id)
{
	addEvent(document.getElementById(id), "scroll", mySetScrollPos, false);
}

function myRemoveScrollHandler(id)
{
	removeEvent(document.getElementById(id), "scroll", mySetScrollPos, false)
}

function mySetScrollPos(evt)
{
	var el= typeof getElementFrom=='function' ? getElementFrom(evt) : myGetElement(evt);
	if(typeof el!='object')
		return;
	
	// horizontales scrollen (inkl. fixedlines)
	var oTFL = document.getElementById(el.id+"_FL_DIV");
	if(oTFL && el.scrollLeft!=el.lastScrollLeft ) {
   		oTFL.scrollLeft = el.scrollLeft;
   		el.lastScrollLeft=el.scrollLeft;
   	}
  
  	//Comboboxen im fixedlines Bereich ausblenden (IE6 Bug)
  	if( myBrowserId>0 && myBrowserId<7 && el.hideComboLock!=true
  		&& oTFL && el.scrollTop!=el.hideComboScrollTop )
   	{
   		el.hideComboLock=true;
   		el.hideComboScrollTop=el.scrollTop;
   		setTimeout("hideFixedLineCombos('"+el.id+"')",myViewDelay);
	}
   		
	// vertikales scrollen (inkl. fixedcolumns)
	var oTFC = document.getElementById(el.id+"_FC");
	if(oTFC && oTFC.getAttribute("_rows_complete"))
	{	// fixedcolumns komplett
		oTFC.scrollTop=el.scrollTop;
	}
	else if(oTFC && el.lockScroll!=true && el.scrollTop!=el.lastScrollTop)
	{	// fixedcolumns für den sichbaren Bereich erzeugen.
		if(el.scrollLeft==0)
			oTFC.style.visibility='hidden';
		el.lastScrollTop=el.scrollTop;
		el.lockScroll=true;
		setTimeout("showFixedCols('"+el.id+"')",myViewDelay); 
	}
}


function hideFixedLineCombos(id)
{
	// Comboboxen im Bereich der fixedlines ausblenden und 
	// umgekehrt wieder einblenden. Ab IE7 sollte das Problem
	// erledigt sein.
	
	var oT=document.getElementById(id);
	var oTFL=document.getElementById(id+"_FL_DIV");
	if(!oTFL) {
		oT.hideComboLock=false;
		return false;
	}
	if(oT.scrollTop != oT.hideComboScrollTop) {
   		oT.hideComboScrollTop=oT.scrollTop;
   		return setTimeout("hideFixedLineCombos('"+id+"')",myViewDelay);
	}
		
	var cbArray=oT.getElementsByTagName("select");
	var limitTop=parseInt(oT.scrollTop);
	var limitBottom=limitTop+parseInt(oTFL.offsetHeight);

   	for(var i=0;i<cbArray.length;i++)
   	{
		if(oT.scrollTop != oT.hideComboScrollTop) {
	   		oT.hideComboScrollTop=oT.scrollTop;
	   		return setTimeout("hideFixedLineCombos('"+id+"')",myViewDelay);
		}
   		
   		var cb=cbArray[i];
		if(parseInt(cb.offsetTop+cb.offsetHeight)>=limitTop && parseInt(cb.offsetTop)<=limitBottom)
		{
			if(!cb.getAttribute('hiddenCombo'))
				cb.setAttribute('hiddenCombo','true');
			cb.style.visibility='hidden';
		}
		else if(parseInt(cb.offsetTop)>limitBottom && cb.getAttribute('hiddenCombo'))
		{
			cb.style.visibility='visible';
			cb.removeAttribute('hiddenCombo');
		}
	}
	oT.hideComboLock=false;
	return true;
}



function myClickHandler(id)
{
	addEvent(document.getElementById(id), "click", mySelectRow, false);
}

function myClickHandlerFC(id)
{
	addEvent(document.getElementById(id+"_FC"), "click", mySelectRowFC, false);
}


function mySelectRowFC(evt)
{
	var el = myGetElement(evt);
	if (el == null || el.nodeName == "DIV" || el.id == "" || el==false)
		return;

	var trId=el.parentNode.id.replace("_FC","");
	trId=trId.replace("FC_",""); // Sollte jetzt die normale row Id sein.
	mySelectRow(trId);
}


function mySelectRow(evt)
{
	// Selected Row markieren (Mit Hack für zusätzliche Farben SPECIAL_...) 
	var el = myGetElement(evt);
	if (el == null || el.nodeName == "DIV" || el.id == "" || el==false)
		return;

	var oT = document.getElementById(myGetTableFrom(el));
	var oRow = document.getElementById(myGetRowFrom(el));
	var fl = oT.getAttribute('fixedlines') ? oT.getAttribute('fixedlines') : 0;
	var oTBody=oRow.parentNode;

	for(var i=0;i<fl;i++)
		if(oTBody.childNodes[i]==oRow)
			return false;	// fixedlines nie selektieren

	var bFixedCols = oT.getAttribute('fixedcolumns_hidden')>0;
	
	var lastSelRow = oT.getAttribute('lastselectedrow') ? document.getElementById(oT.getAttribute('lastselectedrow')) : null;
	if(lastSelRow) {
		var bgcolor = lastSelRow.getAttribute('_bgcolor');
		var color = lastSelRow.getAttribute('_color');
		
		var td=lastSelRow.getElementsByTagName("TD");
		for(i=0; i<td.length ; i++) {
			td[i].style.backgroundColor=bgcolor; td[i].style.color=color;
		}
	
		if(bFixedCols) {
			var lastSelRowFC = document.getElementById(lastSelRow.id+"_FC");
			var td= lastSelRowFC ? lastSelRowFC.getElementsByTagName("TD") : null;
			for(i=0; td && i<td.length ; i++) {
				td[i].style.backgroundColor=bgcolor; td[i].style.color=color;
			}
		}
	}
	
	var bgcolor_hl,color_hl;
	
	if( oRow.getAttribute("SPECIAL_BGCOLOR_SELECTED")!=null )	{
	 	bgcolor_hl = oRow.getAttribute("SPECIAL_BGCOLOR_SELECTED");
	  	color_hl = oRow.getAttribute("SPECIAL_COLOR_SELECTED");
	}
	else {
	 	bgcolor_hl = oT.getAttribute('backgroundcolorhighlight');
	  	color_hl = oT.getAttribute('textcolorhighlight');
	}
	
	var td=oRow.getElementsByTagName("TD");
	oRow.setAttribute('_bgcolor', td.length ? td[0].style.backgroundColor : oRow.style.backgroundColor);
	oRow.setAttribute('_color', td.length ? td[0].style.color : oRow.style.color);
	
	for(i=0;i<td.length;i++) {
		td[i].style.backgroundColor=bgcolor_hl;	td[i].style.color=color_hl;
	}

	if(bFixedCols) {
		var oRowFC = document.getElementById(oRow.id+"_FC");
		var td= oRowFC ? oRowFC.getElementsByTagName("TD") : null;
		for(i=0 ; td && i<td.length ; i++) {
			td[i].style.backgroundColor=bgcolor_hl; td[i].style.color=color_hl;
		}
	}
	
	oT.setAttribute('lastselectedrow', oRow.id);
	document.isycat[oT.id].value=oRow.id;
}


function generateCompareTRs(iCol) {
    return  function compareTRs(oTR1, oTR2) {
                var val1 = oTR1.cells[iCol].firstChild.nodeValue;
                var val2 = oTR2.cells[iCol].firstChild.nodeValue;
                
				for(var oVal1=oTR1.cells[iCol].firstChild ; oVal1.nextSibling!=null ; oVal1=oVal1.nextSibling )
				{
					if(oVal1.nodeName=="INPUT")  { val1=oVal1.value; break; }
					if(oVal1.nodeName=="SELECT") { val1=oVal1.selectedIndex>=0 ? oVal1[oVal1.selectedIndex].text : "" ; break; }
				}

				for(var oVal2=oTR2.cells[iCol].firstChild ; oVal2.nextSibling!=null ; oVal2=oVal2.nextSibling )
				{
					if(oVal2.nodeName=="INPUT") { val2=oVal2.value; break; }
					if(oVal2.nodeName=="SELECT") { val2=oVal2.selectedIndex>=0 ? oVal2[oVal2.selectedIndex].text : "" ; break; }
				}
                
                return myCompareValues(val1,val2);
            };
}


function mySortTable(sTableId,iCol,tdObj)
{
	var waitElement = myWaitElement();
	waitElement.style.cursor="wait";
	waitElement.style.visibility = 'visible';
	
	var oT = document.getElementById(sTableId);
	var oTable = document.getElementById(sTableId+"_TABLE");
	var oTBody = oTable.tBodies[0];
	var colDataRows = oTBody.rows;
	var nRows=colDataRows.length;
	var aTRs = new Array;
	var aFixTRs = new Array;
	var fl = oT.getAttribute('fixedlines') ? oT.getAttribute('fixedlines') : 0;
	var fc = oT.getAttribute('fixedcolumns_hidden') ? oT.getAttribute('fixedcolumns_hidden') : 0;

	fl=parseInt(fl); fc=parseInt(fc);
	
	// fixedlines retten
	for(var i=0 ; i<nRows ; i++)
	{
		if(i<fl)
			aFixTRs[i] = colDataRows[i];
		else
			aTRs[i-fl] = colDataRows[i];
	}

	
	// andere Zeilen sortieren.
	if(oTable.sortCol == iCol)
		aTRs.reverse(); // Bereits sortierte Tabelle umdrehen
	else
		aTRs.sort(generateCompareTRs(iCol));

		
	// geänderte Zeilen wieder ins Dokument
	var oFragment = document.createDocumentFragment();
	for(var i=0 ; i<nRows ; i++)
	{
		if(i<fl)
			oFragment.appendChild(aFixTRs[i]);
		else
			oFragment.appendChild(aTRs[i-fl]);
	}
	
	oTBody.appendChild(oFragment);
	
	if(oTable.sortCol!=iCol)
		oTable.sortAscending=true;
	else
		oTable.sortAscending= !oTable.sortAscending;

	var headerDiv=tdObj.parentNode;
	while( !headerDiv.id )
		headerDiv=headerDiv.parentNode;

	if(	oT.getAttribute('sortarrows')!="false" ) {
		myRemoveSortArrow(sTableId);
		myAddSortArrow(sTableId, tdObj, oTable.sortAscending);
	}
	
	oTable.sortCol=iCol;
	
	waitElement.style.cursor = "hand";
	waitElement.style.visibility = 'hidden';
}


function mySortColumn(sTableId,colIdx,tdObj)
{
	// nach onclick auf Überschrift die Tabelle sortieren und
	// eventuell die Zeilenfarben neu setzen.
	
	var oT=document.getElementById(sTableId);
	
	mySortTable(sTableId,colIdx,tdObj);
	
	if(oT.getAttribute("preparerowcolors")!=null)
	{
		eval(oT.getAttribute("preparerowcolors")+"('"+sTableId+"')");
	}
	else if(typeof setRowStyles=='function')
	{
		setRowStyles(sTableId);
	}

	var fc = oT.getAttribute('fixedcolumns_hidden') ? oT.getAttribute('fixedcolumns_hidden') : 0;
	if(fc > 0 ) {
		myRemoveNode(sTableId+"_FC"); 	// fixedcolumns div leeren
		showFixedCols(sTableId);		// und neu erzeugen 
	}
	
	//var selectedRowId=document.isycat[sTableId].value;
	//if(selectedRowId!="") // selected row anscrollen (wirklich?!?)
	//	myScrollToTableElement(selectedRowId);
}



function showFixedCols(id)
{
	// Nur die sichtbaren fixen Spalten erzeugen. Beim vertikalen Scrollen müssen 
	// die fehlenden Elemente für den "Sichtbereich" erzeugt werden. Dadurch fallen
	// die langen Wartezeiten beim init weg.
		
	var oT=document.getElementById(id);
	var fl = oT.getAttribute('fixedlines') ? oT.getAttribute('fixedlines') : 0;
	var fc = oT.getAttribute('fixedcolumns_hidden') ? oT.getAttribute('fixedcolumns_hidden') : 0;
	var oTBody = document.getElementById(id+"_TABLE").tBodies[0];
	var n = oTBody.rows.length;
	if(fc<=0 || n==0) {
		oT.lockScroll=false;
		return false;
	}
		
	var trDummy=document.createElement("tr");
	var ts=myRuntimeStyle(oT);
	var bgcolor= ts.backgroundColor;
	var defHeight=parseInt(oT.scrollHeight) / n;
	var limitTop=parseInt(oT.scrollTop) - parseInt( defHeight );
	var limitBottom=limitTop + parseInt(oT.offsetHeight) + parseInt( defHeight );
	var divHtml="",colGroupHtml="",addHtml="",elemHtml="",l=0,t=0,h=0,w=0,count=0;
	
	var tdArray=oTBody.rows[n-1].getElementsByTagName("TD");
	var lrObj= tdArray.length>=fc ? tdArray[fc-1] : null;
	if(!lrObj) {
		oT.lockScroll=false;
		return false;
	} else {
		for(var i=0;i<fc;i++)
			colGroupHtml+="<col width="+tdArray[i].offsetWidth+">";
	}
	
	w=parseInt(lrObj.offsetLeft+lrObj.offsetWidth);
	h=parseInt(oT.offsetHeight) - parseInt(oT.scrollWidth > oT.offsetWidth ? 18 : 0);
			
	var oTFC=document.getElementById(id+"_FC");
	if(!oTFC)
	{
		divHtml="<div id='"+id+"_FC' style='overflow: hidden; z-index:10; background-color:"+bgcolor+";"
				+"left:"+ts.left+"; top:"+ts.top+"; width:"+w+"px; height:"+h+"px;'>";
		
		oT.insertAdjacentHTML("beforeBegin", divHtml+"</div>" );
		oTFC=document.getElementById(id+"_FC");
		myClickHandlerFC(id);
	}

	var fixWidth= oTFC ? myRuntimeStyle(oTFC).width : w;
	var useOuterHTML= lrObj.outerHTML!='undefined' && lrObj.outerHTML!=null;
	
	for (i=fl ; i<n ; i++)
	{
		var trObj=oTBody.rows[i];
		var trId=trObj.id+"_FC";
		var rowTop=parseInt(trObj.offsetTop);
		var rowHeight=parseInt(trObj.offsetHeight);
		var rowBottom=rowTop + rowHeight;

		if(rowTop>limitBottom)
			break;
			
		if(rowTop<limitTop || document.getElementById(trId))
			continue;

		var s=myRuntimeStyle(trObj);
		var trcolor=s.color;
		var trbgcolor= s.backgroundColor!='transparent' ? s.backgroundColor : bgcolor;
		var tdArray=trObj.getElementsByTagName("TD");
		
		elemHtml="";
		for(j=0 ; j<fc ; j++)
		{
			if(useOuterHTML)
				elemHtml+=tdArray[j].outerHTML.replace("id=","id=FC_");
			else 
			{	// Kein outerHTML in Mozilla, deshalb Umweg über cloneNode, appendChild, u. innerHTML
				trDummy.appendChild(tdArray[j].cloneNode(true));
				elemHtml+=trDummy.innerHTML.replace("id=","id=FC_");
				trDummy.removeChild(trDummy.firstChild);
			}
		}
		
		addHtml+="<table style='left:"+trObj.offsetLeft+"px;top:"+trObj.offsetTop+"px;width:"+fixWidth+";height:"+trObj.offsetHeight+"px;' cellspacing='0'>"
			   + "<colgroup>"+colGroupHtml+"</colgroup>"	
			   + "<tr id='"+trId+"' style='background-color:"+trbgcolor+"; color:"+trcolor+";'>"+elemHtml+"</tr></table>";
	}

	if(addHtml!="")
		oTFC.insertAdjacentHTML("beforeEnd", addHtml);
	
	if(oTFC.childNodes.length == n-fl)
		oTFC.setAttribute("_rows_complete","true"); // fixedcolumns vollständig
	
	oTFC.style.visibility='visible';
	oTFC.scrollTop = oT.scrollTop;
	oT.lockScroll=false;
	return true;
}


function myPreLoadImage(imgSrc)
{
	var img=document.createElement('img');
	img.setAttribute('src',imgSrc);
	img.style.visibility='hidden';
	document.body.appendChild(img);
}



function mySimpleTableInit(id)
{
	myBrowserId = myCheckBrowserVersion();
	
	var oT=document.getElementById(id);
	var fl = oT.getAttribute('fixedlines') ? oT.getAttribute('fixedlines') : 0;
	var fc = oT.getAttribute('fixedcolumns') ? oT.getAttribute('fixedcolumns') : 0;
	
	if(fc>0) { // Den Wert verstecken (warum nochmal?!?)
		oT.setAttribute('fixedcolumns_hidden',fc);
		oT.setAttribute('fixedcolumns',0);
	}

	if ((userFunction = oT.getAttribute('userfunction')) && userFunction!="")
	{
		var oTBody = document.getElementById(id+"_TABLE").tBodies[0];
		var n = oTBody.rows.length;
		for (i=0; i<n ; i++)
			addEvent(oTBody.rows[i], "click", eval(userFunction), true);
	}
	
	// Die fixen Überschriften erzeugen. Bei der Kombination fixedlines und
	// fixedcolumns sind 2 Div Blöcke notwendig.
	var firstLeft=-1,totalHeight=0,resultHtmlTemp="",resultHtmlTempFC="";
	var trArray= fl>0 ? oT.getElementsByTagName("TR") : null;
	var tStyle=myRuntimeStyle(oT);
	if( tStyle.backgroundColor=='transparent' && oT.getAttribute("rowbackgroundcolor") )
		oT.style.backgroundColor=oT.getAttribute("rowbackgroundcolor");
	var bgcolor= tStyle.backgroundColor!='transparent' ? tStyle.backgroundColor : 'white';

	if(fl>0)
	{	// preload sort arrows
		myPreLoadImage(oT.getAttribute('sortarrowup_img'));
		myPreLoadImage(oT.getAttribute('sortarrowdown_img'));
	}
		
	for(row=0 ; row<fl ; row++)
	{
		var trObj=trArray[row];
		totalHeight+=trObj.offsetHeight;
		var tdArray=trObj.getElementsByTagName("TD");
		
		for(i=0 ; i<tdArray.length ; i++)
		{
			var obj=tdArray[i];
			
			firstLeft= i==fc ? parseInt(obj.offsetLeft) : firstLeft;
			var l=parseInt(obj.offsetLeft),  t=parseInt(obj.offsetTop);
			var w=parseInt(obj.offsetWidth), h=parseInt(trObj.offsetHeight);
			var cssClass= obj.className ? obj.className : "";
			var objId=obj.id+"_FL_DIV";
			
			// Jedes TD aus der Überschrift wird eine Tabelle verpackt
			addHtml ="<div id='"+objId+"' style='z-index:10;";
			addHtml+="left:"+l+"px; top:"+t+"px; width:"+w+"px; height:"+h+"px;'>";
			addHtml+="<table style='width: 100%;' cellspacing='0'>";
			addHtml+="<tr style='background-color:"+bgcolor+";' >";
			addHtml+="<td class='"+cssClass+"' style='height:"+h+"px;' ";
			addHtml+="onclick=\"mySortColumn('"+id+"',"+i+",this)\">";
			addHtml+=obj.innerHTML+"</td></tr></table></div>";
			
			if(i<fc)
				resultHtmlTempFC+=addHtml;
			else
				resultHtmlTemp+=addHtml;
		}
	}
	
	var l=parseInt(oT.offsetLeft), 	 t=parseInt(oT.offsetTop);
	var w=parseInt(oT.offsetWidth-17), h=totalHeight;
	
	if(resultHtmlTempFC!="")
	{
		// Schnittmenge zw. fixedlines und fixedcolumns, d.h. horizontal u. vertikal fix.
		var resultHtml ="<div style='left:"+l+"px; top:"+t+"px; width:"+w+"px;height:"+h+"px; ";
		resultHtml+="overflow:hidden; z-index:11' id='"+id+"_FC_DIV'>";
		resultHtml+=resultHtmlTempFC+"</div>";
		oT.insertAdjacentHTML("afterEnd", resultHtml);
	}

	if(resultHtmlTemp!="")
	{
		// fixedlines, d.h. vertikal fix
		var resultHtml ="<div style='left:"+l+"px; top:"+t+"px; width:"+w+"px;height:"+h+"px; ";
		resultHtml+="overflow:hidden; z-index:10' id='"+id+"_FL_DIV'>";
		resultHtml+=resultHtmlTemp+"</div>";
		oT.insertAdjacentHTML("afterEnd", resultHtml);
	}

	myScrollHandler(id);
	myClickHandler(id);

	if(oT.getAttribute("preparerowcolors")!=null)
	{	// Userfunction zum setzen der Hintergrundfarben
		// (z.B. bei 2 möglichen Farben für die selected row)
		eval(oT.getAttribute("preparerowcolors")+"('"+id+"')");
	}
	else if(typeof setRowStyles=='function')
	{	// Falls vorhanden die Standardfunktion für die Farben ausführen.
		setRowStyles(id);
	}
	
	if(oT.getAttribute('selected') && oT.getAttribute('selected')!="")
	{	// selected row markieren und anscrollen
		var selectedRowId=oT.getAttribute('selected');
		if( selectedRowId!="" && document.getElementById(selectedRowId) ) {
			mySelectRow(selectedRowId);
			myScrollToTableElement(selectedRowId);
		}
	}
	
	if(fc>0)
		showFixedCols(id);	// festgehaltene Spalten erzeugen
		

	if(oT.getAttribute("userinitfunction") != null) {
		var userInitFn = oT.getAttribute('userinitfunction');
		if(userInitFn != "") {
			eval(userInitFn + "('" + oT.id + "')");
		}
	}
}





// Simulating inserAdjacentHTML on NS6
// Code by thor@jscript.dk
// ******************************************

if(typeof HTMLElement!="undefined" && !HTMLElement.prototype.insertAdjacentElement){
	HTMLElement.prototype.insertAdjacentElement = function (where,parsedNode)
	{
		switch (where){
		case 'beforeBegin':
			this.parentNode.insertBefore(parsedNode,this)
			break;
		case 'afterBegin':
			this.insertBefore(parsedNode,this.firstChild);
			break;
		case 'beforeEnd':
			this.appendChild(parsedNode);
			break;
		case 'afterEnd':
			if (this.nextSibling) 
				this.parentNode.insertBefore(parsedNode,this.nextSibling);
			else this.parentNode.appendChild(parsedNode);
			break;
		}
	}

	HTMLElement.prototype.insertAdjacentHTML = function(where,htmlStr)
	{
		var r = this.ownerDocument.createRange();
		r.setStartBefore(this);
		var parsedHTML = r.createContextualFragment(htmlStr);
		this.insertAdjacentElement(where,parsedHTML)
	}
}
