	var xcArrowLeftSrc				= '/img/arr_red_left.gif';
	var xcArrowRightSrc				= '/img/arr_red_right.gif';

	var xcMonthContainer			= "xcMonthContainer";
	var xcYearContainer				= "xcYearContainer";
	var xcCalTable					= "xcCalTable";	
	
	var xcStlWeekend				= "cal_weekend";
	var xcStlPrev					= "cal_previous";
	var xcStlPast					= "cal_past";
	var xcStlCurrent				= "cal_current";

	var xcMonthNames 				= new Array("Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь");
	var xcMonthMaxDays 				= new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	var xcDayNames					= new Array("Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс");
	var xcWeekEndDays				= new Array(0, 0, 0, 0, 0, 1, 1);
	var xcMaxYear					= 2040;
	var xcMinYear					= 1970;
	var xcCalcLines					= 6;
	var globalActivationDate		= null;

	function xcSetMonthContainerHTML (xcTodayYear, xcTodayMonth, xcTodayDay) {
		var xcNewYear					= xcTodayMonth == 0 ? xcTodayYear - 1 : xcTodayYear;
		var xcMonthContainerHTML 		= "<a href=# " + (xcNewYear >= xcMinYear ? "" : "style='visibility: hidden;'") + " onclick='xcUpdateCalendar(" + xcNewYear + "," + (xcTodayMonth==0 ? 11 : xcTodayMonth-1) + "," + xcTodayDay + "); return false;'><img src='" + xcArrowLeftSrc + "' alt='' /></a>";
		xcMonthContainerHTML 			+= xcMonthNames[xcTodayMonth];
		
		xcNewYear						= xcTodayMonth == 11 ? xcTodayYear + 1 : xcTodayYear;
		xcMonthContainerHTML 			+= "<a href=# " + (xcNewYear <= xcMaxYear ? "" : "style='visibility: hidden;'") + " onclick='xcUpdateCalendar(" + xcNewYear + "," + (xcTodayMonth==11 ? 0 : xcTodayMonth+1) + "," + xcTodayDay + "); return false;'><img src='" + xcArrowRightSrc + "' alt='' /></a>";
		$("#" + xcMonthContainer).html(xcMonthContainerHTML);
	}
	
	function xcSetYearContainerHTML (xcTodayYear, xcTodayMonth, xcTodayDay) {
		var xcYearContainerHTML 		= "<a href=# " + (xcTodayYear > xcMinYear ? "" : "style='visibility: hidden;'") + " onclick='xcUpdateCalendar(" + (xcTodayYear-1) + "," + xcTodayMonth + "," + xcTodayDay + "); return false;'><img src='" + xcArrowLeftSrc + "' alt='' /></a>";
		xcYearContainerHTML 			+= xcTodayYear;
		xcYearContainerHTML 			+= "<a href=# " + (xcTodayYear < xcMaxYear ? "" : "style='visibility: hidden;'") + " onclick='xcUpdateCalendar(" + (xcTodayYear+1) + "," + xcTodayMonth + "," + xcTodayDay + "); return false;'><img src='" + xcArrowRightSrc + "' alt='' /></a>";
		$("#" + xcYearContainer).html(xcYearContainerHTML);
	}

	function xcUpdateCalendar(xcYear, xcMonth, xcDay) {
		var xcActivationDate			= new Date();
		xcDay							= xcDay > xcMonthMaxDays[xcMonth] ? xcMonthMaxDays[xcMonth] : xcDay;
		xcActivationDate.setFullYear(xcYear,xcMonth,xcDay);
		xcSetMidnightDate(xcActivationDate);
		xcSetCalendar(xcActivationDate, xcParams, (xcParams[0].getTime() == xcActivationDate.getTime() && globalActivationDate));
	}

	function xcSetMidnightDate(xcDate) {
		xcDate.setHours(0);
		xcDate.setMinutes(0);
		xcDate.setSeconds(0);
		xcDate.setMilliseconds(0)
	}
	
	function xcSetCalendar(xcActivationDate, xcParams, isActivationDate) {
	
		if ( globalActivationDate == null ) {
			globalActivationDate = isActivationDate;
		}
		var xcToday						= xcActivationDate != null ? xcActivationDate : new Date();
		xcSetMidnightDate(xcToday);
		var xcCurrentDate				= new Date();
		xcSetMidnightDate(xcCurrentDate);
		var xcGlobalToday				= new Date();
		xcSetMidnightDate(xcGlobalToday);
		
		
		var xcTodayDayWeek				= xcToday.getDay();		
		var xcTodayDay					= xcToday.getDate();		
		var xcTodayMonth				= xcToday.getMonth();
		var xcTodayYear					= xcToday.getFullYear();

		var xcTodayIsLeap				= ((((xcTodayYear % 4 == 0) && !(xcTodayYear % 100 == 0)) || (xcTodayYear % 400 == 0)) ? true : false);

		xcMonthMaxDays[1] 				= (xcTodayIsLeap ? 29 : 28);
					
		xcSetMonthContainerHTML(xcTodayYear, xcTodayMonth, xcTodayDay);		
		xcSetYearContainerHTML(xcTodayYear, xcTodayMonth, xcTodayDay);

		var xcWeekDaysLineHTML			= "<tr>";
		for ( i in xcDayNames ) {
			xcWeekDaysLineHTML			+= "<td" + (xcWeekEndDays[i] > 0 ? ' class="' + xcStlWeekend + '"' : "") + ">" + xcDayNames[i] + "</td>";
		}
		xcWeekDaysLineHTML				+= "</tr>";
		
		var xcPosition 				= xcTodayDay - (xcTodayDayWeek == 0 ? 7 : xcTodayDayWeek) + 1;
		while(xcPosition > 1) { 
			xcPosition -= 7; 
		}
		
		var xcDaysLinesHTML			= "";
		var xcDayName;
		var xcStlDay;
		var xcNextMonthDay 			= 0;

		var xcPreviousMonth				= (xcTodayMonth == 0 ? 11 : xcTodayMonth - 1);
		var xcPreviousYear				= (xcTodayMonth == 0 ? xcTodayYear - 1 : xcTodayYear);
		var xcNextMonth				= (xcTodayMonth == 11 ? 0 : xcTodayMonth + 1);
		var xcNextYear				= (xcTodayMonth == 11 ? xcTodayYear + 1 : xcTodayYear);
		
		var xcNewsDates				= new Array();
		var xcCounter				= 0;
		
		var xcPrevHalfMonth			= new Date();
		xcPrevHalfMonth.setFullYear(xcPreviousYear, xcPreviousMonth, 15);
		var xcNextHalfMonth			= new Date();
		xcNextHalfMonth.setFullYear(xcNextYear, xcNextMonth, 15);		
		
		for ( i in xcParams ) {
			if ( i > 0 ) {
				if ( xcPrevHalfMonth.getTime() < xcParams[i].getTime() && xcNextHalfMonth.getTime() > xcParams[i].getTime() ) {
					xcNewsDates[xcCounter]		= xcParams[i];
					xcSetMidnightDate(xcNewsDates[xcCounter]);
					xcNewsDates[xcCounter] 		= xcNewsDates[xcCounter].getTime(); 
					xcCounter++;
				}
			}
		}
		
		xcCounter					= 0;
		do {
		
			xcDaysLinesHTML					+= "<tr>";
			
			for ( i in xcDayNames ) {
			
				xcStlDay = (xcWeekEndDays[i] > 0 ? xcStlWeekend : "");
				
				if ( xcPosition < 1 ) {
					xcDayName = xcMonthMaxDays[xcPreviousMonth] + xcPosition;
					xcStlDay += (xcStlDay != "" ? " " + xcStlPrev : xcStlPrev);
					xcCurrentDate.setFullYear(xcPreviousYear,xcPreviousMonth,xcDayName);
					xcDayName = jQuery.inArray(xcCurrentDate.getTime(), xcNewsDates) > -1 ? "<a href=# onclick='xcActivateCalendar(" + xcPreviousYear + "," + xcPreviousMonth + "," + xcDayName + "); return false;'>" + xcDayName + "</a>" : xcDayName;
				} else {

					if ( xcPosition <= xcMonthMaxDays[xcTodayMonth] ) {
						xcDayName = xcPosition;
						xcCurrentDate.setFullYear(xcTodayYear,xcTodayMonth,xcDayName);
					} else {
						xcNextMonthDay++;
						xcDayName = xcNextMonthDay;
						xcCurrentDate.setFullYear(xcNextYear,xcNextMonth,xcDayName);
						xcDayName = jQuery.inArray(xcCurrentDate.getTime(), xcNewsDates) > -1 ? "<a href=# onclick='xcActivateCalendar(" + xcNextYear + "," + xcNextMonth + "," + xcDayName + "); return false;'>" + xcDayName + "</a>" : xcDayName;
					}
					
					if ( isActivationDate && xcToday.getTime() == xcCurrentDate.getTime() ) {
						xcStlDay += (xcStlDay != "" ? " " + xcStlCurrent : xcStlCurrent);
					} else if ( xcNextMonthDay == 0 ) {
						if ( xcGlobalToday >= xcCurrentDate ) {
							xcStlDay += (xcStlDay != "" ? " " + xcStlPast : xcStlPast);
						}
						xcDayName = jQuery.inArray(xcCurrentDate.getTime(), xcNewsDates) > -1 ? "<a href=# onclick='xcActivateCalendar(" + xcTodayYear + "," + xcTodayMonth + "," + xcDayName + "); return false;'>" + xcDayName + "</a>" : xcDayName;
					} else {
						xcStlDay += (xcStlDay != "" ? " " + xcStlPrev : xcStlPrev);
					}
					
				}

				
				xcDaysLinesHTML			+= "<td " + (xcStlDay != "" ? 'class="' + xcStlDay + '"' : "") + ">" + xcDayName + "</td>";
				xcPosition++;
			}			
			xcDaysLinesHTML					+= "</tr>";			
			xcCounter++;
		} while ( xcPosition <= xcMonthMaxDays[xcTodayMonth] );
		
		while ( xcCounter < xcCalcLines ) {
			xcDaysLinesHTML					+= "<tr><td colspan=7></td></tr>";
			xcCounter++;
		}
		
		$("#"+ xcCalTable).html(xcWeekDaysLineHTML + xcDaysLinesHTML);

		$("#" + xcCalTable).find("a").mouseenter(function() {
			$(this).parent().addClass(xcStlCurrent);
		});
		$("#" + xcCalTable).find("a").mouseleave(function() {
			$(this).parent().removeClass(xcStlCurrent);
		});
		
	}
	
	function xcActivateCalendar(xcYear, xcMonth, xcDay) {
		var xcActivationDate			= new Date();
		xcDay							= xcDay > xcMonthMaxDays[xcMonth] ? xcMonthMaxDays[xcMonth] : xcDay;
		xcActivationDate.setFullYear(xcYear,xcMonth,xcDay);
		xcSetCalendar(xcActivationDate, xcParams, true);
		xcActionOnSite(xcActivationDate);
	}
	
	
