callendar = function(objName) {

	var d = new Date();

	this.objName = objName;
	/**
	* today
	*/
	this.month = d.getMonth();
	this.day = d.getDate();
	this.year = d.getFullYear();

	/**
	* specifies the day that the week starts
	* 0 = Sunday
	* 1 = Monday
	*/
	this.startDay = 0;

	this.showMonth = d.getMonth();
	this.showYear = d.getFullYear();

	this.daysOfMonth		= new Array( 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	this.daysOfMonthLE	= new Array( 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	this.monthNames			= new Array('Styczeń','Luty','Marzec','Kwiecień','Maj','Czerwiec','Lipiec','Sierpień','Wrzesien','Październik','Listopad','Grudzień');
	this.dayNames				= new Array('N','P','W','S','C','P','S');

	this.dayEvents = new Array();

	this.container;

	this.show = function(parent) {
		this.container = parent;

		var div = document.createElement('DIV');
		div.id = 'callendar';

		var dateDiv = document.createElement('DIV');
		dateDiv.className = 'month';
		dateDiv.innerHTML = this.monthNames[this.showMonth] + ' ' + this.showYear;


		var a = document.createElement('A');
		a.innerHTML = '&laquo;';
		a.className = 'back backYear';
		a.href = 'javascript:'+this.objName+'.changeYear(-1)';
		dateDiv.appendChild(a);
		var a = document.createElement('A');

		a.innerHTML = '&lsaquo;';
		a.className = 'back backMonth';
		a.href = 'javascript:'+this.objName+'.changeMonth(-1)';
		dateDiv.appendChild(a);

		var a = document.createElement('A');
		a.innerHTML = '&raquo;';
		a.className = 'forward forwardYear';
		a.href = 'javascript:'+this.objName+'.changeYear(+1)';
		dateDiv.appendChild(a);

		var a = document.createElement('A');
		a.innerHTML = '&rsaquo;';
		a.className = 'forward forwardMonth';
		a.href = 'javascript:'+this.objName+'.changeMonth(+1)';
		dateDiv.appendChild(a);

		div.appendChild(dateDiv);

		var days = this.getNumberOfDays(this.showMonth, this.showYear % 4);
		var d = new Date();
		
		
		d.setFullYear(this.showYear);
		d.setMonth(this.showMonth);
		d.setDate(1);              
		//alert(this.showMonth);
		var firstDay = d.getDay();
		
        var offset = 0;
		if(navigator.userAgent.indexOf('Opera') > -1) {offset = 0; }
		for(var i = this.startDay; i < 7 + this.startDay; i++) {
			var span = document.createElement('SPAN');
			span.className = 'day dayName';
			span.innerHTML = this.dayNames[i];
			div.appendChild(span);
		}
		var br = document.createElement('BR');
		br.style.clear = 'both';
		div.appendChild(br);

		for(var temp = 0 ; temp < firstDay ; temp++) {
			var span = document.createElement('SPAN');
			span.className = 'day empty';
			div.appendChild(span);
		}
		var spans = firstDay;
		for(var temp = 1 ; temp <= days ; temp++) {
			spans++;
			var span = document.createElement('SPAN');
			span.className = 'day';
			if(this.month == this.showMonth && this.year == this.showYear && this.day == temp) span.className += ' today';

			if(selected = this.isSelected(this.showMonth, this.showYear, temp-offset)) {
				span.className += ' ' + selected.setClassName;
				span.title = selected.callbackEvent;
				//span.onClick = 'alert(\'?\')';
				if(span.attachEvent) {
					span.attachEvent('onclick', redirectMe);
				}
				else {
					span.addEventListener('click',redirectMe,false);
				}

			}
			span.innerHTML = temp;
			div.appendChild(span);
			if(spans % 7 == 0){
				var br = document.createElement('BR');
				br.style.clear = 'both';
				div.appendChild(br);
			}
		}

		parent.appendChild(div);
	}

	this.getNumberOfDays = function(month, year) {
		if(year != 0) return this.daysOfMonth[month];
		else return this.daysOfMonthLE[month];
	}

	this.destroy = function() {
		this.container.removeChild(document.getElementById('callendar'));
	}

	this.changeYear = function(i) {
		this.showYear += i;
		this.destroy();
		this.show(this.container);
	}

	this.changeMonth = function(i) {
		this.showMonth += i;
		if(this.showMonth == -1) {
			this.showMonth = 11;
			this.showYear--;
		}
		if(this.showMonth == 12) {
			this.showMonth = 0;
			this.showYear++;
		}
		this.destroy();
		this.show(this.container);
	}

	this.registerEventAtDay = function(year, month, day, className, eventCallback) {
		if(!this.dayEvents[year]) this.dayEvents[year] = new Array();
		if(!this.dayEvents[year][month]) this.dayEvents[year][month] = new Array();
		if(!this.dayEvents[year][month][day]) this.dayEvents[year][month][day] = new Array();


		this.dayEvents[year][month][day]['className'] = className;
		this.dayEvents[year][month][day]['callback'] = eventCallback;
	}

	this.isSelected = function(month, year, day) {
		month++;
		var returnObjectClass = function() {
			this.setClassName = '';
			this.callbackEvent = '';
		}

		var returnObject = new returnObjectClass;


		if(this.dayEvents[year] && this.dayEvents[year][month] && this.dayEvents[year][month][day]) {
			returnObject.setClassName = this.dayEvents[year][month][day]['className'];
			returnObject.callbackEvent = this.dayEvents[year][month][day]['callback'];
			return returnObject;
		}


	}
}


function redirectMe(e) {
	if(this.title) document.location = this.title;
	else if(event.srcElement.title) document.location = event.srcElement.title;
}
