jQuery.fn.calendarPickerAgenda = function(options) {
  // --------------------------  start default option values --------------------------
  // masf, adapted from:
  // http://roberto.open-lab.com/2010/04/06/ultra-light-jquery-calendar/
  // http://bugsvoice.com/applications/bugsVoice/site/test/calendarPickerDemo.jsp
  
  if (!options.date) {
    options.date = new Date();
  }

  if (typeof(options.years) == "undefined")
    options.years=1;

  if (typeof(options.months) == "undefined")
    options.months=3;

  if (typeof(options.days) == "undefined")
    options.days=4;

  if (typeof(options.showDayArrows) == "undefined")
    options.showDayArrows=true;

  if (typeof(options.useWheel) == "undefined")
    options.useWheel=true;

  if (typeof(options.callbackDelay) == "undefined")
    options.callbackDelay=500;
  
  if (typeof(options.monthNames) == "undefined")
    options.monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];

  if (typeof(options.dayNames) == "undefined")
    options.dayNames = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];


  // --------------------------  end default option values --------------------------

  var calendar = {currentDate: options.date};
  calendar.options = options;

  //build the calendar on the first element in the set of matched elements.
  var theDiv = this.eq(0);//$(this);
  theDiv.addClass("agenda_calBox");

  //empty the div
  theDiv.empty();


  var divYears = $("<div>").addClass("agenda_calYear");
  var divMonths = $("<div>").addClass("agenda_calMonth");
  var divDays = $("<div>").addClass("agenda_calDay");


  theDiv.append(divYears).append(divMonths).append(divDays);

  calendar.changeDate = function(date) {
	  
    calendar.currentDate = date;
	
	if (calendar.currentDate.getFullYear()<2010 || calendar.currentDate.getFullYear()>2012 || (calendar.currentDate.getFullYear()==2009 && calendar.currentDate.getMonth()<=11)	) {
		date = new Date();
		calendar.currentDate = date;
	}
	

    var fillYears = function(date) {
      var year = date.getFullYear();
      var t = new Date();
      divYears.empty();
      var nc = options.years*2+1;
      var w = "auto";//parseInt((theDiv.width()-4-(nc)*4)/nc)+"px";
      for (var i = 2010; i <= 2012; i++) {
        var d = new Date(date);
        d.setFullYear(i);
			var span = $("<span>").addClass("agenda_calElement").attr("millis", d.getTime()).html(i).css("width",w);
			if (d.getYear() == t.getYear())
			  span.addClass("agenda_today");
			if (d.getYear() == calendar.currentDate.getYear())
			  span.addClass("agenda_selected");
			divYears.append(span);
      }
    }

    var fillMonths = function(date) {
      var month = date.getMonth();
      var t = new Date();
      divMonths.empty();
      var oldday = date.getDay();
      var nc = options.months*2+1;
      var w = 31;//parseInt((theDiv.width()-4-(nc)*4)/nc)+"px";
	  var widt = "";
      for (var i = 0; i < options.months; i++) {
        var d = new Date(date);
        var oldday = d.getDate();
        d.setMonth(i);

        if (d.getDate() != oldday) {
          d.setMonth(d.getMonth() - 1);
          d.setDate(28);
        }
		
		if (i<=5) {
			widt = w+1 ;
		} else {
			widt=w;
		}
		
		widt += "px";
		
        var span = $("<span>").addClass("agenda_calElement").attr("millis", d.getTime()).html(options.monthNames[d.getMonth()]).css("width",widt);
        if (d.getYear() == t.getYear() && d.getMonth() == t.getMonth())
          span.addClass("agenda_today");
	    if (i==0) span.addClass("agenda_first");
        if (d.getYear() == calendar.currentDate.getYear() && d.getMonth() == calendar.currentDate.getMonth())
          span.addClass("agenda_selected");
        divMonths.append(span);

      }
    }

    var fillDays = function(date) {
      var day = date.getDate();
      var t = new Date();
      divDays.empty();
      var nc = options.days*2+1;
      var w = "55px";//parseInt(((theDiv.width()-100 ) -4-(options.showDayArrows?12:0)-(nc)*4)/(nc-(options.showDayArrows?2:0)))+"px";
      for (var i = -options.days; i <= options.days; i++) {
        var d = new Date(date);
        d.setDate(day + i)
        var span = $("<span>").addClass("agenda_calElement").attr("millis", d.getTime())
        if (i == -options.days && options.showDayArrows) {
          span.addClass("agenda_prev");
        } else if (i == options.days && options.showDayArrows) {
          span.addClass("agenda_next");
        } else {
          span.html("<span class='agenda_dayNumber'>" + d.getDate() + "</span><br>" + options.dayNames[d.getDay()]).css("width",w);
          if (d.getYear() == t.getYear() && d.getMonth() == t.getMonth() && d.getDate() == t.getDate())
            span.addClass("agenda_today");
          if (d.getYear() == calendar.currentDate.getYear() && d.getMonth() == calendar.currentDate.getMonth() && d.getDate() == calendar.currentDate.getDate())
            span.addClass("agenda_selected");
        }
        divDays.append(span);

      }
    }

    var deferredCallBack = function() {
      if (typeof(options.callback) == "function") {
        if (calendar.timer)
          clearTimeout(calendar.timer);

        calendar.timer = setTimeout(function() {
          options.callback(calendar);
        }, options.callbackDelay);
      }
    }


    fillYears(date);
    fillMonths(date);
    fillDays(date);

    deferredCallBack();

  }


  theDiv.click(function(ev) {
    var el = $(ev.target).closest(".agenda_calElement");
    if (el.hasClass("agenda_calElement")) {
      calendar.changeDate(new Date(parseInt(el.attr("millis"))));
    }
  });
  


  //if mousewheel
  if ($.event.special.mousewheel && options.useWheel) {
    divYears.mousewheel(function(event, delta) {
      var d = new Date(calendar.currentDate.getTime());
      d.setFullYear(d.getFullYear() + delta);
      calendar.changeDate(d);
      return false;
    });
    divMonths.mousewheel(function(event, delta) {
      var d = new Date(calendar.currentDate.getTime());
      d.setMonth(d.getMonth() + delta);
      calendar.changeDate(d);
      return false;
    });
    divDays.mousewheel(function(event, delta) {
      var d = new Date(calendar.currentDate.getTime());
      d.setDate(d.getDate() + delta);
      calendar.changeDate(d);
      return false;
    });
  }


  calendar.changeDate(options.date);

  return calendar;
};
