var calendarCaption = 'Календарь';
var calendarPrevButton = 'назад';
var calendarNextButton = 'вперед';
var calendarCloseButton = 'закрыть';
var calendarMonthNames = ['январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь'];
var calendarDayNames = ['пн', 'вт', 'ср', 'чт', 'пт', 'сб', 'вс'];

Date.prototype.addMonth = function(sign) { var month = this.getMonth() + sign + 12; var year = this.getFullYear() + (month / 12) - 1; return new Date(year, month % 12, 1); };

function ShowCalendar(link)
{
    if (!link.calendarInput)
		link.calendarInput = link.parentNode.getElementsByTagName('INPUT')[0];

	if (!link.calendarInput.selectedDate)
	{
		link.calendarInput.selectedDate = new Date();
		
		var value = link.calendarInput.value;
		if(value)
		{
			var parsedDate = Date.parseLocale(value, 'd');
			if(parsedDate)
				link.calendarInput.selectedDate = parsedDate;
		}	
	}
	
	if (link.calendarInput.calendar)
	{
		link.calendarInput.calendar.style.display = 'block';
	}
	else
	{
		var createSpan = function(className) { var span = document.createElement('SPAN'); span.className = className; span.innerHTML = '&nbsp;'; return span; };
		var createLabel = function(tagName, html) { var tag = document.createElement(tagName); tag.innerHTML = html; return tag; };
		var createButton = function(className, html, handler) { var link = document.createElement('A'); link.className = className; link.href = '#'; link.onclick = handler; link.innerHTML = html; return link; }
		var createContainer = function(className, children) { var div = document.createElement('DIV'); div.className = className; for (var i = 0; i < children.length; i++) div.appendChild(children[i]); return div; };
		
		var headRow = document.createElement('TR');
		
		for (var i = 0; i < calendarDayNames.length; i++)
			headRow.appendChild(createLabel('TD', calendarDayNames[i]));
		
		var head = document.createElement('THEAD');
		head.appendChild(headRow);
		
		var body = document.createElement('TBODY');
		
		var table = document.createElement('TABLE');
		table.appendChild(head);
		table.appendChild(body);
		
		var monthLabel = createLabel('STRONG', '');
		var prevButton = createButton('prev', calendarPrevButton, function() { link.calendarInput.changeMonth(monthLabel.date.addMonth(-1)); return false; });
		var nextButton = createButton('next', calendarNextButton, function() { link.calendarInput.changeMonth(monthLabel.date.addMonth(1)); return false; });
		var monthPart = createContainer('month', [prevButton, nextButton, monthLabel]);
		var daysPart = createContainer('calendar', [table]);
		
		var calendarPart = createContainer('calendar-hold', [monthPart, daysPart]);
		var centerPart = createContainer('popup-hold', [createLabel('H3', calendarCaption), calendarPart]);
		
		var topPart = createContainer('top', [createSpan('right'), createSpan('left'), createSpan('bg')]);
		var contentPart = createContainer('block-area', [createSpan('left-shadow'), createSpan('right-shadow'), centerPart]);
		var bottomPart = createContainer('bottom', [createSpan('right'), createSpan('left'), createSpan('bg')]);
		var closeButton = createButton('close', calendarCloseButton, function() { container.style.display = 'none'; return false; });
		
		var container = createContainer('popup calendar_popup', [topPart, contentPart, bottomPart, closeButton]);
		
		link.parentNode.appendChild(container);
		link.calendarInput.calendar = container;
		
		link.calendarInput.changeMonth =
			function(date)
			{
				var temp = new Date(date.getFullYear(), date.getMonth(), 1);
				var start = (temp.getDay() + 6) % 7; // Monday becomes 0, Sunday - 6
				
				temp.setMonth(temp.getMonth() + 1);
				temp.setDate(0);
				
				var count = temp.getDate();
				var select = (date.getFullYear() == link.calendarInput.selectedDate.getFullYear()) && (date.getMonth() == link.calendarInput.selectedDate.getMonth());
				
				for (var i = body.rows.length - 1; i >= 0; i--)
					body.removeChild(body.rows[i]);
				
				monthLabel.date = date;
				monthLabel.innerHTML = calendarMonthNames[date.getMonth()] + ' ' + date.getFullYear();
				
				for (var r = 0; r < Math.floor((start + count - 1) / 7) + 1; r++)
				{
					var row = document.createElement('TR');
					
					for (var c = 1; c <= 7; c++)
					{
						var cell = document.createElement('TD');
						var i = r * 7 + c - start;
						
						if ((i >= 1) && (i <= count))
							cell.appendChild(createButton(select && (i == link.calendarInput.selectedDate.getDate()) ? 'active' : '', i, function() { link.calendarInput.selectedDate = new Date(date.getFullYear(), date.getMonth(), parseInt(this.innerHTML)); link.calendarInput.value = link.calendarInput.selectedDate.localeFormat('d'); container.style.display = 'none'; return false; }));
						
						row.appendChild(cell);
					}
					
					body.appendChild(row);
				}
			}
	}
	link.calendarInput.changeMonth(link.calendarInput.selectedDate);
}

