function calShowCalendar(ar){
	//divId, month, year, browseable, preDiv, postDiv, tblId
	var div = document.getElementById(ar.divId);
	if(!div){
		alert("calCreateCalendar: divId ungültig!\n("+ar.divId+")");
		return;
	}
	else{
		div.innerHTML = "";

		var today = new Date();

		div.browseable = false;
		div.navigationType = "short";
		div.preDiv = null;
		div.postDiv = null;
		div.year = today.getFullYear();
		div.month = today.getMonth()+1; //zero based
		div.tblId = "";
		div.overlayVerticalAlign = "bottom";
		div.overlayHorizontalAlign = "right";
		div.overlayDelay = 0;
		div.overlayFade = true;
		div.overlayFadeSpeed = 200;
		div.eventList = null;
		div.onEventClickStaticHorizontalAlign = "right";
		div.onEventClickStaticVerticalAlign = "bottom";
		div.onEventClick = "none";
		div.onEventClickNewWindow = false;
		div.onEventClickPostEnable = false;
		div.onEventClickPostYear = "year";
		div.onEventClickPostMonth = "month";
		div.onEventClickPostDay = "day";
		div.onDayClick = "none";
		div.admin = false;
		div.onNew = null;
		div.onDelete = null;
		div.onEdit = null;
		div.noEvents = false;

		if(typeof(ar.browseable) != "undefined")			div.browseable = ar.browseable;
		if(typeof(ar.navigationType) != "undefined")			div.navigationType = ar.navigationType;
		if(typeof(ar.preDiv) != "undefined")				div.preDiv = ar.preDiv;
		if(typeof(ar.postDiv) != "undefined")				div.postDiv = ar.postDiv;
		if(typeof(ar.year) != "undefined")				div.year = ar.year;
		if(typeof(ar.month) != "undefined")				div.month = ar.month;
		if(typeof(ar.tblId) != "undefined")				div.tblId = ar.tblId;
		if(typeof(ar.overlayVerticalAlign) != "undefined")		div.overlayVerticalAlign = ar.overlayVerticalAlign;
		if(typeof(ar.overlayHorizontalAlign) != "undefined")		div.overlayHorizontalAlign = ar.overlayHorizontalAlign;
		if(typeof(ar.overlayDelay) != "undefined")			div.overlayDelay = ar.overlayDelay;
		if(typeof(ar.overlayFade) != "undefined")			div.overlayFade = ar.overlayFade;
		if(typeof(ar.overlayFadeSpeed) != "undefined")			div.overlayFadeSpeed = ar.overlayFadeSpeed;
		if(typeof(ar.eventList) != "undefined")				div.eventList = ar.eventList;
		if(typeof(ar.onEventClickStaticHorizontalAlign) != "undefined")	div.onEventClickStaticHorizontalAlign = ar.onEventClickStaticHorizontalAlign;
		if(typeof(ar.onEventClickStaticVerticalAlign) != "undefined")	div.onEventClickStaticVerticalAlign = ar.onEventClickStaticVerticalAlign;
		if(typeof(ar.onEventClick) != "undefined")			div.onEventClick = ar.onEventClick;
		if(typeof(ar.onEventClickNewWindow) != "undefined")		div.onEventClickNewWindow = ar.onEventClickNewWindow;
		if(typeof(ar.onEventClickPostYear) != "undefined")		div.onEventClickPostYear = ar.onEventClickPostYear;
		if(typeof(ar.onEventClickPostMonth) != "undefined")		div.onEventClickPostMonth = ar.onEventClickPostMonth;
		if(typeof(ar.onEventClickPostDay) != "undefined")		div.onEventClickPostDay = ar.onEventClickPostDay;
		if(typeof(ar.onEventClickPostEnable) != "undefined")		div.onEventClickPostEnable = ar.onEventClickPostEnable;
		if(typeof(ar.onDayClick) != "undefined")			div.onDayClick = ar.onDayClick;
		if(typeof(ar.onDayClickNewWindow) != "undefined")		div.onDayClickNewWindow = ar.onDayClickNewWindow;
		if(typeof(ar.onDayClickPostYear) != "undefined")		div.onDayClickPostYear = ar.onDayClickPostYear;
		if(typeof(ar.onDayClickPostMonth) != "undefined")		div.onDayClickPostMonth = ar.onDayClickPostMonth;
		if(typeof(ar.onDayClickPostDay) != "undefined")			div.onDayClickPostDay = ar.onDayClickPostDay;
		if(typeof(ar.onDayClickPostEnable) != "undefined")		div.onDayClickPostEnable = ar.onDayClickPostEnable;
		if(typeof(ar.admin) != "undefined")				div.admin = ar.admin;
		if(typeof(ar.onNew) != "undefined")				div.onNew = ar.onNew;
		if(typeof(ar.onDelete) != "undefined")				div.onDelete = ar.onDelete;
		if(typeof(ar.onEdit) != "undefined")				div.onEdit = ar.onEdit;
		if(typeof(ar.noEvents) != "undefined")				div.noEvents = ar.noEvents;
	}

	var table = calCreateCalTable(ar.divId);//, div.month, div.year, div.browseable, div.preDiv, div.postDiv);
	table.setAttribute("id", div.tblId);

	if(typeof(calDB_getScheduleArray) != "undefined" && div.noEvents == false)
		calDB_getScheduleArray(div.month, div.year, function(r){calCallbackDbResult(r, table);});

	div.appendChild(table);
}

function calUpdateCalendar(divId, mOffset, yOffset, preorpost, set) {	//if "set" is true, m and y parameters are set and not added/substracted
	div = document.getElementById(divId);
	if(!div){
		alert("calUpdateCalendar: divId ungültig!\n("+divId+")");
		return;
	}
	else{
		if(set) {
			div.month = mOffset;
			div.year = yOffset;
		}
		else {
		//------------ month skip
			var m = mOffset % 12;
			div.month += m;
			//year skip caused by previous month +/- mOffset
			if(div.month > 12){
					div.year++;
					div.month -= 12;
			}
			if(div.month < 1){
					div.year--;
					div.month += 12;
			}

		//------------ year skip caused by mOffset > 12
			var y = 0;
			if(mOffset < 0)
				y = Math.ceil(mOffset / 12);
			else if(mOffset > 0)
				y = Math.floor(mOffset / 12);

			div.year += y;

		//------------ year skip from yOffset
			div.year += yOffset;
		}

		var browseable = div.browseable;
		var preDiv = div.preDiv;
		var postDiv = div.postDiv;
		var year = div.year;
		var month = div.month;
		var tblId = div.tblId;

		div.innerHTML = "";
	}

	var table = calCreateCalTable(divId);//, month, year, browseable, preDiv, postDiv);
	table.setAttribute("id", tblId);

	if(typeof(calDB_getScheduleArray) != "undefined" && div.noEvents == false)
		calDB_getScheduleArray(month, year, function(r){calCallbackDbResult(r, table);});

	div.appendChild(table);

	if((preorpost == "pre") && preDiv)
		calUpdateCalendar(preDiv, mOffset, yOffset, "pre", set);
	else if((preorpost == "post") && postDiv)
		calUpdateCalendar(postDiv, mOffset, yOffset, "post", set);
}

function calCreateCalTable(divId) {//, month, year, browseable, preDiv, postDiv) {
	var divObj = document.getElementById(divId);
	if(!divObj) {
		alert("calCreateCalTable: Ungültige divId\n"+divId);
		return false;
	}

	var month = divObj.month;
	var year = divObj.year;
	var browseable = divObj.browseable;
	var preDiv = divObj.preDiv;
	var postDiv = divObj.postDiv;

//table
	var table = document.createElement("table");
	table.className = "cWholeTable";
	table.setAttribute("cellspacing", "1");
	table.setAttribute("cellpadding", "0");
	table.setAttribute("width", "100%");
	table.setAttribute("height", "100%");

	table.divContainer = divObj;

	var tbl = document.createElement("tbody");
	table.appendChild(tbl);
//table header
	var tr = document.createElement("tr");
	tr.className = "cMonthRow";
	var td = document.createElement("td");
	td.colSpan = 7;
	td.innerHTML = calGetNameOfMonth(month) + " " + year;
	tr.appendChild(td);
	tbl.appendChild(tr);
//day row
	var tr = document.createElement("tr");
	tr.className = "cDayRow";
	for(var i = 0; i < 7; i++) {
		var td = document.createElement("td");
		td.setAttribute("width", "14%");
		td.innerHTML = calGetShortNameOfWeekDay(i);
		tr.appendChild(td);
	}
	tbl.appendChild(tr);


	var nrOfRows = 0;
//predays
	var predays = calGetPreDaysStart(month, year);
	var firstwday = calGetFirstWeekDay(month, year);
	var tr = document.createElement("tr");
	tr.className = "cWeekRow";
	if(firstwday > 0)			//add tr only if there are predays (otherwise an empty row is inserted
		tbl.appendChild(tr);	// since the for loop below is skipped and "month days" is opening a new row then)

	for(var i = 0; i < firstwday; i++) {
		var td = document.createElement("td");
		td.setAttribute("width", "14%");
		if(i < 1 || i > 5)
			td.className = "cUnimportant cWeekend";
		else
			td.className = "cUnimportant";
		td.innerHTML = predays;

		tr.appendChild(td);
		if((month-1) < 1)
			calCallbackDayCell(td, predays, 12, year-1);
		else
			calCallbackDayCell(td, predays, month-1, year);


		predays++;
	}
//month days
	var day = 1;
	var daysinmonth = calDaysInMonth(month, year);
	var firstwday = calGetFirstWeekDay(month, year);
	for(var i = firstwday; day <= daysinmonth; i++) {
		if(i == 0) {
			var tr = document.createElement("tr");
			tr.className = "cWeekRow";
			tbl.appendChild(tr);
		}
		var td = document.createElement("td");
		td.setAttribute("width", "14%");
		if(i < 1 || i > 5)
			td.className = "cWeekend";
		td.innerHTML = day;
		if(typeof(divObj.onDayClick) == "function"){
			td.day = day;
			td.month = month;
			td.year = year;
			td.onclick = function(){divObj.onDayClick(this.day, this.month, this.year);};
		}
		tr.appendChild(td);
		calCallbackDayCell(td, day, month, year);
		
		day++;
		if(i >= 6) {
			nrOfRows++;
			i = -1;
		}
	}
//afterdays to complete the last week
	var lastwday = calGetLastWeekDay(month, year);
	/*if(lastwday >= 6){		//are there any days left to complete the last week
		var tr = document.createElement("tr");	//start new row
		tr.className = "cWeekRow";
		if(1 + lastwday <= 6)		//only add new row if the for loop below is
			tbl.appendChild(tr);
	}*/
	for(var i = 1; i + lastwday <= 6; i++) {
		var td = document.createElement("td");
		td.setAttribute("width", "14%");
		if(i < 1 || i > 5)
			td.className = "cUnimportant cWeekend";
		else
			td.className = "cUnimportant";
		td.innerHTML = i;
		tr.appendChild(td);
		if((month+1) > 12)
			calCallbackDayCell(td, i, 1, year+1);
		else
			calCallbackDayCell(td, i, month+1, year);

		if(i + lastwday >= 6) {
			//tbl.appendChild(tr);
			nrOfRows++;
		}
	}

	while(nrOfRows < 6) {
		var startDay = i;
		var tr = document.createElement("tr");	//start new row
		tbl.appendChild(tr);
		tr.className = "cWeekRow";
		for(var i = 0; i < 7; i++) {
			var td = document.createElement("td");
			td.setAttribute("width", "14%");
			if(i < 1 || i > 5)
				td.className = "cUnimportant cWeekend";
			else
				td.className = "cUnimportant";
			td.innerHTML = startDay;
			tr.appendChild(td);
			if((month+1) > 12)
				calCallbackDayCell(td, startDay, 1, year+1);
			else
				calCallbackDayCell(td, startDay, month+1, year);

			startDay++;
		}
		nrOfRows++;
	}

	if(browseable)
		tbl.appendChild(calCreateNavTr(divId));//,preDiv,postDiv));

	return table;
}

function calCreateNavTr(divId) {//,preDiv,postDiv) {
	var divObj = document.getElementById(divId);
	if(!divObj) {
		alert("calCreateNavTr: Ungültige divId\n"+divId);
		return false;
	}

	var preDiv = divObj.preDiv;
	var postDiv = divObj.postDiv;

	var tr = document.createElement("tr");
	tr.className = "cNavigationRow";
	var td = document.createElement("td");
	td.colSpan = 7;

		var caption = "|<";
		if(divObj.navigationType == "short")
			caption += " '" + (divObj.year-1).toString().slice(2,4);
		else if(divObj.navigationType == "long")
			caption += " " + (divObj.year-1).toString();
		else if(divObj.navigationType == "symbols")
			caption = "|<";
	var btn = document.createElement("input");
	btn.setAttribute("type", "button");
	btn.setAttribute("value", caption);
	btn.onclick = function(){
					calUpdateCalendar(divId, 0, -1);
					if(preDiv)
						calUpdateCalendar(preDiv, 0, -1, "pre");
					if(postDiv)
						calUpdateCalendar(postDiv, 0, -1, "post");
				};
	td.appendChild(btn);
		var caption = "<";
		if(divObj.navigationType == "short")
			caption += " " + calGetNameOfMonth(divObj.month-1).slice(0,3);
		else if(divObj.navigationType == "long")
			caption += " " + calGetNameOfMonth(divObj.month-1);
		else if(divObj.navigationType == "symbols")
			caption = "<";
	var btn = document.createElement("input");
	btn.setAttribute("type", "button");
	btn.setAttribute("value", caption);
	btn.onclick = function(){
					calUpdateCalendar(divId, -1, 0);
					if(preDiv)
						calUpdateCalendar(preDiv, -1, 0, "pre");
					if(postDiv)
						calUpdateCalendar(postDiv, -1, 0, "post");
				};
	td.appendChild(btn);
		var caption = ">";
		if(divObj.navigationType == "short")
			caption = calGetNameOfMonth(divObj.month+1).slice(0,3) + " >";
		else if(divObj.navigationType == "long")
			caption = calGetNameOfMonth(divObj.month+1) + " >";
		else if(divObj.navigationType == "symbols")
			caption = ">";
	var btn = document.createElement("input");
	btn.setAttribute("type", "button");
	btn.setAttribute("value", caption);
	btn.onclick = function(){
					calUpdateCalendar(divId, +1, 0);
					if(preDiv)
						calUpdateCalendar(preDiv, +1, 0, "pre");
					if(postDiv)
						calUpdateCalendar(postDiv, +1, 0, "post");
				};
	td.appendChild(btn);
		var caption = ">|";
		if(divObj.navigationType == "short")
			caption = "'"+(divObj.year+1).toString().slice(2,4) + " >|";
		else if(divObj.navigationType == "long")
			caption = (divObj.year+1).toString() + " >|";
		else if(divObj.navigationType == "symbols")
			caption = ">|";
	var btn = document.createElement("input");
	btn.setAttribute("type", "button");
	btn.setAttribute("value", caption);
	btn.onclick = function(){
					calUpdateCalendar(divId, 0, +1);
					if(preDiv)
						calUpdateCalendar(preDiv, 0, +1, "pre");
					if(postDiv)
						calUpdateCalendar(postDiv, 0, +1, "post");
				};
	td.appendChild(btn);
	tr.appendChild(td);

	return tr;
}

function calCallbackDayCell(td, day, month, year) {
	var calTbl = td.parentNode.parentNode.parentNode; //table
	//var divContainer = calTbl.parentNode;
	//alert(divContainer);
	if(typeof(calTbl.count) == "undefined")
		calTbl.count = 0;
	if((typeof(calTbl.cCells) != "object") || !calTbl.cCells.length)
		calTbl.cCells = new Array();

	var cell = new Object();
	cell.obj = td;
	cell.day = day;
	cell.month = month;
	cell.year = year;

	calTbl.cCells.push(cell);

	calTbl.count++;
	if(calTbl.count >= 42)
		calTbl.cellsDone = true;

	if(calTbl.dbDone && calTbl.cellsDone)
		calFillCalWithSchedule(calTbl);
}

