(function( $ ) {
	var calenderTpl = '<div id="calTitle"><button class="month-mover prev"></button><div id="monthYear"></div><button class="month-mover next"></button></div><div><div id="calThead"><div>Пн</div><div>Вт</div><div>Ср</div><div>Чт</div><div>Пт</div><div class="weekend">Сб</div><div class="weekend">Вс</div></div><div id="calTbody"></div></div>';
	var short_months = ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль","Август", "Сентябь", "Октябрь", "Ноябрь", "Декабрь"];
	var today = new Date();
	var cur_month = today.getMonth();
	var cur_year = today.getFullYear();
    $.fn.miniEventCalendar = $.fn.MEC = function(callback) {
        var mini_cal = this;
        mini_cal.addClass('mini-cal').html(calenderTpl);
        var tbody = mini_cal.find("#calTbody");
		var cal_title = mini_cal.find("#monthYear");
		var cal_footer = mini_cal.find("#calTFooter");

		var firstRun = 1;
		mini_cal.find(".month-mover").each(function(){
			var mover = $(this);
			mover.bind("click", function(){
				if(mover.hasClass("next"))
					viewNextMonth();
				else
					viewPrevMonth();
			});
		});
		mini_cal.on("click", ".a-date", function(){
		    if(!$(this).hasClass('blurred') && $(this).hasClass('event'))
		        callback($(this).data('event'));
		});
		function populateCalendar(month, year) {
			$.get('/ajax/', {request: 'get_events', month: month+1, year: year, first_run: firstRun}, function(events) {
				
				firstRun = 0;
				
				if (events.next_events.length > 0) {
					callback(events.next_events);
				}
				
				tbody.html("");
				cur_month = month;
				cur_year = year;
				cal_title.text(short_months[month] + " " + year);
				var ldate = new Date(year, month);
				var dt = new Date(ldate);
				if(ldate.getDate() === 1 && dt.getDay() != 1)
						tbody.append(last_prev_month_days(dt.getDay()));

				while (ldate.getMonth() === month) {
					
					var todayEvent = false;
					var today = new Date();
					var isToday = ldate.getFullYear() == today.getFullYear() && ldate.getMonth() == today.getMonth() && ldate.getDate() == today.getDate();
					
					if (isToday && events.events[ldate.getDate()] != undefined && events.events[ldate.getDate()] != null) {
						callback(events[ldate.getDate()]);
					}
					tbody.append(date_tpl(false, ldate.getDate(), isToday, events.events[ldate.getDate()], ldate.getDay()));
					ldate.setDate(ldate.getDate() + 1);
					var buffer_days = 43 - mini_cal.find(".a-date").length;
					if(ldate.getMonth() != month)
						for (var i = 1; i < buffer_days; i++)
							tbody.append(date_tpl(true, i));
						
				}

			}, 'json');			
 		}
 		function last_prev_month_days(day){
 			if(cur_month > 0){
     			var month_idx = cur_month - 1;
     			var year_idx = cur_year;
     		}else{
     			if(cur_month < 11){
     				var month_idx = 0;
     				var year_idx = cur_year + 1;
     			}else{
     				var month_idx = 11;
     				var year_idx = cur_year - 1;
     			}
     		}
     		var prev_month = getMonthDays(month_idx, year_idx);
     		var last_days = "";
        	for (var i = day - 1; i > 0; i--)
     			last_days += date_tpl(true, prev_month[ prev_month.length - i]);
        	return last_days;
 		}
		function date_tpl(blurred, date, is_today, event, weekday){
			if (weekday == 6 || weekday == 0) {
				var tpl = "<div class='a-date blurred weekend'><span>"+date+"</span></div>";
			} else {
				var tpl = "<div class='a-date blurred'><span>"+date+"</span></div>";
			}
			if(!blurred){
		        var cls = is_today ? "current " : "";
		        cls += event && event !== null && event !== undefined ? "event " : "";
				if (weekday == 6 || weekday == 0) {
					cls += ' weekend';
				}
				if (event == undefined) {
					event = {json: "[]"};
				}
		        var tpl ="<button class='a-date "+cls+"' data-event='"+event.json+"'><span>"+date+"</span></button>";
			}
			return tpl;
		}
		function viewNextMonth(){
			var next_month = cur_month < 11 ? cur_month + 1 : 0;
			var next_year = cur_month < 11 ? cur_year : cur_year + 1;
			populateCalendar(next_month, next_year);
		}
		function viewPrevMonth(){
			var prev_month = cur_month > 0 ? cur_month - 1 : 11;
			var prev_year = cur_month > 0 ? cur_year : cur_year - 1;
			populateCalendar(prev_month, prev_year);
		}
		function areSameDate(d1, d2) {
			return d1.getFullYear() == d2.getFullYear()
		        && d1.getMonth() == d2.getMonth()
		        && d1.getDate() == d2.getDate();
		}
		function getMonthDays(month, year) {
		     var date = new Date(year, month, 1);
		     var days = [];
		     while (date.getMonth() === month) {
		        days.push(date.getDate());
		        date.setDate(date.getDate() + 1);
		     }
		     return days;
		}
		populateCalendar(cur_month, cur_year);
        return mini_cal;
    };
 
}( jQuery ));