jQuery.fn.pdCal = function(options){
	var dYear, dMonth, dDay, today;
	var today = new Date();
	var canHide = false;
	var futureFunc, todayFunc, pastFunc, holidayFunc;
	var daySelects = [];
	dMonth = today.getMonth();
	var inputObj = this;
	dYear	 = today.getFullYear();
	dDay   = today.getDate();
	var ActDay = new Date();
	ActDay.setFullYear(dYear,dMonth,dDay);
	
	p = this.offset();
	
	var defaults = {
  	pdCalObjCss: {fontFamily: '"Lucida Sans Unicode", "Lucida Grande", sans-serif', fontSize: '9px', textAlign: 'center', color: '#000', float: 'left', width: '205px', margin: '0', padding: '2px', border: 'solid 1px #AAF', position: 'absolute', backgroundColor: '#FFF', display: 'none', zIndex: '100'},
  	pdCalNavigationObjCss: {	float:'left', margin: '0 0 1px', border: 'solid 1px #CCC', width: '203px', padding: 0, textAlign: 'center'},
  	pdCalNavigationObjDivCss: 	{float: 'left', margin: '3px 0 0 5px'},
  	pdCalNavigationObjLImgCss: 	{float: 'left', cursor: 'pointer', margin: '1px 30px 1px 1px'},
  	pdCalNavigationObjRImgCss:	{float: 'right', cursor: 'pointer', margin: '1px'},
  	pdCalInnerObjCss: {float: 'left', margin: 0, padding: 0},
  	pdCalLiCss: {width: '25px', padding: '2px 0', margin: '1px', float: 'left', border: 'solid 1px #CCC', listStyle: 'none', cursor: 'pointer'},

  	todayLiCss: {border: 'solid 1px #f00', background: '#CCC', fontWeight:'bold'},
  	futureLiCss: {border: 'solid 1px #ccc', background: '#fff'},
  	pastLiCss: {border: 'solid 1px #ccc', background: '#fff', color:'#999'},
  	blankLiCss: {border: 'solid 1px #fff'},
  	holidayLiCss: {border: 'solid 1px #c00'},
  	
  	LeftArrowObjAttr: {src: "../images/arrow_left.png", alt: "arrow_left", width: 18, height: 18},
  	RightArrowObjAttr:	{src: "../images/arrow_right.png", alt: "arrow_left", width: 18, height: 18},
  	
  	futureSelect: true,
  	todaySelect: false,
  	pastSelect: false,
  	holidaySelect: false
  }
  var options = $.extend(defaults, options);

	var pdCalObj = $('<div>').css(defaults.pdCalObjCss);
	var pdCalNavigationObj = $('<div>').css(defaults.pdCalNavigationObjCss);

	
	var pdCalYear = $('<div>').css(defaults.pdCalNavigationObjDivCss).html(dYear);
	var pdCalMonth = $('<div>').css(defaults.pdCalNavigationObjDivCss).html(intToMonth(dMonth));
	var pdCalLeftArrowObj = $('<img>').attr(defaults.LeftArrowObjAttr).css(defaults.pdCalNavigationObjLImgCss).click(function(){descMonth(); drawDays()});
	var pdCalRightArrowObj = $('<img>').attr(defaults.RightArrowObjAttr).css(defaults.pdCalNavigationObjRImgCss).click(function(){incMonth(); drawDays()});
	
	var pdCalInnerObj = $('<ul>').css(defaults.pdCalInnerObjCss);
	
	
	pdCalNavigationObj.append(pdCalLeftArrowObj).append(pdCalYear).append(pdCalMonth).append(pdCalRightArrowObj);
	pdCalObj.append(pdCalNavigationObj).append(pdCalInnerObj);
	$('body').append(pdCalObj);
	
	
	this.blur(function() {if (canHide) {pdCalObj.hide();}});
	pdCalObj.mouseenter(function() {canHide = false;});
	pdCalObj.mouseleave(function() {canHide = true;});

	drawDays();
//	pdCalInnerObj.delegate("li.future", "click", function(){
//		$(inputObj).val(dYear + '-' + twoDigit(parseInt(dMonth) + 1) + '-' + twoDigit($(this).html()));
//		pdCalObj.hide();
//	});

	if (defaults.futureSelect) {
		daySelects.push("li.future");
	}
  if (defaults.todaySelect) {
    daySelects.push("li.today");
  }
    if (defaults.pastSelect) {
    daySelects.push("li.past");
  }
  if (defaults.holidaySelect) {
    daySelects.push("li.wNoc, li.ND, li.SO, li.swieto");
  }

//  pdCalInnerObj.delegate("li.future", "click", daySelect);
  pdCalInnerObj.delegate(daySelects.join(", "), "click", daySelect);
	
	this.focus(function() {
	  var dane = [];
		if ($(this).val() && $(this).val()!='0000-00-00') {
			dane = $(this).val().split('-');
			dDay = dane[2];
			dMonth = Number(dane[1])-1;
			dYear = dane[0];
			ActDay.setFullYear(dYear, dMonth ,dDay);
		}
		p = inputObj.offset();
		pdCalObj.css({left: p.left, top: p.top + 20});
		pdCalObj.show();
	});
	this.keypress(function() {return false}); 
	
	function daySelect() {
		$(inputObj).val(dYear + '-' + twoDigit(parseInt(dMonth) + 1) + '-' + twoDigit($(this).html()));
		pdCalObj.hide();
	}
	
	function drawDays() {
		$('li', pdCalInnerObj).not('.title').remove();
		var fd =  new Date();
		fd.setFullYear(dYear, dMonth, 1);
		v = sunToMon(fd);
		days = daysInMonth(dMonth);
		tMonth = dMonth + 1;
		st = {};
		for (i=1; i < (days + v); ++i) {
			pd = i - v + 1;
			if (pd>0) fd.setDate(pd);
			if (compareDates(fd, today)==0) {st = defaults.todayLiCss; cssStyle = 'today';}
			if (compareDates(fd, today)==1) {st = defaults.futureLiCss; cssStyle = 'future';}
			if (compareDates(fd, today)==-1) {st = defaults.pastLiCss; cssStyle = 'past';}
			if (wielkanoc(fd)) {st = defaults.holidayLiCss; cssStyle = 'wNoc';}
			if (!(i%7)) {st = defaults.holidayLiCss; cssStyle = 'ND';}
			if (!((i+1)%7)) {st = defaults.holidayLiCss; cssStyle = 'SO';}
			if (swieto(fd)) {st = defaults.holidayLiCss; cssStyle = 'swieto';}
			li = $('<li>').css(defaults.pdCalLiCss);
			if (pd>0) {
				li.css(st).attr("class", cssStyle).html(pd); // 
			} else {
				li.css(defaults.blankLiCss);
			}
			pdCalInnerObj.append(li);
		}
	}
	function compareDates(d1, d2) {
		if (d1.getFullYear() < d2.getFullYear()) return -1;		
		if (d1.getFullYear()==d2.getFullYear() && d1.getMonth() < d2.getMonth()) return -1;
		if (d1.getMonth()==d2.getMonth() && d1.getFullYear()==d2.getFullYear() && d1.getDate()<d2.getDate()) return -1; //d1<d2
		if (d1.getMonth()==d2.getMonth() && d1.getFullYear()==d2.getFullYear() && d1.getDate()==d2.getDate()) return  0; //d1=d2
		return 1;
	}
	function daysInMonth() {
		var days = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
		if (dYear%4) days[1] = 28;
		return days[dMonth];
	}
	function sunToMon(d) {
		wday = d.getDay();	
		return (wday==0?7:wday);
	}
	function intToMonth(m) {
		var months = ['styczeń', 'luty', 'marzec', 'kwiecień', 'maj', 'czerwiec', 'lipiec', 'sierpień', 'wrzesień', 'pażdziernik', 'listopad', 'grudzień'];
		return months[m];
	}
	function twoDigit(n) {
//		return (n.length>1?n:'0'+n)
		return (n>9)?n:'0'+n;
	}
	function incMonth() {
		dMonth++; if (dMonth>11) {dMonth=0; dYear++; };
		ActDay.setFullYear(dYear,dMonth,dDay);
		pdCalYear.html(dYear);
		pdCalMonth.html(intToMonth(dMonth));
	}
	function descMonth() {
		dMonth--; if (dMonth<0) {dMonth=11; dYear--; };
		ActDay.setFullYear(dYear,dMonth,dDay);
		pdCalYear.html(dYear);
		pdCalMonth.html(intToMonth(dMonth));
	}
	function wielkanoc(da) {
		// A=24, B=5 	Uwaga wyjątki dla lat: 1954, 1981, 2049, 2076 
		var month, day;
		dYear = da.getFullYear();
		dMonth = da.getMonth();
		dDay = da.getDay();
		
		a = dYear%19;
		b = dYear%4;
		c = dYear%7;
		d = (a*19 + 24)%30;
		e = ((2*b) + (4*c) + (6*d) + 5)%7;
		
		if (d + e < 10) 
			{month=2; day=d + e + 22;}
		else 
			{month=3; day=d + e - 9;}
		
		var wNoc = new Date();
		var wNoc1 = new Date();
		wNoc.setFullYear(dYear, month, day);
		wNoc1.setFullYear(wNoc.getFullYear(), wNoc.getMonth(), wNoc.getDate()+1); 
		
		return !(compareDates(da, wNoc) && compareDates(da, wNoc1));
	}	
	function swieto (da) {
		var swieto = false;
		var day = new Date();
		var dniWolne = [[1,1, 'Nowy Rok'], 
										[1,6, 'Trzech Króli'], 
										[5,1, 'Święto Pracy'], 
										[5,3, 'Święto Trzeciego Maja'], 
										[8,15, 'Wniebowzięcie Najświętszej Maryi Panny'], 
										[11,1, 'Wszystkich Świętych'],
										[11,11, 'Narodowe Święto Niepodległości'],
										[12,25, 'Boże Narodzenie'], 
										[12,26, 'Boże Narodzenie']];
		$.each(dniWolne, function(index, value) { 
			day.setFullYear(dYear, value[0]-1, value[1]);
			if (!(compareDates(day, da))) swieto = true;
		});
		return swieto;
	}
	function dateToString (da) {
		return (da.getDay() + '-' + twoDigit(da.getMonth()) + '-' + da.getFullYear())
	}


}  
