function showCalendar(parentId, date)
{
	var element = $(parentId);
	var calendarDiv = $('calendarForm');
	
	calendarDiv.setStyle('opacity', 0);
	calendarDiv.setStyle('display','block');
	calendarDiv.fade('in');
	
	var elCoords = element.getCoordinates();
	// позиционируем календарь относительно родительского элемента
	calendarDiv.setStyle('left', elCoords.left + elCoords.width);
	calendarDiv.setStyle('top',  elCoords.top + elCoords.height+3);
	
	var ajax = new Request.HTML(
	{
			url: '/calendar/show', 
			update: calendarDiv,
			// баг в новой версии мутулза
			isSuccess: function() { return true },
			onRequest: function() { calendarDiv.set('html', 'Загрузка...') }
	}).get({'date': date, 'id': parentId});
}

// возвращает календарь по элементу, находящемуся внутри календаря
function getCalendarByChild(childElement)
{
	// явное преобразование для осла
	var childElement = new Element(childElement);
	
	return childElement.getParent('.calendar');	
}

// id элемента, к-му необходимо вернуть выбранную дату
function getCalendarParentId(calendar)
{
	return calendar.getProperty('parentId');
}

// возвращает объект текущей даты для переданного календаря
// Returns: { day: '<day>', month: '<month>', year: '<year>' }
function getCalendarCurDate(calendar)
{
	return calendar.getProperties('day', 'month', 'year');
}

// обновляет календарь по событию для дочернего элемента handledElement
function refreshCalendar(date, handledElement)
{
	var calendarDiv = $('calendarForm');
	
	var parentId = getCalendarParentId( getCalendarByChild(handledElement) );

	var ajax = new Request.HTML(
	{
		url: '/calendar/show', 
		update: calendarDiv,
		// баг в новой версии мутулза
		isSuccess: function() { return true }
	}).get({'date': date, 'id': parentId});
}

// обработка выбора даты юзером
function returnCalendarDate(date, handledElement)
{
	var parentId = getCalendarParentId( getCalendarByChild(handledElement) );
	// возвращаем дату родителю
	$(parentId).value = date;
	
	hideCalendar();
}

// смена года
function handleYearChange(yearElement, userId)
{
	// устраняем глюки в сафари - непонятное повторное событие onChange
	if(yearElement.disabled)
	{
		return false;
	}
	else
	{
		yearElement.disabled = true;
	}
	
	var curDate = getCalendarCurDate( getCalendarByChild(yearElement) );
	var newDateStr = curDate.day + '.' + curDate.month + '.' + yearElement.value;

	if(userId)
	{
		refreshEventCalendar(newDateStr, userId);
	}
	else
	{	
		refreshCalendar(newDateStr, yearElement);
	}
}

// смена месяца
function handleMonthChange(monthElement, userId)
{
	// устраняем глюки в сафари - непонятное повторное событие onChange
	if(monthElement.disabled)
	{
		return false;
	}
	else
	{
		monthElement.disabled = true;
	}
	
	var curDate = getCalendarCurDate( getCalendarByChild(monthElement) );
	var newDateStr = curDate.day + '.' + monthElement.value + '.' + curDate.year;
	
	if(userId)
	{
		refreshEventCalendar(newDateStr, userId);
	}
	else
	{	
		refreshCalendar(newDateStr, monthElement);
	}
}

function refreshEventCalendar(date, userId)
{
	var calendarDiv = $('eventCalendar');
		
	var ajax = new Request.HTML(
	{
		url: '/calendar/showEvents', 
		update: calendarDiv,
		// баг в новой версии мутулза
		isSuccess: function() { return true }
	}).get({'date': date, 'userId' : userId});	
}


function hideCalendar()
{
	$('calendarForm').fade('out', {onComplete: $('calendarForm').setStyle('display','none')});
}


function showEventWindow(event,date,userId,url)
{
	cWindow = $('eventCalendarWindow');
	cWindow.fade('in');
	
	cWindow.setStyle('display','block');
	var ajax = new Request.HTML(
	{
		url: '/calendar/eventsList', 
		update: cWindow,
		// баг в новой версии мутулза
		isSuccess: function() { return true }
	}).get({'date': date, 'userId' : userId, 'url' : url});	
	
	
	if (!event) event = window.event;
	
	cWindow.style.top = event.clientY+10+getBodyScrollTop()+'px';
	cWindow.style.left = event.clientX-10-cWindow.getStyle('width').toInt()+getBodyScrollLeft()+'px';
}

function hideEventWindow()
{
	cWindow = $('eventCalendarWindow');
	cWindow.innerHTML = '';
	cWindow.fade('out');
}


function getBodyScrollTop()
{
  return self.pageYOffset || (document.documentElement && document.documentElement.scrollTop) || (document.body && document.body.scrollTop);
}

function getBodyScrollLeft()
{
  return self.pageXOffset || (document.documentElement && document.documentElement.scrollLeft) || (document.body && document.body.scrollLeft);
}