jQuery.fn.pgcal= function(opts){
	opts = jQuery.extend({
		start_date:new Date(2006,1,1),		
		stop_date: new Date(),
		today : new Date(),
		callback:function(){return false;},
		link_to:'/blog/__year__/__month__/__day__'
	},opts||{});
	
	return this.each(function() {
		var daysInMonth = function (month,year) {
			var m = [31,28,31,30,31,30,31,31,30,31,30,31];
			if (month != 2) return m[month - 1];
			if (year%4 != 0) return m[1];
			if (year%100 == 0 && year%400 != 0) return m[1];
			return m[1] + 1;
			} 
		
		var getClickHandler = function(year,month,day,golink) {			
			return function(evt){
				opts.today = new Date(year,month-1,day);
				if (!golink)
				Draw();
				return golink; }		}

		
		var getYesterday = function (year,month,day)
		{
			var myDate = new Date();
			myDate.setDate(opts.today.getDate() + day);
			myDate.setMonth(opts.today.getMonth() + month);
			myDate.setYear(opts.today.getFullYear() + year);
			return myDate;
		}
		
		var appendLinkYear = function (year,text)
		{
			
			var y,m,d;
			if (year == 1 || year == -1)
			{
				y = opts.today.getFullYear()+year;	
			}else{
				y = year;
			}						
			m = opts.today.getMonth()+1;
			d = opts.today.getDate();
			
			if (typeof(text) != 'undefined')
			{
				text =  text;
				golink = false;
			}else{
				text =  y;
				golink = true;
			}
			
			
			
			if (year !=  opts.today.getFullYear()){
				var lnk = jQuery("<a>"+text+"</a>")
					.bind('click',getClickHandler(y,m,d,golink))
					.attr('href', opts.link_to.replace(/__year__/,y).replace(/__month__/,m).replace(/__day__/,d));;
			}else{
				var lnk = jQuery("<a class='current'>"+text+"</a>")
				.bind('click',getClickHandler(y,m,d,golink))
				.attr('href', opts.link_to.replace(/__year__/,y).replace(/__month__/,m).replace(/__day__/,d));;
				if (!animation)
				{				
				lnk.animate({ fontSize:"30px" });
				}else{
					lnk.css("fontSize","30px");
				}
			}
			

			return lnk;		
		
		}
		
		var appendLinkMonth = function (month,text)
		{
			var y,m,d;
			y = opts.today.getFullYear();						
			m = opts.today.getMonth()+1;
			d = opts.today.getDate();
			
			m += month;
			if (m <= 0){ m += 12; y--;}				
			if (m > 12){m -= 12;y++;}
			
			if (typeof(text) != 'undefined')
			{
				text =  text;
				golink = false;
			}else{
				text =  months[m-1];
				golink = true;
			}
			
			if (month != 0){
				var lnk = jQuery("<a>"+text+"</a>")
					.bind('click',getClickHandler(y,m,d,golink))
					.attr('href', opts.link_to.replace(/__year__/,y).replace(/__month__/,m).replace(/__day__/,d));;
			}else{
				var lnk = jQuery("<a class='current'>"+text+"</a>")
				.bind('click',getClickHandler(y,m,d,golink))
				.attr('href', opts.link_to.replace(/__year__/,y).replace(/__month__/,m).replace(/__day__/,d));;
				if (!animation)
				{				
					lnk.animate({ fontSize:"30px" });
				}else{
					lnk.css("fontSize","30px");
				}
			}
			return lnk;
			
		}
		
		var appendLinkDay = function (day,text)
		{
			var y,m,d;
			y = opts.today.getFullYear();						
			m = opts.today.getMonth()+1;
			d = opts.today.getDate();
			
			d+= day;
			
			if (d < 1){
				m--;
				if (m < 0){m += 12;y--;}
				d += daysInMonth(m,y);
			}
			if (d > daysInMonth(m,y))
			{
				m++;
				if (m>=12)
				{d -= daysInMonth(m-1,y);	m-=12;y++;}else{d -= daysInMonth(m-1,y);}
			}
			
			if (typeof(text) != 'undefined')
			{
				text =  text;
				golink = false;
			}else{
				text =  d;
				golink = true;
			}
			
			if (day != 0){
				var lnk = jQuery("<a>"+text+"</a>")
					.bind('click',getClickHandler(y,m,d,golink))
					.attr('href', opts.link_to.replace(/__year__/,y).replace(/__month__/,m).replace(/__day__/,d));;
			}else{
				var lnk = jQuery("<a class='current'>"+text+"</a>")
				.bind('click',getClickHandler(y,m,d,golink))
				.attr('href', opts.link_to.replace(/__year__/,y).replace(/__month__/,m).replace(/__day__/,d));;
				if (!animation)
				{				
				lnk.animate({ fontSize:"30px" });
				}else{
					lnk.css("fontSize","30px");
				}
			}
			return lnk;
			
			
		}

			
		var Draw = function(){
			y_start = opts.start_date.getFullYear();
			y_stop = opts.stop_date.getFullYear();

			panel.empty();
			
			panel.append("<div class='pg_year' >");
			panel.children('.pg_year').append(appendLinkYear(-1,'<'));
			for(var i=y_start; i<=y_stop; i++) {
				panel.children('.pg_year').append(appendLinkYear(i));
			}
			panel.children('.pg_year').append(appendLinkYear(1,'>'));
		
			
			panel.append("<div class='pg_month'>");
			panel.children('.pg_month').append(appendLinkMonth(-1,'<'));
			for(var i=-2; i<=2; i++) {
				panel.children('.pg_month').append(appendLinkMonth(i));
			}
			panel.children('.pg_month').append(appendLinkMonth(1,'>'));
						
			panel.append("<div class='pg_day'>");
			panel.children('.pg_day').append(appendLinkDay(-1,'<'));
			for(var i=-2; i<=2; i++) {
				panel.children('.pg_day').append(appendLinkDay(i));
			}
			panel.children('.pg_day').append(appendLinkDay(1,'>'));
			
			animation = true;
		
		}
		
		var months =  ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
		var panel = jQuery(this);
		var current_year = opts.today.getFullYear();
		var current_month = opts.today.getMonth()+1;
		var current_day = opts.today.getDate();
		var animation = false;
		Draw();
		
	});
	
}