/***
 * Creates new calendar
 * Needs functions.js and requests.js
 */
function calendar(boxWidth, boxHeight, boxTop, boxLeft) {

	this.divbox	= GetLayer('boxCalendar');
	if(this.divbox == null) {
		var divBox = document.createElement('DIV');
	    divBox.id = 'boxCalendar';
	    divBox.name = 'boxCalendar';
	    divBox.setAttribute('id', 'boxCalendar');
	    divBox.setAttribute('name', 'boxCalendar');
	
		var body = document.getElementsByTagName("body")[0];
		body.appendChild(divBox);
	}
		
	// Set box
	this.divbox	= GetLayer('boxCalendar');
	if(this.divbox == null) {
		alert('Box "Date" not found!');
		return;
	}

	if(isEmpty(boxWidth)) {
		boxWidth = '300';
	}
	if(isEmpty(boxHeight)) {
		boxHeight = '';
	}
	if(isEmpty(boxTop)) {
		boxTop = 0;
	}
	if(isEmpty(boxLeft)) {
		boxLeft = 0;
	}

	this.id		= 'boxCalendar';

	this.root			= '';
	this.session		= '';

	this.width			= boxWidth;
	this.height			= boxHeight;
	this.currentHeight	= boxHeight;
	this.top			= boxTop;
	this.left			= boxLeft;

	this.year			= 1900;
	this.month			= 1;
	this.day			= 1;
	this.hour			= 00;
	this.minutes		= 00;

	this.inputYear		= 1900;
	this.inputMonth		= 1;
	this.inputDay		= 1;
	this.inputHour		= 00;
	this.inputMinutes	= 00;

	this.countDropdownEntries = 6;

	this.closed 	= true;
	this.withTime	= true;
	this.dropDownInProgress		= false;
	this.callbackTargetField	= '';

	// Set Locale
	this.arrDaysInMonth	= [31,28,31,30,31,30,31,31,30,31,30,31];

	var parent	= this;
	this.parent = parent;
}

// Set style
calendar.prototype.setCalendarStyles= function (styles) {
	var parent = this.parent;
	
	styles = styles.replace(/: /g, ":");

	var arrStyles = styles.split(";");
	for(var s=0;s<arrStyles.length;s++) {
		var style = arrStyles[s];
		var arrStyle = style.split(":");
		if(arrStyle[0] && arrStyle[1] && arrStyle[0] != '' && arrStyle[1] != '') {
			arrStyle[0] = arrStyle[0].replace(/-q/g, "Q");
			arrStyle[0] = arrStyle[0].replace(/-w/g, "W");
			arrStyle[0] = arrStyle[0].replace(/-e/g, "E");
			arrStyle[0] = arrStyle[0].replace(/-r/g, "R");
			arrStyle[0] = arrStyle[0].replace(/-t/g, "T");
			arrStyle[0] = arrStyle[0].replace(/-z/g, "Z");
			arrStyle[0] = arrStyle[0].replace(/-u/g, "U");
			arrStyle[0] = arrStyle[0].replace(/-i/g, "I");
			arrStyle[0] = arrStyle[0].replace(/-o/g, "O");
			arrStyle[0] = arrStyle[0].replace(/-p/g, "P");
			arrStyle[0] = arrStyle[0].replace(/-a/g, "A");
			arrStyle[0] = arrStyle[0].replace(/-s/g, "S");
			arrStyle[0] = arrStyle[0].replace(/-d/g, "D");
			arrStyle[0] = arrStyle[0].replace(/-f/g, "F");
			arrStyle[0] = arrStyle[0].replace(/-g/g, "G");
			arrStyle[0] = arrStyle[0].replace(/-h/g, "H");
			arrStyle[0] = arrStyle[0].replace(/-j/g, "J");
			arrStyle[0] = arrStyle[0].replace(/-k/g, "K");
			arrStyle[0] = arrStyle[0].replace(/-l/g, "L");
			arrStyle[0] = arrStyle[0].replace(/-y/g, "Y");
			arrStyle[0] = arrStyle[0].replace(/-x/g, "X");
			arrStyle[0] = arrStyle[0].replace(/-c/g, "C");
			arrStyle[0] = arrStyle[0].replace(/-v/g, "V");
			arrStyle[0] = arrStyle[0].replace(/-b/g, "B");
			arrStyle[0] = arrStyle[0].replace(/-n/g, "N");
			arrStyle[0] = arrStyle[0].replace(/-m/g, "M");
			SetStyle(parent.divbox, arrStyle[0], arrStyle[1]);
		}
	}
}

// Set root
calendar.prototype.setRoot = function (strRoot) {
	if(typeof strRoot == 'string') {
		this.root = strRoot;
	}
};

// Returns root
calendar.prototype.getRoot = function () {
	return this.root;
};

// Set session
calendar.prototype.setSession = function (strSession) {
	if(typeof strSession == 'string') {
		this.session= strSession;
	}
};

// Returns session
calendar.prototype.getSession = function () {
	return this.session;
};

// Close box
calendar.prototype.isClosed= function () {
	var parent = this.parent;
	
	return parent.closed;
};

// Close box
calendar.prototype.closeCalendar= function () {
	var parent = this.parent;
	
	SwitchLayer(parent.divbox, 0);
	parent.closed = true;

	SetContent(parent.divbox, '');

	SwitchLayer(GetObject('CalendarDropDownyear'), 0);
	SwitchLayer(GetObject('CalendarDropDownmonth'), 0);
	SwitchLayer(GetObject('CalendarDropDownhour'), 0);
	SwitchLayer(GetObject('CalendarDropDownminutes'), 0);

//	showSelect();

	if(BoxManager) BoxManager.setBox(parent);
};

calendar.prototype.switchCalendar = function (positionObject, targetField, withTime) {
	var parent = this.parent;

	if(parent.callbackTargetField != targetField) {
		parent.closeCalendar();
	}

	if(parent.closed) {
		parent.showCalendar(positionObject, targetField, withTime);
	} else {
		parent.closeCalendar();
	}
};

calendar.prototype.showCalendar = function (positionObject, targetField, withTime) {
	var parent = this.parent;

	parent.withTime = withTime;
	parent.callbackTargetField = targetField;
	
	parent._initalizeCalendar();
	
	var left = parseInt(parent.left);
	var top = parseInt(parent.top);

	if(positionObject) {
		left = left + parseInt(GetX(positionObject));
		top = top + parseInt(GetY(positionObject));

		if(parent.withTime) {
			left -= 95;
		}
	}

	SetStyle(parent.divbox, 'position', 'absolute');
	SetStyle(parent.divbox, 'left', left + 'px');
	SetStyle(parent.divbox, 'top', top + 'px');

	if(parent.width != '')
		SetStyle(parent.divbox, 'width', parseInt(parent.width) + 'px');
	if(parent.height != '')
		SetStyle(parent.divbox, 'height', parseInt(parent.height) + 'px');

	SwitchLayer(parent.divbox, 1);
	parent.closed = false;

//	hideSelect();
//	showSelect(parent.divbox);
	
	if(BoxManager) BoxManager.setBox(parent);
};

calendar.prototype.clearCalendar = function (targetField) {
	var parent = this.parent;

	parent.callbackTargetField = targetField;

	parent._clearTargetFields();
};

calendar.prototype.setYear = function (year) {
	var parent = this.parent;
	
	var date = new Date();

	year = String(year);
	
	while(parseInt(year.substring(0, 1)) < 1) {
		year = year.substring(1);
	}
	
	year = parseInt(year.substring(0, 4));
	if(year == 0) {
		parent.year = date.getFullYear();
	} else {
		parent.year = parseInt(year);
	}

	var txtYear = GetObject('txtCalendaryear');
	if(txtYear) {
		var strYear = String(parent.year);
		while(strYear.length < 4) { strYear = '0' + strYear; }
		txtYear.innerHTML = strYear;

		parent._writeCalendarContent();
	}
};

calendar.prototype.setMonth = function (month) {
	var parent = this.parent;
	
	var date = new Date();

	month = String(month);
	
	while(parseInt(month.substring(0, 1)) < 1) {
		month = month.substring(1);
	}
	
	month = parseInt(month.substring(0, 2));
	if(month == 0 || month > 12) {
		parent.month = date.getMonth()+1;
	} else {
		parent.month = parseInt(month);
	}

	var txtMonth = GetObject('txtCalendarmonth');
	if(txtMonth) {
		txtMonth.innerHTML = localeMonths[parent.month-1];

		parent._writeCalendarContent();
	}
};

calendar.prototype.setToday = function () {
	var parent = this.parent;
	
	var date = new Date();
	parent.setYear(date.getFullYear());
	parent.setMonth(date.getMonth()+1);
	parent.setDay(date.getDate());

	parent._writeCalendarContent();
};

calendar.prototype.setDay = function (day) {
	var parent = this.parent;
	
	var date = new Date();

	day = String(day);
	
	while(parseInt(day.substring(0, 1)) < 1) {
		day = day.substring(1);
	}
	
	day = parseInt(day.substring(0, 2));
	if(day == 0 || day > parent.arrDaysInMonth[parent.month-1]) {
		parent.day = date.getDate();
	} else {
		parent.day = parseInt(day);
	}
};

calendar.prototype.setHour = function (hour) {
	var parent = this.parent;
	
	var date = new Date();

	hour = String(hour);
	
	while(parseInt(hour.substring(0, 1)) < 1) {
		hour = hour.substring(1);
	}
	
	hour = parseInt(hour.substring(0, 2));
	if(hour == 0 || hour > 23) {
		parent.hour = parseInt(date.getHours());
	} else {
		parent.hour = parseInt(hour);
	}

	var txtHour = GetObject('txtCalendarhour');
	if(txtHour) {
		var strHour = String(parent.hour);
		while(strHour.length < 2) { strHour = '0' + strHour; }
		txtHour.innerHTML = strHour;
	}
};

calendar.prototype.setMinutes = function (minutes) {
	var parent = this.parent;
	
	var date = new Date();

	minutes = String(minutes);
	
	while(parseInt(minutes.substring(0, 1)) < 1) {
		minutes = minutes.substring(1);
	}
	
	minutes = parseInt(minutes.substring(0, 2));
	if(minutes == 0 || minutes > 59) {
		parent.minutes = parseInt(date.getMinutes());
	} else {
		parent.minutes = parseInt(minutes);
	}

	var txtMinutes = GetObject('txtCalendarminutes');
	if(txtMinutes) {
		var strMinutes = String(parent.minutes);
		while(strMinutes.length < 2) { strMinutes = '0' + strMinutes; }
		txtMinutes.innerHTML = strMinutes;
	}
};

calendar.prototype._getTargetFields = function () {
	var parent = this.parent;
	
	var fldYear = GetObject('fld' + parent.callbackTargetField + 'Year');
	var fldMonth = GetObject('fld' + parent.callbackTargetField + 'Month');
	var fldDay = GetObject('fld' + parent.callbackTargetField + 'Day');
	var fldHour = GetObject('fld' + parent.callbackTargetField + 'Hour');
	var fldMinute = GetObject('fld' + parent.callbackTargetField + 'Minutes');

	var date = new Date();

	if(fldYear && fldYear.value) {
		parent.setYear(fldYear.value);
	} else {
		parent.setYear(date.getFullYear());
	}

	if(fldMonth && fldMonth.value) {
		parent.setMonth(fldMonth.value);
	} else {
		parent.setMonth(date.getMonth()+1);
	}

	if(fldDay && fldDay.value) {
		parent.setDay(fldDay.value);
	} else {
		parent.setDay(date.getDate());
	}

	if(fldHour && fldHour.value) {
		parent.setHour(fldHour.value);
	} else {
		parent.setHour(date.getHours());
	}

	if(fldMinute && fldMinute.value) {
		parent.setMinutes(fldMinute.value);
	} else {
		parent.setMinutes(date.getMinutes());
	}

	parent.inputYear	= parent.year;
	parent.inputMonth	= parent.month;
	parent.inputDay		= parent.day;
	parent.inputHour	= parent.hour;
	parent.inputMinutes	= parent.minutes;
};

calendar.prototype._setTargetFields = function () {
	var parent = this.parent;

	var strYear		= String(parent.year);
	var strMonth	= String(parent.month);
	var strDay		= String(parent.day);
	var strHour		= String(parent.hour);
	var strMinutes	= String(parent.minutes);
	
	while(strYear.length < 4) { strYear = '0' + strYear; }
	while(strMonth.length < 2) { strMonth = '0' + strMonth; }
	while(strDay.length < 2) { strDay = '0' + strDay; }
	while(strHour.length < 2) { strHour = '0' + strHour; }
	while(strMinutes.length < 2) { strMinutes = '0' + strMinutes; }

	var fldYear = GetObject('fld' + parent.callbackTargetField + 'Year');
	var fldMonth = GetObject('fld' + parent.callbackTargetField + 'Month');
	var fldDay = GetObject('fld' + parent.callbackTargetField + 'Day');
	var fldHour = GetObject('fld' + parent.callbackTargetField + 'Hour');
	var fldMinute = GetObject('fld' + parent.callbackTargetField + 'Minutes');

	if(fldYear) { fldYear.value = strYear; }
	if(fldMonth) { fldMonth.value = strMonth; }
	if(fldDay) { fldDay.value = strDay; }
	if(fldHour) { fldHour.value = strHour; }
	if(fldMinute) { fldMinute.value = strMinutes; }
};

calendar.prototype._clearTargetFields = function () {
	var parent = this.parent;
	
	var fldYear = GetObject('fld' + parent.callbackTargetField + 'Year');
	var fldMonth = GetObject('fld' + parent.callbackTargetField + 'Month');
	var fldDay = GetObject('fld' + parent.callbackTargetField + 'Day');
	var fldHour = GetObject('fld' + parent.callbackTargetField + 'Hour');
	var fldMinute = GetObject('fld' + parent.callbackTargetField + 'Minutes');

	if(fldYear) fldYear.value = '';
	if(fldMonth) fldMonth.value = '';
	if(fldDay) fldDay.value = '';
	if(fldHour) fldHour.value = '';
	if(fldMinute) fldMinute.value = '';
	
	parent._getTargetFields();
};

calendar.prototype.nextYear = function () {
	var parent = this.parent;
	
	parent.year = parent.year + 1;;
	
	parent._writeCalendarContent();
};

calendar.prototype.nextMonth = function () {
	var parent = this.parent;
	
	parent.month = parent.month + 1;;
	if(parent.month > 12){
		parent.month = 1;
		parent.year = parent.year + 1;
	}
	
	parent._writeCalendarContent();
};

calendar.prototype.lastYear = function () {
	var parent = this.parent;
	
	parent.year = parent.year - 1;;
	
	parent._writeCalendarContent();
};

calendar.prototype.lastMonth = function () {
	var parent = this.parent;
	
	parent.month = parent.month - 1;;
	if(parent.month < 1){
		parent.month = 12;
		parent.year = parent.year - 1;
	}

	parent._writeCalendarContent();
};

calendar.prototype._pickDate = function (selectedDay) {
	Calendar.setDay(selectedDay.innerHTML);
	
	Calendar._setTargetFields();

	Calendar.closeCalendar();
};

calendar.prototype._initalizeCalendar = function () {
	var parent = this.parent;

	parent._getTargetFields();

	// Create drop downs
	parent._createDropdown('year');
	parent._createDropdown('month');
	if(parent.withTime) {
		parent._createDropdown('hour');
		parent._createDropdown('minutes');
	}

	parent._writeBarTop1();
	parent._writeBarTop2();
	parent._writeBarContent();

	if(parent.withTime) {
		parent._writeBarBottom();
	}

	parent._writeCalendarContent();
};

calendar.prototype._writeBarTop1 = function () {
	var parent = this.parent;

	var topBar			= document.createElement('DIV');
	topBar.id			= 'CalendarBarTop1';
	topBar.className	= 'BarTop';
	topBar.parent		= parent;
	parent.divbox.appendChild(topBar);
	
	// Close button
	var imgClose			= document.createElement('IMG');
	imgClose.name			= 'imgCalendarClose';
	imgClose.src			= parent.getRoot() + 'layout/images/close.gif';
	imgClose.align			= 'right';
	imgClose.vspace			= '2';
	imgClose.hspace			= '2';
	imgClose.onclick		= function() { parent.closeCalendar(); };
	imgClose.onmouseover	= function() { switchCursor(this, '1'); };
	imgClose.onmouseout		= function() { switchCursor(this, '0'); };
	topBar.appendChild(imgClose);

	var monthSpan			= document.createElement('SPAN');
	monthSpan.id			= 'txtCalendarmonth';
	monthSpan.innerHTML 	= localeMonths[parseInt(parent.month)-1];
	monthSpan.className 	= 'Selector';
	monthSpan.onclick		= function() { parent._switchDropdown('month'); };
	monthSpan.onmouseover	= function() { switchClass(this, 'Aktiv'); switchCursor(this, '1'); };
	monthSpan.onmouseout	= function() { switchClass(this, 'Aktiv'); switchCursor(this, '0'); };
	topBar.appendChild(monthSpan);

	var commaSpan			= document.createElement('SPAN');
	commaSpan.innerHTML 	= ',';
	commaSpan.className	 	= 'Selector';
	topBar.appendChild(commaSpan);
	
	var yearSpan			= document.createElement('SPAN');
	yearSpan.id				= 'txtCalendaryear';
	yearSpan.innerHTML 		= parent.year;
	yearSpan.className	 	= 'Selector';
	yearSpan.onclick		= function() { parent._switchDropdown('year'); };
	yearSpan.onmouseover	= function() { switchClass(this, 'Aktiv'); switchCursor(this, '1'); };
	yearSpan.onmouseout		= function() { switchClass(this, 'Aktiv'); switchCursor(this, '0'); };
	topBar.appendChild(yearSpan);

	parent.currentHeight += GetHeight(topBar);
};

calendar.prototype._writeBarTop2 = function () {
	var parent = this.parent;

	var topBar			= document.createElement('DIV');
	topBar.id			= 'CalendarBarTop2';
	topBar.className	= 'BarTop';
	parent.divbox.appendChild(topBar);

	// Year back button
	var yearBackImg			= document.createElement('IMG');
	yearBackImg.src			= parent.getRoot() + 'layout/images/arrows/left_double.gif';
	yearBackImg.align		= 'left';
	yearBackImg.height		= '15';
	yearBackImg.className 	= 'SelectorImage';
	yearBackImg.onclick		= function() { parent.lastYear(); };
	yearBackImg.onmouseover	= function() { switchClass(this, 'Aktiv'); switchCursor(this, '1'); };
	yearBackImg.onmouseout	= function() { switchClass(this, 'Aktiv'); switchCursor(this, '0'); };
	topBar.appendChild(yearBackImg);

	// Month back button
	var monthBackImg			= document.createElement('IMG');
	monthBackImg.src			= parent.getRoot() + 'layout/images/arrows/left.gif';
	monthBackImg.align			= 'left';
	monthBackImg.height			= '15';
	monthBackImg.className 		= 'SelectorImage';
	monthBackImg.onclick		= function() { parent.lastMonth(); };
	monthBackImg.onmouseover	= function() { switchClass(this, 'Aktiv'); switchCursor(this, '1'); };
	monthBackImg.onmouseout		= function() { switchClass(this, 'Aktiv'); switchCursor(this, '0'); };
	topBar.appendChild(monthBackImg);

	// Year next button
	var yearNextImg			= document.createElement('IMG');
	yearNextImg.src			= parent.getRoot() + 'layout/images/arrows/right_double.gif';
	yearNextImg.align		= 'right';
	yearNextImg.height		= '15';
	yearNextImg.className 	= 'SelectorImage';
	yearNextImg.onclick		= function() { parent.nextYear(); };
	yearNextImg.onmouseover	= function() { switchClass(this, 'Aktiv'); switchCursor(this, '1'); };
	yearNextImg.onmouseout	= function() { switchClass(this, 'Aktiv'); switchCursor(this, '0'); };
	topBar.appendChild(yearNextImg);

	// Month next button
	var monthNextImg			= document.createElement('IMG');
	monthNextImg.src			= parent.getRoot() + 'layout/images/arrows/right.gif';
	monthNextImg.align			= 'right';
	monthNextImg.height			= '15';
	monthNextImg.className 		= 'SelectorImage';
	monthNextImg.onclick		= function() { parent.nextMonth(); };
	monthNextImg.onmouseover	= function() { switchClass(this, 'Aktiv'); switchCursor(this, '1'); };
	monthNextImg.onmouseout		= function() { switchClass(this, 'Aktiv'); switchCursor(this, '0'); };
	topBar.appendChild(monthNextImg);

	// Today text
	var todaySpan			= document.createElement('SPAN');
	todaySpan.innerHTML 	= localeToday;
	todaySpan.className 	= 'Selector';
	todaySpan.onclick		= function() { parent.setToday(); };
	todaySpan.onmouseover	= function() { switchClass(this, 'Aktiv'); switchCursor(this, '1'); };
	todaySpan.onmouseout	= function() { switchClass(this, 'Aktiv'); switchCursor(this, '0'); };
	topBar.appendChild(todaySpan);

	parent.currentHeight += GetHeight(topBar);
};

calendar.prototype._writeBarBottom = function () {
	var parent = this.parent;

	var strHour = parent.hour;
	var strMinutes = parent.minutes;
	
	while(strHour.length < 2) { strHour = '0' + strHour; }
	while(strMinutes.length < 2) { strMinutes = '0' + strMinutes; }

	var bottomBar		= document.createElement('DIV');
	bottomBar.id		= 'CalendarBarBottom';
	bottomBar.className	= 'BarBottom';
	parent.divbox.appendChild(bottomBar);

	// Time text
	var timeSpan			= document.createElement('SPAN');
	timeSpan.innerHTML 		= localeTime + ':&nbsp;';
	timeSpan.className 		= 'Selector';
	bottomBar.appendChild(timeSpan);

	// Hour selection
	var hourSpan			= document.createElement('SPAN');
	hourSpan.id		 		= 'txtCalendarhour';
	hourSpan.innerHTML 		= strHour;
	hourSpan.className 		= 'Selector';
	hourSpan.onclick		= function() { parent._switchDropdown('hour'); };
	hourSpan.onmouseover	= function() { switchClass(this, 'Aktiv'); switchCursor(this, '1'); };
	hourSpan.onmouseout		= function() { switchClass(this, 'Aktiv'); switchCursor(this, '0'); };
	bottomBar.appendChild(hourSpan);

	// Time text
	var separatorSpan			= document.createElement('SPAN');
	separatorSpan.innerHTML 	= ':';
	separatorSpan.className 	= 'Selector';
	separatorSpan.style.padding	= '0px';
	bottomBar.appendChild(separatorSpan);
	
	// Hour selection
	var minutesSpan			= document.createElement('SPAN');
	minutesSpan.id		 	= 'txtCalendarminutes';
	minutesSpan.innerHTML 	= strMinutes;
	minutesSpan.className 	= 'Selector';
	minutesSpan.onclick		= function() { parent._switchDropdown('minutes'); };
	minutesSpan.onmouseover	= function() { switchClass(this, 'Aktiv'); switchCursor(this, '1'); };
	minutesSpan.onmouseout	= function() { switchClass(this, 'Aktiv'); switchCursor(this, '0'); };
	bottomBar.appendChild(minutesSpan);

	parent.currentHeight += GetHeight(bottomBar);
};

calendar.prototype._writeBarContent = function () {
	var parent = this.parent;

	var contentBar			= document.createElement('DIV');
	contentBar.id			= 'CalendarBarContent';
	contentBar.className	= 'BarContent';
	parent.divbox.appendChild(contentBar);
};

calendar.prototype._writeCalendarContent = function () {
	var parent = this.parent;
	
	var BarContent = GetObject('CalendarBarContent');
	if(!BarContent) { return; }

	parent.currentHeight = 0;

	var date = new Date();
	date.setFullYear(parent.year);
	date.setMonth(parent.month-1);
	date.setDate(1);

	var dayStartOfMonth = date.getDay();
	if(dayStartOfMonth == 0) {
		dayStartOfMonth = 7;
	}
	dayStartOfMonth--;
	
	var txtYear		= GetObject('txtCalendaryear');
	var txtMonth	= GetObject('txtCalendarmonth');
	var txtHour		= GetObject('txtCalendarhour');
	var txtMinutes	= GetObject('txtCalendarminutes');
	
	var strYear = String(parent.year);
	var strHour = String(parent.hour);
	var strMinutes = String(parent.minutes);
	
	if(isNaN(strYear)) { strYear = '1900'; }
	if(isNaN(strHour)) { strHour = '00'; }
	if(isNaN(strMinutes)) { strMinutes = '00'; }
	
	while(strYear.length < 4) { strYear = '0' + strYear; }
	while(strHour.length < 2) { strHour = '0' + strHour; }
	while(strMinutes.length < 2) { strMinutes = '0' + strMinutes; }
	
	txtYear.innerHTML	= strYear;
	txtMonth.innerHTML	= localeMonths[parent.month-1];
	if(txtHour) { txtHour.innerHTML = strHour; }
	if(txtMinutes) { txtMinutes.innerHTML = strMinutes; }

	var ContentTables = BarContent.getElementsByTagName('TABLE');
	if(ContentTables.length > 0) {
		BarContent.removeChild(ContentTables[0]);
	}

	var calendarTable			= document.createElement('TABLE');
	calendarTable.width			= '100%';
	calendarTable.border		= '0';
	calendarTable.cellSpacing	= '0';
	calendarTable.cellPadding	= '0';
	BarContent.appendChild(calendarTable);

	var calendarTBody	= document.createElement('TBODY');
	calendarTable.appendChild(calendarTBody);

	var row			= calendarTBody.insertRow(-1);
	var cell		= row.insertCell(-1);
	cell.innerHTML	= localeWeek;
	cell.className	= 'WeekHeader';
	cell.width		= '1%';

	parent.currentHeight += GetHeight(cell);

	for(var no=0;no < localeDaysShort.length;no++){
		var cell = row.insertCell(-1);
		cell.className	= 'DayHeader';
		cell.innerHTML = localeDaysShort[no];
	}

	var row			= calendarTBody.insertRow(-1);
	var cell		= row.insertCell(-1);
	cell.className	= 'Week';
	cell.innerHTML	= parent._getWeek(parent.year, parent.month, 1);		// Week

	parent.currentHeight += GetHeight(cell);

	for(var i=0;i < dayStartOfMonth;i++) {
		var cell = row.insertCell(-1);
		cell.className	= 'day';
		cell.innerHTML	= '&nbsp;';
	}

	var columnCounter	= dayStartOfMonth;
	var daysInMonth		= parent.arrDaysInMonth[parent.month-1];
	if(daysInMonth == 28) {
		if(parent._isLeapYear(parent.year)) daysInMonth = 29;
	}

	var date = new Date();
	for(var day=1;day <= daysInMonth;day++){
		parent.setDay(day);
		
		if(columnCounter > 0 && columnCounter%7 == 0) {
			var row			= calendarTBody.insertRow(-1);
	        var cell		= row.insertCell(-1);
            cell.className	= 'Week';
            cell.innerHTML	= parent._getWeek(parent.year, parent.month, day);

			parent.currentHeight += GetHeight(cell);
    	}

		var cell	= row.insertCell(-1);
		if(parent.year == date.getFullYear() &&
			parent.month == (date.getMonth()+1) &&
			parent.day == date.getDate()) {
			
			cell.className='Today';
		} else {
			cell.className='Day';
		}

		cell.innerHTML		= parent.day;
		cell.onclick		= function() { parent._pickDate(this); };
		cell.onmouseover	= function() { switchClass(this, 'Aktiv'); switchCursor(this, '1'); };
		cell.onmouseout		= function() { switchClass(this, 'Aktiv'); switchCursor(this, '0'); };
		columnCounter++;
	}

	var BarTop1		= GetObject('CalendarBarTop1');
	var BarTop2		= GetObject('CalendarBarTop2');
	var BarBottom	= GetObject('CalendarBarBottom');
	
	parent.currentHeight += GetHeight(BarTop1);
	parent.currentHeight += GetHeight(BarTop2);
	if(BarBottom) { parent.currentHeight += GetHeight(BarBottom); }
	if(!IE) {
		if(parent.currentHeight > 0) {
			parent.currentHeight += 3;
		} else {
			parent.currentHeight = 200;
		}
	} else {
		if(parent.currentHeight > 0) {
			parent.currentHeight += 3;
		}
	}

	SetStyle(parent.divbox, 'height', parseInt(parent.currentHeight) + 'px');
};

calendar.prototype._createButtonTop = function (type) {
	var parent = this.parent;

	type = type.toLowerCase();

	// Top button
	var topImg				= document.createElement('IMG');
	topImg.src				= parent.getRoot() + 'layout/images/arrows/top.gif';
	topImg.height			= '15';
	topImg.vspace			= '2';
	topImg.className 		= 'SelectorImage';
	topImg.onclick 			= function() { parent._changeDropdown(type, 'down'); };
	topImg.onmouseover		= function() { switchClass(this, 'Aktiv'); switchCursor(this, '1'); };
	topImg.onmouseout		= function() { switchClass(this, 'Aktiv'); switchCursor(this, '0'); };
	topImg.onselectstart	= function() { return false; };
	
	return topImg;
};

calendar.prototype._createButtonBottom = function (type) {
	var parent = this.parent;

	type = type.toLowerCase();

	// Bottom button
	var bottomImg			= document.createElement('IMG');
	bottomImg.src			= parent.getRoot() + 'layout/images/arrows/bottom.gif';
	bottomImg.height		= '15';
	bottomImg.vspace		= '2';
	bottomImg.className 	= 'SelectorImage';
	bottomImg.onclick 		= function() { parent._changeDropdown(type, 'up'); };
	bottomImg.onmouseover	= function() { switchClass(this, 'Aktiv'); switchCursor(this, '1'); };
	bottomImg.onmouseout	= function() { switchClass(this, 'Aktiv'); switchCursor(this, '0'); };
	bottomImg.onselectstart	= function() { return false; };
	
	return bottomImg;
};

calendar.prototype._createDropdown = function (type) {
	var parent = this.parent;

	type = type.toLowerCase();

	var DropDown = GetObject('CalendarDropDown' + type);
	if(!DropDown) {
		var DropDown 		= document.createElement('DIV');
		DropDown.id			= 'CalendarDropDown' + type;
		DropDown.className	= 'CalendarDropDown';
	} else {
		DropDown.innerHTML = '';
	}
	SwitchLayer(DropDown, 0);

	var start = '';
	var end = '';
	var current = '';
	var steps = 1;
	if(type == 'year') {
		start = parent.year-parent.countDropdownEntries/2;
		
		current	= parent.year;
		end		= start+parent.countDropdownEntries;
	} else if(type == 'month') {
		if(parent.month > 6) {
			start = 6;
		} else {
			start = 1;
		}

		current	= parent.month;
		end		= start+parent.countDropdownEntries;
	} else if(type == 'hour') {
		if(parent.hour > 14) {
			start = 14;
		} else {
			start = parent.hour;
		}

		current	= parent.hour;
		end		= start+parent.countDropdownEntries;
	} else if(type == 'minutes') {
		start = 0;
		steps = 5;
		
		current	= 0;
		end		= parent.countDropdownEntries*5;
	}
	
	// Top button
	DropDown.appendChild(parent._createButtonTop(type));

	for(var i=start;i < end;i+=steps) {
		var currentElement = i*steps;
		var strCurrentElement = String(currentElement);
		
		while(strCurrentElement.length < 2) { strCurrentElement = '0' + strCurrentElement; }
		
		var subDiv 				= document.createElement('DIV');
		
		if(type == 'year') {
			subDiv.innerHTML		= strCurrentElement;
			subDiv.onclick			= function() { parent.setYear(this.getAttribute(type)); parent._switchDropdown(type); };
		} else if(type == 'month') {
			subDiv.innerHTML		= localeMonths[currentElement-1];
			subDiv.setAttribute(type, currentElement);
			subDiv.style.textAlign	= 'left';
			subDiv.onclick			= function() { parent.setMonth(this.getAttribute(type)); parent._switchDropdown(type); };
		} else if(type == 'hour') {
			subDiv.innerHTML 		= strCurrentElement;
			subDiv.onclick			= function() { parent.setHour(this.getAttribute(type)); parent._switchDropdown(type); };
		} else if(type == 'minutes') {
			subDiv.innerHTML 		= strCurrentElement;
			subDiv.onclick			= function() { parent.setMinutes(this.getAttribute(type)); parent._switchDropdown(type); };
		}
		
		subDiv.setAttribute(type, currentElement);
		subDiv.className 		= 'CalendarDropDownElement';
		subDiv.onmouseover		= function() { switchClass(this, 'Aktiv'); switchCursor(this, '1'); };
		subDiv.onmouseout		= function() { switchClass(this, 'Aktiv'); switchCursor(this, '0'); };
		subDiv.onselectstart	= function() { return false; };
		DropDown.appendChild(subDiv);

		if(current == i) {
			subDiv.className 	= 'CalendarDropDownElementSelected';
		}
	}
	
	// Down button
	DropDown.appendChild(parent._createButtonBottom(type));
	
	var body = document.getElementsByTagName("body")[0];
	body.appendChild(DropDown);
};

calendar.prototype._switchDropdown = function (type) {
	var parent = this.parent;

	type = type.toLowerCase();

	var DropDown = GetObject('CalendarDropDown' + type);
	if(!DropDown) { return; }

	if(GetStyle(DropDown, 'display') == 'block') {
		SwitchLayer(DropDown, 0);
	} else {
		var txt = GetObject('txtCalendar' + type);
		var top		= parseInt(GetStyle(parent.divbox, 'top')) + txt.offsetTop + 21;
		var left	= parseInt(GetStyle(parent.divbox, 'left')) + txt.offsetLeft;
		SetStyle(DropDown, 'top',  top + 'px');
		SetStyle(DropDown, 'left', left + 'px');
		SetStyle(DropDown, 'zIndex', '1500');
		SwitchLayer(DropDown, 1);

		parent._changeDropdown(type);
		
		if(type == 'year') {
			SwitchLayer(GetObject('CalendarDropDownmonth'), 0);
			if(parent.withTime) {
				SwitchLayer(GetObject('CalendarDropDownhour'), 0);
				SwitchLayer(GetObject('CalendarDropDownminutes'), 0);
			}
		} else if(type == 'month') {
			SwitchLayer(GetObject('CalendarDropDownyear'), 0);
			if(parent.withTime) {
				SwitchLayer(GetObject('CalendarDropDownhour'), 0);
				SwitchLayer(GetObject('CalendarDropDownminutes'), 0);
			}
		} else if(type == 'hour') {
			SwitchLayer(GetObject('CalendarDropDownyear'), 0);
			SwitchLayer(GetObject('CalendarDropDownmonth'), 0);
			SwitchLayer(GetObject('CalendarDropDownminutes'), 0);
		} else if(type == 'minutes') {
			SwitchLayer(GetObject('CalendarDropDownyear'), 0);
			SwitchLayer(GetObject('CalendarDropDownmonth'), 0);
			SwitchLayer(GetObject('CalendarDropDownhour'), 0);
		}		
	}
};

calendar.prototype._changeDropdown = function (type, movement) {
	var parent = this.parent;

	type = type.toLowerCase();

	var DropDown = GetObject('CalendarDropDown' + type);
	if(!DropDown) { return; }
	
	var divItems = DropDown.getElementsByTagName('DIV');
	var start = String(divItems[0].getAttribute(type));

	while(start.length > 1 && parseInt(start.substring(0, 1)) < 1) {
		start = String(start.substring(1));
	}

	start = parseInt(start);

	if(movement == 'down') {
		start--;
	} else if(movement == 'up') {
		start++;
	}

	var current = '';
	var steps = 1;
	if(type == 'year') {
		if(start < 0)
			start = 0;
	
		current	= parent.year;
	} else if(type == 'month') {
		if(start < 1)
			start = 1;
		else if(start > (13-parent.countDropdownEntries))
			start = 13-parent.countDropdownEntries;
	
		current	= parent.month;
	} else if(type == 'hour') {
		if(start < 0)
			start = 0;
		else if(start > (24-parent.countDropdownEntries))
			start = 24-parent.countDropdownEntries;
	
		current	= parent.hour;
	} else if(type == 'minutes') {
		if(movement == 'down') {
			start-=4;
		} else if(movement == 'up') {
			start+=4;
		}
	
		if(start < 0)
			start = 0;
		else if(start > (60-parent.countDropdownEntries*5))
			start = 60-parent.countDropdownEntries*5;
	
		steps = 5;
		current	= parent.minutes;
	}
		
	var prefix = '';
	for(var i=0;i < divItems.length;i++) {
		var currentElement = (start + i*steps);
		var strCurrentElement = String(currentElement);
		
		while(strCurrentElement.length < 2) { strCurrentElement = '0' + strCurrentElement; }
			
		if(type == 'month') {
			divItems[i].innerHTML = localeMonths[currentElement-1];
		} else {
			divItems[i].innerHTML = strCurrentElement;
		}
		divItems[i].setAttribute(type, currentElement);

		if(current == currentElement) {
			divItems[i].className 	= 'CalendarDropDownElementSelected';
		} else {
			divItems[i].className 	= 'CalendarDropDownElement';
		}
	}
};

calendar.prototype._getWeek = function (year, month, day) {
	var parent = this.parent;

	day		= (day/1);
	year	= (year/1);
    month	= (month/1); //use 1-12
    
    var a = Math.floor((14-(month))/12);
    var y = year+4800-a;
    var m = (month)+(12*a)-3;
    var jd = day + Math.floor(((153*m)+2)/5) + (365*y) + Math.floor(y/4) - Math.floor(y/100) + Math.floor(y/400) - 32045;      // (gregorian calendar)
    var d4 = (jd+31741-(jd%7))%146097%36524%1461;
    var L = Math.floor(d4/1460);
    var d1 = ((d4-L)%365)+L;

    return Math.floor(d1/7) + 1;
};

calendar.prototype._isLeapYear = function (year) {
	var parent = this.parent;

	if(year%400 == 0 ||(year%4 == 0 && year%100 != 0)) {
		return true;
	}
	
	return false;
};
