/**
 * Calendar plugin
 * Version 0.1 (11/8/2008)
 *
 * Copyright (c) 2008 Ilgam Zinatullin
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 *
 */
;
(function($)
{
	$.fn.addCal=function(opt)
	{
		return this.each(function()
		{
			var CAL = this,
				id = 'addCal_' + ($.fn.addCal.idx++),
				O = CAL.opt = $.extend({}, $.fn.addCal.def, opt);
			CAL.draw = function(seeD, dates)
			{
				var s = '<table cellspacing="1" id="'+id+'" class="addcal">',
					date = function(y,m,d)
					{
						var ret = y instanceof Date ? new Date(y.setHours(0,0,0,0)) : new Date(y,m,d);
						ret.d = ret.getDate();
						ret.m = ret.getMonth();
						ret.y = ret.getFullYear();
						ret.format = function(f)
						{
							var f = f||O.format,
								t = this;
							return f.replace(/(d|F|j|m|M|n|Y|y|q|Q)/g,
											function($1)
											{
												return $1 == 'd' ? 
															t.d<10 ? '0' + t.d : t.d : 
														$1 == 'q' ? '0' + (Math.floor(t.m/3)+1) : 
														$1 == 'Q' ? Math.floor(t.m/3)+1 : 
														$1 == 'F' ? O.monthName[t.m] :
														$1 == 'j' ? t.d :
														$1 == 'm' ? t.m < 9 ? '0'+(t.m+1) : t.m + 1 : 
														$1 == 'M' ? O.monthName[t.m].slice(0,3) : 
														$1 == 'n' ? t.m + 1 : 
														$1 == 'Y' ? t.y : 
														$1 == 'y' ? (''+t.y).slice(2):''
											})
						};
						ret.s = ret.format('n/j/Y');
						ret.o = ret.format('Ymd');
						return ret
					},
					k, b, e, c, d, dd, 
					curD = date(new Date()),
					selD = O.selD instanceof Date ? date(O.selD) : {o:0},
					t = O.calType || 0,
					mn = date(O.minD),
					mx = date(O.maxD),
					seeD = O.seeD = date(seeD||O.seeD),
					fd = date(t==3 ? Math.floor(seeD.y/10)*10 : seeD.y, !t ? seeD.m : 0, 1),
					ld = date(t==3 ? Math.floor((seeD.y+10)/10)*10 : seeD.y, !t ? seeD.m + 1 : 11, !t ? 0 : 31),
					ly = date(seeD.y - (t<3 ? t<2 ? 1 : 2 : 5), t<3 ? seeD.m : 0, 1),
					ny = date(seeD.y + (t<3 ? t<2 ? 1 : 2 : 5), t<3 ? seeD.m : 0, 1);
				
				selD = !t || !selD.o ? selD : date(selD.y, t<3 ? t<2 ? selD.m :Math.floor(selD.m/3)*3:0, 1);
				seeD = !t ? seeD:date(seeD.y, t<3 ? t<2 ? seeD.m : Math.floor(seeD.m/3)*3 : 0, 1);
				curD = !t ? curD:date(curD.y, t<3 ? t<2 ? curD.m : Math.floor(curD.m/3)*3 : 0, 1);
				switch(t)
				{
					case 1:
						c = 3;
						b = -3;
						e = 15;
					break;
					case 2:
						c = 4;
						b = -8;
						e = 8;
					break;
					case 3:
						c = 5;
						b = seeD.y - 17;
						e = seeD.y + 8;
					break;
					default:
						var w = O.week = O.week || false,
							lm = date(seeD.y, seeD.m - 1, 1),
							nm = date(seeD.y, seeD.m + 1, 1);
						if (w)
							var week=function(d)
							{
								var m = d.m,
									a = Math.floor((13-m)/12),
									y = d.y + 4800 - a,
									J = d.d + Math.floor((153*(m+12*a-2)+2)/5)+365*y+(Math.floor(y/4)-Math.floor(y/100)+Math.floor(y/400))-32045,d=(((J+31741-(J%7))%146097)%36524)%1461,
									L = Math.floor(d/1460);
								return Math.floor((((d-L)%365)+L)/7)+1
							};
						c = w ? 8 : 7;
						b = (k = fd.getDay())<1 ? -5 : 2-k;
						e = ld.d + ((k=ld.getDay())<1 ? 1 : 8-k)
				}
				s += '<tr class="addcalnav"><td colspan="'+
						c+
						'"><table cellspacing="0"><tr>'
						+(O.monthBut&&t<1?'<td inc="1" dt="'+lm.s+'" class="lmonth add" title="'+lm.format('F Y')+'"/>':'')
						+(O.yearBut?'<td inc="1" dt="'+ly.s+'" class="lyear add" title="'+ly.format((!t?'F ':'')+'Y')+'"/>':'')+
						'<th>'
						+((seeD.y==selD.y&&seeD.m==selD.m)||!t?(t<3?(t<2?seeD.format('F'):seeD.format('Q '+O.quartalName))+' ':''):'')+
						(t<3?seeD.y:selD.y?selD.y:seeD.y)+
						'</th>'+
						(O.yearBut?'<td inc="1" dt="'+ny.s+'" class="nyear add" title="'+ny.format((!t?'F ':'')+'Y')+'"/>':'')+
						(O.monthBut&&t<1?'<td inc="1" dt="'+nm.s+'" class="nmonth add" title="'+nm.format('F Y')+'"/>':'')+
						'</tr></table></td></tr>';
				if(!t)
				{
					s+='<tr>';
					for(k in O.weekName)
						s+=k<c?'<th'+(k>4?' class="week'+(k>6?'n':'e')+'"':'')+'>'+O.weekName[k]+'</th>':'';
					s+='</tr>';
					c=7
				}
				for(d=b,k=1;d<e;d++,k++)
				{
					dd = date(t==3 ? d : seeD.y, t==2 ? d*3 : t==1 ? d : t==3 ? 0 : seeD.m, !t ? d : 1);
					s+=(k%c==1?'<tr>':'')+
					'<td class="'+
					((dd.o<fd.o||dd.o>ld.o)&&!O.yearBut&&!O.monthBut&&!t?'':'add')+
					(dd.o<fd.o||dd.o>ld.o?' grayed':'')+
					(!t?(k%7==6||k%7==0?' weeke':''):'')+
					(dd.o==selD.o?' sel':'')+
					(dd.o<mn.o||dd.o>mx.o||!O.check(dd)?' dis':'')+
					(dd.o==curD.o?' cur':'')+
					'" dt="'+dd.s+'">'+
					(dates[dd.s] ? '<a href="'+dates[dd.s]+'" class="cal_link">' : '')+
					(!t?dd.d:(t==1?(dd.y==fd.y?O.monthName[dd.m]:O.monthName[dd.m].slice(0,3)+'-'+dd.y):(t==2?((dd.m/3+1)+' '+(dd.y==fd.y?O.quartalName:O.quartalName.slice(0,2)+'-'+dd.y)):dd.y)))+
					(dates[dd.s] ? '</a>' : '') +
					'</td>'+
					(k%c?'':(!t&&w?'<td class="weekn">'+week(dd)+'</td>':'')+'</tr>')
				}
				$(CAL).html(s+'</table>').find('.add:not(.dis)').
				bind('mouseenter mouseleave click', 
				function(e)
				{
					var $t=$(this);$is=$t.attr('inc')
					if(e.type=='click')
					{
						var d=date(new Date($t.attr('dt')))
						if(!$is)
						{
							//O.selD=d;
							O.click(this,d)
						}
						CAL.draw(d, dates)
					}
					else 
						$t.toggleClass('hover')
				})
			}
			CAL.draw(O.selD||O.seeD||new Date(), dates)
		})
	}
	$.fn.addCal.idx = 0;
	$.fn.addCal.def = 
	{
		check:function(dt){return true},
		click:function(obj,dt){},
		weekName:['Пн','Вт','Ср','Чт','Пт','Сб','Вс','Нед'],
		monthName:['Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'],
		quartalName:'квартал',
		minD:new Date(1900,0,1),
		maxD:new Date(2018,10,2),
		calType:0,
		monthBut:1,
		yearBut:1,
		format:'d.m.Y'
	}
})(jQuery);
