function loadCalendar(insertEl,userfunc)
{
  //init calendar
  var nd,cal,thead,th;
  nd=new Date();
  nd.setTime(AKT_DATE+"000");
  cal=createCalendar(nd.getMonth(),nd.getFullYear(),userfunc,true);
  
  //create headline
  thead=cEm("thead");
  th=cEs("th",3);
  
  //backward Month (cell)
  th[0].id="preMonth";
  th[0].style.cursor="pointer";
  th[0].onclick=function()
  {
  insertEl.innerHTML="";
  nd.setMonth(nd.getMonth()-1);
  AKT_DATE=dateToUnixTime(nd);
  loadCalendar(insertEl,userfunc);
  };
  aC(th[0],cTn("<"));
  
  //MonthName (cell)
  th[1].colSpan="6";
  th[1].id="monthName";
  aC(th[1],cTn(returnMonthName(nd.getMonth())+" "+nd.getFullYear()));
  
  //forward Month (cell)
  th[2].id="nexMonth";
  th[2].style.cursor="pointer";
  th[2].onclick=function()
  {
  insertEl.innerHTML="";
  nd.setMonth(nd.getMonth()+1);
  AKT_DATE=dateToUnixTime(nd);
  loadCalendar(insertEl,userfunc);
  };
  aC(th[2],cTn(">"));
  
	//insert and create
	tr=cEm("tr");
	aCs(tr,th)
	aC(thead,tr);
  cal.insertBefore(thead,cal.getElementsByTagName("tbody")[0]);
  aC(insertEl,cal);
}

function createCalendar(month,year,userModCellFunc,kw)
{
  var nd,tds,a,tr,aktDay,tbody,thead,tbl,dn,td;
	kw=(kw===true)?true:false;
	nd=new Date();
	nd.setHours(0);
	nd.setMilliseconds(0);
  nd.setMinutes(0);
	nd.setSeconds(0);
  tbody=cEm("tbody");
	tbl=cEm("table");
	tbl.className="calendar";
	//thead=cEm("thead");
	//generate table heading
	tds=cEs("td",7);
	for(var a=1;a<8;a++)
	{
  	dn=returnDayName(a);
		tds[a-1].className="head";
		aC(tds[a-1],cTn(dn.substr(0,2)));
	}
	tds[5].className+=" weekend";
	tds[6].className+=" weekend";
	tr=cEm("tr");
	if(kw===true)
	{
  	td=cEm("td");
		td.className="head KW";
  	aC(td,cTn("KW"));
		aC(tr,td);
	}
	aCs(tr,tds);
	aC(tbody,tr);
	aC(tbl,tbody);
	tds=cEs("td",7);
	for(a=1;a<=returnMonthLength(month,year);a++)
  {
    nd.setDate(a)
    nd.setMonth(month)
    nd.setFullYear(year)
		
    aktDay=parseEngDayToGerman(nd);//eng: sunday=0 monday=1 -> bullshits
		if(userModCellFunc!=null) window[userModCellFunc](nd,tds[aktDay],aktDay);
    aC(tds[aktDay],cTn(a));
		tds[aktDay].id=digits(nd.getDate())+"."+digits(nd.getMonth()+1)+"."+nd.getFullYear().toString().substr(2,2);
    if(aktDay==6 || a==returnMonthLength(month,year))
    {
      tds[5].className+=" weekend";
    	tds[6].className+=" weekend";
			tds[0].className+=" first";
      tr=cEm("tr");
			if(kw===true)
			{
  			td=cEm("td");
  			td.className="KW";
  			aC(td,cTn(kalenderwoche(nd.getFullYear(),nd.getMonth()+1,nd.getDate())));
  			aC(tr,td);
      }
			aCs(tr,tds);
      aC(tbody,tr);
      tds=cEs("td",7);
    }
	}
	aC(tbl,tbody);
	return tbl;
}

function kalenderwoche(jahr,monat,tag) 
{
  var datum=new Date(jahr,monat-1,tag); // Anm. 1
  var jh=jahr+1; // Anm. 2
  var kalwo=kaldiff(datum,jh);
  while(kalwo<1) { jh--; kalwo=kaldiff(datum,jh); }
  return kalwo;
}
function kaldiff(datum,jahr) 
{
  var d4j=new Date(jahr,0,4);
  var wt4j=(d4j.getDay()+6)%7; // Anm. 3
  var m1wjT=Math.floor(0.01+d4j.getTime()/864e5-wt4j); // Anm. 4
  var datumT=Math.floor(0.01+datum.getTime()/864e5); // Anm. 5
  return Math.floor(1+(datumT-m1wjT)/7); // Anm. 6
}

function digits(x)
{
  if(x.toString().length<2) x="0"+x;
  return x;
}