function body_onresize()
{}


	// Корректирует формат даты из гггг-мм-дд в дд.мм.гггг.
	function correctDate(inDate)
	{
		inDate = inDate.substr(0, 10).split('-');
		return inDate[2] + '.' + inDate[1] + '.' + inDate[0].substr(2,2);;
	}

	// Тянущиеся вкладки. Для работы требуют таблицу, в которой ячейки имеют id = <prefix>0, <prefix>1, <prefix>2 и набор картинок(3 штуки)
	// для активного и неактивного табов.
	// contId - id таблицы со вкладками. Количество ячеек для табов должно быть нечетным и больше 1.
	// rcIndex - индекс строки или столбца(isVertical), в которых будут расположены табы.
	// isVertical - вертикальные ли табы.
	// images - массив с картинками (акт. лево, акт. центр, акт. право, пас. лево, пас. центр, пас. право).
	function CStretchedTabs(contId, rcIndex, isVertical, images)
	{
		this.name = this.name = ('T' + Date() + Math.random()).replace(/\W/g, '');
		eval(this.name + '=this');
			
		var cont = document.getElementById(contId);
		var rcIndex = rcIndex;
		var isVertical = isVertical;
		var images = images;
		var items = Array();
		
		this.lastTabInd = 0; // Последняя активная вкладка.
		this.onSelect = function(info) {}; // Вызывается при переключении таба.
		this.pageItems = Array(); // Масси контролов, содержащих тело таба. (Скрываются и отображаются).
		
		
		// Сбор узлов для размещения вкладок.
		var trs = cont.getElementsByTagName('TR');
		if (!isVertical)
		{
			var tds = trs[rcIndex].getElementsByTagName('TD');
			var num = tds.length;
			for (var i = 0; i < num; i++)
				items.push(tds[i]);
		}		
		else
		{
			var num = trs.length;
			for (var i = 0; i < num; i++)
				items.push(trs[i].getElementsByTagName('TD')[rcIndex]);
		}
		
		// Методы класса.
		
		// Устанавливает состояние вкладки (true - активна, false - пассивна).
		this.setTabState = function(index, active)
		{
			var ti = index*2 + 1;
			var tab_l = items[ti - 1];
			var tab_m = items[ti];
			var tab_r = items[ti + 1];

			if (active)
			{
				if (ti > 1)	tab_l.style.background = 'url(' + images[5] + ')';
				tab_l.src = images[0];
				
				if (ti < (items.length - 2)) tab_r.style.background = 'url(' + images[3] + ')';
				tab_r.src = images[2];
			}
			else
			{
				if (ti > 1)
				{
					tab_l.src = images[5];
					tab_l.style.background = 'url(' + images[3] + ')';
				}
				else tab_l.src = images[3];
			
				if (ti < (items.length - 2))
				{
					tab_r.src = images[5];
					tab_r.style.background = 'url(' + images[3] + ')';
				}
				else tab_r.src = images[5];
			}
			
			tab_m.style.backgroundImage = 'url(' + (active ? images[1] : images[4]) + ')';
			tab_m.style.cursor = active ? 'default' : 'pointer';

			// Лекарство от уезжания фона.
			if (body_onresize) setTimeout(body_onresize, 10);
		}
		
		// Подготовить вкладки. Добавить картинки установить размер ячеек.
		this.prepareTabs = function()
		{
			var num = (items.length - 1) / 2;
			
			// Вставка промежуточных картинок.
			for(var i = 0; i <= num; i++)
			{
				var img = document.createElement('IMG');
				img.src = (i == 0) ? images[3] : images[5];
				items[i * 2].appendChild(img);
				items[i * 2].width = '1px';//img.width;
				items[i * 2].height = '1px';//img.height;
				items[i * 2] = img;
				
				if (i < num)
				{
					if (i > 0) items[i * 2].style.backgroundImage = 'url(' + images[3] + ')';
					items[i * 2  + 1].style.backgroundImage = 'url(' + images[4] + ')';
					items[i * 2  + 1].style.cursor = 'pointer';

					var func;
					eval('func = function() {' + this.name + '.selectTab(' + i + ')}');
					items[i * 2  + 1].onclick = func;
				}
			}
		}
		
		// Включить или выключить поддержание одинакового размера вкладок.
		this.setSameSize = function(enabled)
		{
			var num = (items.length - 1) / 2;
			
			for(var i = 0; i < num; i++)
			{
				if (isVertical) items[i * 2 + 1].height = (enabled != false) ? (100 / num + '%') : '';
				else items[i * 2 + 1].width = (enabled != false) ? (100 / num + '%') : '';				
			}
		}
		
		// Private. Получить информацию по табу. Используется для вызова пользовательской функции.
		this.tabInfo  = function(index, active)
		{
			return {
				'index' : index,
				'active' : active,
				'l': items[index * 2],
				'm': items[index * 2 + 1],
				'r': items[index * 2 + 2]}
		}
		
		// Выбор таба с индексом index.
		this.selectTab = function(index)
		{
			// Возвращаем вкладку в неактивное состояние.
			if (this.lastTabInd > -1)
			{
				this.setTabState(this.lastTabInd, false);
				// Вызов пользовательской функции.
				if (this.onSelect) this.onSelect(this.tabInfo(this.lastTabInd, false));
				// Скрытие тела таба.
				if (this.pageItems[this.lastTabInd] != null) this.pageItems[this.lastTabInd].hide();
			}			
			
			this.setTabState(index, true);
			// Вызов пользовательской функции.
			if (this.onSelect) this.onSelect(this.tabInfo(index, true));
			// Отображение тела таба.
			if (this.pageItems[index] != null) this.pageItems[index].show();

			this.lastTabInd = index;		
		}
		
		// Указать контейнер страницы. index - массив индексов табов, bodyItem - массив ссылок на элемент или id элементов.
		// Система работает с использованием jQuery, поэтому формат id как в нем (с символом #).
		this.setPageItems = function(indexes, bodyItems)
		{
			var num = indexes.length;
			for (var i = 0; i < num; i++)
			{
				if (typeof(bodyItems[i]) == 'string')
					if (bodyItems[i].indexOf('#') < 0) bodyItems[i] = '#' + bodyItems[i];
				this.pageItems[indexes[i]] = jQuery(bodyItems[i]);
			}
		}
		
		this.prepareTabs();
		this.setSameSize();
	}

	// Разворачивание сворачивание дерева.
	function swap(obj)
	{
		if (obj.nextSibling.style.display == 'none')
		{
			obj.nextSibling.style.display = 'block';
			obj.parentNode.childNodes[0].src='assets/images/minus.png';
		}
		else
		{
			obj.nextSibling.style.display = 'none';
			obj.parentNode.childNodes[0].src='assets/images/plus.png';
		}
	}

	function onLoad()
	{
		showFlatCalendar();
	}

	// mask: %d - date, %t - time. default '%d %t'.
	function mysqlDate(date, mask)	
	{
		if (mask == null) mask = '%d %t';
		var d = date.getFullYear() + '-';

		d += ((date.getMonth() < 9) ? '0' : '') + (date.getMonth() + 1) + '-';
		d += ((date.getDate() < 10) ? '0' : '') + date.getDate();
		
		var t = date.toTimeString().substr(0, 8);
		
		return mask.replace('%d', d).replace('%t', t);
	}

	// mask: %d - date, %t - time. default '%d %t'.
	function stdDate(date, mask)	
	{
		if (mask == null) mask = '%d %t';
		var d = ((date.getDate() < 10) ? '0' : '') + date.getDate() + '.';

		d += ((date.getMonth() < 9) ? '0' : '') + (date.getMonth() + 1) + '.';
		d += date.getFullYear();
		
		var t = date.toTimeString().substr(0, 8);
		
		return mask.replace('%d', d).replace('%t', t);
	}
