function makeTab(tab, styleName, iDiv, flagHeader, tableAttr)
{
	// author: Przemysław Mastela, www.mastela.com
	// params:
	//   tab - array eg. [["attr TD0", "attr TD1"],	   - atrybuty dla poszczególnych kolumn (np. align=center)
	//                    ["field 0x1","field 0x2"],   - ta linia może być nagłówkiem
	//                    ["field 1x1","field 1x2"],
	//                    ["field 2x1","field 2x2"]];
	//   styleName - nazwa przedrostka dla styli
	//   iDiv - division step, 0 = dissable
	//   flagHeader - flaga, jeżeli zaznaczona pierwsza linia jest uważana za nagłówek 
	//   tableAttr - atrybuty dla tabeli
	// css classes:
	//   styleName_tb - <table>
	//   styleName_tb_td0 - <td> header
	//   styleName_tb_td_div - <td> divided attribute
	//   styleName_tb_tr1 - <tr> first line
	//   styleName_tb_tr2 - <tr> second line
	
	var iCols = tab[0].length;
	var i,x,buffer,startLine,colspan;
	
	buffer = "<table "+tableAttr+" class="+styleName+"_tb>";
	
	// pierwsza linia danych
	if (flagHeader)
	{
		//for (x=0; x < iCols; x++)
		//	buffer += "<td class="+styleName+"_tb_td0>"+tab[1][x]+"</td>";
		//buffer += "</tr>";
		
		startLine = 2;
	}
	else
		startLine = 1;
	
	// pola
	for (i = 1; i < tab.length; i++)
	{
		classAtr = (iDiv && !((i-startLine+1)%iDiv)) ? " class="+styleName+"_tb_td_div" : " class="+styleName+"_tb_tdx";
		
		if (i < startLine)	buffer += "<tr>";
		else buffer += "<tr class="+styleName+"_tb_tr"+((i%2)+1)+">";
			
		colspan = 1;
		
		for (x=0; x < iCols; x++)
		{
			if (!tab[i][x+1] && x+1 < iCols) {
				colspan++;
				continue;
			}
				
			if (i < startLine)
				buffer += "<td colspan="+colspan+" class="+styleName+"_tb_td0>"+tab[1][x-colspan+1]+"</td>";
			else
				buffer += "<td colspan="+colspan+classAtr+" "+tab[0][x-colspan+1]+">"+tab[i][x-colspan+1]+"</td>";
				
			colspan = 1;
		 }
		buffer += "</tr>";
	}
		
	buffer += "</table>";
	document.write(buffer);
}

