
function artCalendar(date,month,year){
	
	var daysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31];
	var months	=	['Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'];
	var shortMonth = ['Янв.','Фев.','Мар.','Апр.','Май','Июн.','Июл.','Авг.','Сен.','Окт.','Нояб.','Дек.'];
	
	//текушая дата
	this.curDay = 0;
	this.curDate = date;
	this.curMonth = month;
	this.curYear = year;
	
	//дата для навигации(след./пред. месяц)
	this.navDay = 0;
	this.navDate = date;
	this.navMonth = month;
	this.navYear = year;
	//have data  got or not
	this.isDataGot = false;
	this.events = "";
	
	
	function addZero(number) {
		
		var val = parseInt(number);
		
		if(val < 10){
			number = '0' + number.toString();	
		}
		
		return number;
	}
	
	//1-вперед,-1 - назад,0 - текущий
	this.createCalendar = function(nav,events){
		/************************************************************базовые настройки*/
		if (this.navYear % 4 == 0) {
			daysInMonth = [31,29,31,30,31,30,31,31,30,31,30,31];
		} else {
			daysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31];
		}

		//ВЫЧИСЛЕНИЕ НОМЕРА ДНЯ НЕДЕЛИ первого числа
		var d 	= new Date(this.navYear,this.navMonth,1);
		day 	= parseInt(d.getDay());
		
		//настройка месяцев, а точнее их номеров(решение тоже не ice)
		switch(nav){
			case 0:
			
				this.navDay = day;
				this.navMonth = month;
				this.navYear = year;
				break;
				
			case 1:
			
				if(this.navMonth == 11){
					this.navMonth = 0;
					this.navYear = parseInt(this.navYear) + 1;
				}
				else
					this.navMonth = parseInt(this.navMonth) + 1;
				
				var tmp = new Date(this.navYear,this.navMonth,1);
				this.navDay = tmp.getDay();
				break;
				
			case -1:
			
				if(this.navMonth == 0){
					this.navMonth = 11;
					this.navYear = parseInt(this.navYear) - 1;
				}
				else
					this.navMonth = parseInt(this.navMonth) - 1;
				
				var tmp = new Date(this.navYear,this.navMonth,1);
				this.navDay = tmp.getDay();
				break;
			
		}
		
		//количество дней в неделе - константа!
		var _daysOfWeek = 7;
		
		//количество дней в месяце
		var days = daysInMonth[this.navMonth];
		
		//оперделение високосный год или нет
		var lYear = !(year%4) && (year%100) || !(year%400);
		
		//добавление дня в феврале
		if(days == 28 && lYear!= false){
			days = parseInt(days)+1;	
		}
		
		//сдвиг дней - вообще как-то надо сделать все эти сдвиги красивее
		if(this.navDay == 0){
			this.navDay = 6;	
		}
		else{
			this.navDay = parseInt(this.navDay) - 1;	
		}
		
		/**************************************************первый проход по дням*/	
		var str = "<tr>";
		
		//инетатор дней месяца 1,2,3...
		var itemDay = 1;
		
		//строим первую неделю
		for(var i = 0;i<_daysOfWeek;i++){
			
			//представим себе календрик windows - если 1-ое число это не понедельник,то перед ним будут пустые клеточки,
			//пободное и с 31(28(29),30) числами.Все зависит от месяца
			if(this.navDay <= i){
				str+="<td id='" + this.navYear + '-' + addZero(this.navMonth+1) + '-' + addZero(itemDay) + "'>" + itemDay + "</td>";	
				itemDay++;
			}
			else{
				str+="<td class='padding' ></td>";
			}
		}
		str+="</tr><tr>";
		/***************************************************промежуточные недели*/
		var j = 0;
		//промежуточные недели
		for(;itemDay  <= days;j++){
			
			//если конец недели - переходим на новую строку
			if(j == _daysOfWeek){
					str += "</tr><tr>";
					j = 0;
			}
			str += "<td id='" + this.navYear + '-' + addZero((this.navMonth+1)) + '-' + addZero(itemDay) + "'>" + itemDay + "</td>";
			itemDay++;
		}
		
		//************************************последняя неделя - дописываем до конца*/
		while(j<_daysOfWeek){
			str += "<td class='padding'></td>";
			j++;
		}
			
		str += "</tr>";
		
		//навигация - нафига это тут надо сам не знаю(-:
		var backMonth 	 = (this.navMonth != 0 ? parseInt(this.navMonth) - 1 : 11);
		var forwardMonth = (this.navMonth != 11 ? parseInt(this.navMonth) + 1 : 0);
			
		//ну,вот мы и создали календарик, пока его всем показать - заполняем внутренности полученной выходной строкой str
		jQuery("#afisha-calendar-date").html(str);
		jQuery("#afisha-month").html(months[this.navMonth] + "," + this.navYear);
		
		//получение короткого названия месяца - для навигации конечно
		this.backMonth = shortMonth[backMonth];
		this.forwardMonth = shortMonth[forwardMonth];
		
		if(nav !=0){
			jQuery("#month-back").html(this.backMonth);
			jQuery("#month-forward").html(this.forwardMonth);
		}
		
		//первый раз получаем все события и сохраняем,чтобы 100 раз не передавать этот параметр(формат параметра JSON)
		if(events)
			this.events = events;
		
		//навешивание событий
		this.bindEvents(this.events);
		
		//select today
		if(this.curMonth == this.navMonth  && this.curYear == this.navYear)
			var tmp = this.curYear+'-' + this.curMonth+1 + '-'+ this.curDate;
		
			jQuery("#"+tmp).
					removeClass("today").
					addClass("today");
		
	}
	
	//навешивание событий - у меня по наведению - берешь переписываешь и все в ажуре и 
	this.bindEvents = function(events){
		
		var sBegin 	= '<div class="events">\n'+
					'<ul>\n';
		var sEnd	= 	'</ul>\n'+
					  '</div>\n';
		
		var endMonth = daysInMonth[this.navMonth].toString() + this.navMonth.toString() + this.navYear.toString();
		
		
		  
		for(var _date in events){
			//alert(_date);
//			return false;
			//конец месяца
			if(_date == endMonth)
				break;
			//alert(_date);
			var out = '';
			for(var _type in events[_date]){
				//alert(_type)
				if(_type){
					
					out +='<li>\n' + 
							'<a href="/afisha/'+ _type + '/' + _date + '/">' +
								events[_date][_type].name +' (' + events[_date][_type].count + ')\n' +
							'</a>' +
						  '</li>\n';
				}//if 1
	
			}//for 2
			
			jQuery('#' + _date).
					addClass('date_has_event').
					append(sBegin + out + sEnd).
					attr('title','Все события в этот день').
					click(function(){
								   location.replace('/afisha/all/' + $(this).attr('id'));
							});
	
		}//for1
		
		$('.date_has_event').each(function () {
		// options
		var distance = 10;
		var time = 250;
		var hideDelay = 0;

		var hideDelayTimer = null;

		// tracker
		var beingShown = false;
		var shown = false;

		var trigger = $(this);
		var popup = $('.events ul', this).css('opacity', 0);
		
		// set the mouseover and mouseout on both element
		$([trigger.get(0), popup.get(0)]).mouseover(function () {
			// stops the hide event if we move from the trigger to the popup element
			if (hideDelayTimer) clearTimeout(hideDelayTimer);

			// don't trigger the animation again if we're being shown, or already visible
			if (beingShown || shown) {
				return;
			} else {
				beingShown = true;

				// reset position of popup box
				popup.css({
					bottom: 15,
					left: -76,
					display: 'block' // brings the popup back in to view
				})

				// (we're using chaining on the popup) now animate it's opacity and position
				.animate({
					bottom: '+=' + distance + 'px',
					opacity: 1
				}, time, 'swing', function() {
					// once the animation is complete, set the tracker variables
					beingShown = false;
					shown = true;
				});
			}
		}).mouseout(function () {
			// reset the timer if we get fired again - avoids double animations
			if (hideDelayTimer) clearTimeout(hideDelayTimer);

			// store the timer so that it can be cleared in the mouseover if required
			hideDelayTimer = setTimeout(function () {
				hideDelayTimer = null;
				popup.animate({
					bottom: '-=' + distance + 'px',
					opacity: 0
				}, time, 'swing', function () {
					// once the animate is complete, set the tracker variables
					shown = false;
					// hide the popup entirely after the effect (opacity alone doesn't do the job)
					popup.css('display', 'none');
				});
			}, hideDelay);
		});
	});
	
	}
	
}
