// Datetime
// © Corelogic (www.corelogic.ru), 2007

// проверка на единственность запуска
if (!datetime_global)
{
	// объект вспомогательных структур
	var datetime_global = new datetime_globalObject();
	// подключение
	var documentLoaded = false;
	datetime();
	main_addEvent(window, 'load', new Function('documentLoaded = true;'));
	main_addEvent(document, 'click', datetime_hideEvent);
}

// конструктор объекта вспомогательных структур
function datetime_globalObject()
{
	this.trgs=[]; // массив указателей на целевые элементы ввода
	this.cdrs=[]; // массив указателей на контейнеры календарей
	this.frms=[]; // массив указателей на формы
	this.version = '1.1.8';
	this.releaseDate = '2008.01.31';
	this.i1 = new Image();
	this.i1.src = project_global.path+'datetime/i/dt_unact_time.gif';
	this.i2 = new Image();
	this.i2.src = project_global.path+'datetime/i/dt_unact_date.gif';
	this.i3 = new Image();
	this.i3.src = project_global.path+'datetime/i/dt_unact_datetime.gif';
	this.i4 = new Image();
	this.i4.src = project_global.path+'datetime/i/dt_previous.gif';
	this.i5 = new Image();
	this.i5.src = project_global.path+'datetime/i/dt_next.gif';
}

// основная функция
function datetime()
{
	datetime_getEls();
	var p_loaded = false;
	try
	{
		if (project_global) {p_loaded=project_global.documentLoaded};
	}
	catch(e){};
	if (!(documentLoaded || p_loaded))
	{
		setTimeout('datetime();', 300);
	};
}

// составление массива целевых элементов
function datetime_getEls()
{
	var els = main_$C('date|datetime|time');
	if (els.length==0) {return false};
	for (var i=0; i<els.length; i++)
	{
		var el = els[i];
		if (el.tagName=='INPUT')
		{
			var noin = true;
			for (var j=0; j<datetime_global.trgs.length; j++)
			{
				if (datetime_global.trgs[j]==el) {noin=false; break};
			}
			if (noin)
			{
				var frm = el.form;
				if (frm)
				{
					var nofrmin = true;
					for (var k=0; k<datetime_global.trgs.length; k++)
					{
						if (datetime_global.trgs[k].form==frm) {nofrmin=false; break};
					};
					if (nofrmin) {main_addEvent(frm, 'submit', new Function("return datetime_formSubmit("+i+");"));};
				}
				datetime_global.trgs[i] = el;
				datetime_getDateTime(i);
				var tmp = document.createElement('DIV');
				datetime_global.cdrs[i] = tmp;
				datetime_draw(i);
				if (el.getAttribute('type').toUpperCase()!='HIDDEN')
				{
					if (/\btime\b/i.test(el.className))
					{
						main_addEvent(el, 'focus', new Function("event", "datetime_hideCdrs(); datetime_getDateTime("+i+"); datetime_icon('hide', "+i+"); setTimeout('datetime_global.trgs["+i+"].select()', 50);"));
						main_addEvent(el, 'blur', new Function("event", "datetime_pasteDate(event, "+i+", true);"));
					}
					else
					{
						main_addEvent(el, 'focus', new Function("event", "datetime_showCdrs("+i+");"));
						main_addEvent(el, 'blur', new Function("event", "datetime_pasteDate(event, "+i+");"));
					};
					main_addEvent(el, 'keydown', new Function("event", "return datetime_pasteDate(event, "+i+")"));
					tmp.style.marginTop = Number(datetime_global.trgs[i].offsetHeight+1)+ 'px';
					tmp.style.position = 'absolute';
					tmp.style.display = 'none';
					datetime_icon('set', i);
				};
				el.parentNode.insertBefore(tmp, el);
			};
		};
	}
}

// отправка форм
function datetime_formSubmit(elidx)
{
	var frm = datetime_global.trgs[elidx].form;
	if (!frm) {return false};
	for (var i=0, imax=datetime_global.trgs.length; i<imax; i++)
	{
		var el = datetime_global.trgs[i];
		if (el.form==frm)
		{
			datetime_serverCorrection(i);
		}
	}
	return true;
}

// правка значения при отправке
function datetime_serverCorrection(elidx)
{
	
	datetime_getDateTime(elidx);
	var el = datetime_global.trgs[elidx];
	var s = el.value;
	var cls = String(el.className);
	if (s!='')
	{
		var new_s = '';
		if (/\b(datetime|date)\b/i.test(cls))
		{
			new_s = s.substr(6,4)+'-'+s.substr(3,2)+'-'+s.substr(0,2);
		};
		if (new_s=='') {new_s = '0000-00-00'};
		if (/\b(datetime|time)\b/i.test(cls) && /\b(\d{2}\:\d{2})\b/i.test(s))
		{
			new_s += ' '+RegExp.$1+':00';
		}
		else {new_s += ' 00:00:00'};
		el.value = new_s;
	};
}

// манипуляции с иконкой
function datetime_icon(command, elidx)
{
	if (command=='hide')
	{
		var el = datetime_global.trgs[elidx];
		if (/\btime\b/i.test(el.className))
		{el.style.backgroundImage = 'url('+project_global.path+'datetime/i/dt_unact_time.gif)';}
		else if (/\bdate\b/i.test(el.className))
		{el.style.backgroundImage = 'url('+project_global.path+'datetime/i/dt_unact_date.gif)';}
		else
		{el.style.backgroundImage = 'url('+project_global.path+'datetime/i/dt_unact_datetime.gif)';}
	}
	else
	{
		for (var i=0, imax=datetime_global.cdrs.length; i<imax; i++)
		{
			if (datetime_global.cdrs[i].style.display.toUpperCase()=='NONE')
			{
				var el = datetime_global.trgs[i];
				with (el.style)
				{
					backgroundPosition = 'right center';
					backgroundRepeat = 'no-repeat';
				}
				if (/\btime\b/i.test(el.className))
				{el.style.backgroundImage = 'url('+project_global.path+'datetime/i/dt_act_time.gif)';}
				else if (/\bdate\b/i.test(el.className))
				{el.style.backgroundImage = 'url('+project_global.path+'datetime/i/dt_act_date.gif)';}
				else
				{el.style.backgroundImage = 'url('+project_global.path+'datetime/i/dt_act_datetime.gif)';}
			}
		}
	};
}

// вставка даты вручную
function datetime_pasteDate(evt, elidx, istimeel)
{
	var evt = evt || window.event;
	if (evt.type!='blur' && evt.type!='keydown') {return true};
	if (evt.type=='keydown' && (evt.keyCode!=13 && evt.keyCode!=9)) {return true};
	var el = window.event ? evt.srcElement : evt.target;
	datetime_getDateTime(elidx);
	if (evt.type=='keydown')
	{
		datetime_draw(elidx, el.value);
		if (evt.keyCode==13)
		{
			
			try {evt.preventDefault();} catch(e){};
			return false;
		}
		else if (evt.keyCode==9)
		{
			datetime_hideCdrs();
		};
	}
	else if (istimeel && evt.type=='blur')
	{
		with (el.style)
		{
			backgroundPosition = 'right center';
			backgroundRepeat = 'no-repeat';
			backgroundImage = 'url('+project_global.path+'datetime/i/dt_act_time.gif)';
		}
		
	};
}

// правка в принятый формат
function datetime_getDateTime(elidx)
{
	var el = datetime_global.trgs[elidx];
	var s = String(el.value);
	if (s.replace(/(\D|0)/gi, '')=='') {s=''};
	var mnts = ['янв', 'фев', 'мар', 'апр', 'май', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'];
	for (var i=0, imax=mnts.length; i<imax; i++)
	{
		var reg = new RegExp(mnts[i], 'i');
		s = s.replace(reg, i+1);
	};
	s = s.replace(/\D/g, ' ');
	s = datetime_corZero(s);
	var new_s = '';
	if (/\b(datetime|date)\b/i.test(el.className))
	{
		var y='', m='', d='';
		if (/^(\d{4}) (\d{2}) (\d{2})/.test(s))
		{
			y = RegExp.$1;
			m = RegExp.$2;
			d = RegExp.$3;
		}
		else if (/^(\d{2}) (\d{2}) (\d{4})/.test(s))
		{
			y = RegExp.$3;
			m = RegExp.$2;
			d = RegExp.$1;
		};
		if (y!='')
		{
			// доп. классы элемента
			var beforenow = false;
			var afternow = false;
			if (/\bbeforenow\b/i.test(el.className)) {beforenow = true}
			else if (/\bafternow\b/i.test(el.className)) {afternow = true};
			// выставляем дату
			var dat = datetime_str2date(d+'.'+m+'.'+y);
			if (beforenow)
			{
				var nowDate = datetime_getNow(elidx);
				if (Number(dat)>Number(nowDate))
				{dat=nowDate};
			}
			else if (afternow)
			{
				var nowDate = datetime_getNow(elidx);
				if (Number(dat)<Number(nowDate))
				{dat=nowDate};
			};
			new_s = dat.getDate()+'.'+Number(dat.getMonth()+1)+'.'+dat.getFullYear();
		};
		
	};
	if (/\b(datetime|time)\b/i.test(el.className))
	{
		if (new_s!='') {new_s+=', '};
		var tempDate = new Date;
		var hh=tempDate.getHours(), mm=tempDate.getMinutes();
		if (/\bdatetime\b/i.test(el.className) && /(?:\d{2,4}) (?:\d{2}) (?:\d{2,4}) (\d{2}) (\d{2})/.test(s))
		{
			hh = Number(RegExp.$1);
			mm = Number(RegExp.$2);
		}
		else if (/\btime\b/i.test(el.className) && /(\d{2}) (\d{2})/.test(s))
		{
			hh = Number(RegExp.$1);
			mm = Number(RegExp.$2);
		};
		if(hh>24) {hh=24};
		if(mm>60) {mm=60};
		if (hh==24 && mm>0) {hh=23};
		if (new_s!='' || /\btime\b/i.test(el.className))
		{new_s+=String(hh)+':'+String(mm)}
	}
	el.value = datetime_corZero(new_s);
}

// прорисовка календаря
function datetime_draw(elidx, drawdatestr)
{
	var el = datetime_global.trgs[elidx];
	// доп. классы элемента
	var beforenow = false;
	var afternow = false;
	if (/\bbeforenow\b/i.test(el.className)) {beforenow = true}
	else if (/\bafternow\b/i.test(el.className)) {afternow = true};
	// текущая дата
	var nowDate = datetime_getNow(elidx);
	// установленная дата
	datetime_getDateTime(elidx);
	var str = el.value;
	var thisDate = datetime_str2date(str, elidx);
	// прорисовываемая дата
	str = drawdatestr || str;
	var drawDate = datetime_str2date(str, elidx);
	drawDate.setDate(1);
	// строковые массивы
	var datetimeNames = new Object;
	datetimeNames.month = ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'];
	datetimeNames.weekday = ['Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб', 'Вс'];
	// управление прокруткой лет
	str = '<table style="width: auto; cursor: default; background-color: White;" class="bordered datetimebar"><tr><td style="padding: 5px; text-align: center; background-color: White;"><table class="padded"><tr><td style="vertical-align: middle; background-color: White;"><img class="activated" width="15" height="15" style="cursor: pointer;" onclick="datetime_draw('+elidx+', \'1.'+Number(drawDate.getMonth()+1)+'.'+Number(drawDate.getFullYear()-1)+'\');" alt="Перейти к предыдущему году" src='+project_global.path+'datetime/i/dt_previous.gif /></td>';
	str += '<td style="text-align: center; background-color: White;"><input type="text" class="edit" style="width: 80px; text-align: center;" value="'+String(drawDate.getFullYear())+'" onBlur="datetime_draw('+elidx+', \'1.'+Number(drawDate.getMonth()+1)+'.\'+this.value.replace(/\\D/g, \'\'));" onKeyDown="if (event.keyCode==13) {datetime_draw('+elidx+', \'1.'+Number(drawDate.getMonth()+1)+'.\'+this.value.replace(/\\D/g, \'\'));}" /></td>';
	str += '<td style="vertical-align: middle; background-color: White;"><img class="activated" width="15" height="15" style="cursor: pointer;" onclick="datetime_draw('+elidx+', \'1.'+Number(drawDate.getMonth()+1)+'.'+Number(drawDate.getFullYear()+1)+'\');" alt="Перейти к следующему году" src='+project_global.path+'datetime/i/dt_next.gif /></td></tr></table>';
	// управление прокруткой месяцев
	str += '<table class="padded"><tr><td style="vertical-align: middle; background-color: White;"><img class="activated" width="15" height="15" style="cursor: pointer;" onclick="datetime_draw('+elidx+', \'1.'+drawDate.getMonth()+'.'+drawDate.getFullYear()+'\');" alt="Перейти к предыдущему месяцу" src='+project_global.path+'datetime/i/dt_previous.gif /></td>';
	str += '<td style="text-align: center; background-color: White;"><select onchange="datetime_draw('+elidx+', \'1.\'+Number(this.selectedIndex+1)+\'.'+drawDate.getFullYear()+'\');" class="edit" style="width: 80px;">';
	for (var i=0; i<datetimeNames.month.length; i++)
	{
		str += '<option';
		if (i==drawDate.getMonth()) {str+=' selected="selected"'};
		str += '>'+datetimeNames.month[i]+'</option>';
	};
	str += '</select></td>';
	str += '<td style="vertical-align: middle; background-color: White;"><img class="activated" width="15" height="15" style="cursor: pointer;" onclick="datetime_draw('+elidx+', \'1.'+Number(drawDate.getMonth()+2)+'.'+drawDate.getFullYear()+'\');" alt="Перейти к следующему месяцу" src='+project_global.path+'datetime/i/dt_next.gif /></td></tr></table>';
	// начинаем таблицу месяца
	str += '<table class="padded"><tr>';
	for (var i = 0; i < datetimeNames.weekday.length; i++)
	{
		str += '<td style="text-align: center; padding: 2px; background-color: White;">' + datetimeNames.weekday[i] + '<\/td>';
	}
	str += '<\/tr><tr>';
	// рисуем начальные пустые ячейки
	var daysToStart = (drawDate.getDay() == 0)? 7 : drawDate.getDay();
	for (var i = 0; i < daysToStart-1; i++) str += '<td style="background-color: White;"><br /><\/td>';
	// собственно циферки
	var m = drawDate.getMonth();
	for (var i = 1; i < 33; i++)
	{
		drawDate.setDate(i);
		if (m !=drawDate.getMonth()) break;
		var tdclass = '';
		var clickev = '';
		var dopstyle='';
		if ((beforenow && (Number(drawDate)>Number(nowDate))) || (afternow && (Number(drawDate)<Number(nowDate))))
		{dopstyle = 'color: Silver;';}
		else
		{
			clickev = 'var el=datetime_global.trgs['+elidx+']; el.value=el.value.replace(/^[^,]+/, \'\'); el.value=datetime_corZero(\''+i+'.'+Number(drawDate.getMonth()+1)+'.'+drawDate.getFullYear()+'\')+el.value;  datetime_getDateTime('+elidx+'); ';
			if (el.getAttribute('type').toUpperCase()=='HIDDEN') {clickev += 'datetime_draw('+elidx+');'};
			clickev += 'datetime_hideCdrs();';
			dopstyle = 'cursor: pointer;';
		};
		
		if (i==thisDate.getDate() && drawDate.getMonth()==thisDate.getMonth() && drawDate.getFullYear()==thisDate.getFullYear())
		{tdclass = ' class="activated" ';}
		else if (drawDate.getDay()==0) {tdclass = ' class="selected" '}
		else { dopstyle+=' background-color: White;'};
		str += '<td onclick="'+clickev+'" style="'+dopstyle+' text-align: center;"'+tdclass+'>'+i+'</td>';
		if (drawDate.getDay() == 0) str += '</tr>';
	}
	// рисуем оконечные пустые ячейки
	if (drawDate.getDay() != 1)
	{
		var daysToEnd = 8 - ((drawDate.getDay() == 0)? 7 : drawDate.getDay());
		for (var i = 0; i < daysToEnd; i++) str += '<td style="background-color: White;"><br /><\/td>';
	}
	// кнопка "сегодня"
	str += '<\/tr><\/table><input type="button" class="button" style="margin-top: 3px;" onclick="datetime_global.trgs['+elidx+'].value=datetime_corZero(\''+nowDate.getDate()+'.'+Number(nowDate.getMonth()+1)+'.'+nowDate.getFullYear()+'\'); datetime_draw('+elidx+', datetime_global.trgs['+elidx+'].value); datetime_hideCdrs();" value="Сегодня" /></td></tr></table>';
	datetime_global.cdrs[elidx].innerHTML = str;
}

// получение текущей даты
function datetime_getNow(elidx)
{
	var el = datetime_global.trgs[elidx];
	var thisDate = new Date();
	var nowval = el.getAttribute('now');
	if (nowval && nowval!='')
	{
		try
		{
			nowval = nowval.replace(/\D/g, ' ').replace(/ /g, ', ');
			if (/^\d{4}\, \d(\d)/.test(nowval))
			{
				var mm = String(Number(RegExp.$1)-1);
				nowval = nowval.replace(/(^\d{4}\, \d)(\d)/, '$1'+mm);
				thisDate = eval("new Date("+nowval+")")
			}
		}
		catch(e) {};
	};
	if (isNaN(thisDate)) {thisDate = new Date()};
	return thisDate;
}

// обработка события скрытия
function datetime_hideEvent(evt)
{
	var allhide = true;
	for (var i=0; i<datetime_global.cdrs.length; i++)
	{
		if (datetime_global.trgs[i].getAttribute('type').toUpperCase()!='HIDDEN' && datetime_global.cdrs[i].style.display.toUpperCase()=='BLOCK')
		{allhide = false; break};
	};
	if (!allhide)
	{
		if (window.event)
		{var el = window.event.srcElement}
		else {var el = evt.target};
		if (el)
		{
			var noinel = true;
			do
			{
				if (el && el.className && el.className.search(/(?:^| )(?:datetimebar|datetime|date|time)(?:$| )/i)!=-1)
				{noinel = false; break};
				el = el.parentNode;
			}
			while (el && el.tagName && el.tagName.toUpperCase()!='BODY')
			if (noinel)
			{datetime_hideCdrs();}
		};
	};
}

// показываем всплывающий календарь
function datetime_showCdrs(elidx)
{
	datetime_hideCdrs();
	datetime_draw(elidx);
	var el = datetime_global.cdrs[elidx];
	var trg = datetime_global.trgs[elidx];
	if (trg)
	{
		el.style.left = main_getElementLeft(trg);
		el.style.top = main_getElementTop(trg);
		el.style.marginTop = Number(trg.offsetHeight+1)+ 'px';
	}
	el.style.display = 'block';
	datetime_icon('hide', elidx); 
	setTimeout('datetime_global.trgs['+elidx+'].select()', 50);
}

// скрываем всплывающие календари
function datetime_hideCdrs()
{
	for (var i=0; i<datetime_global.trgs.length; i++)
	{
		if (datetime_global.trgs[i].getAttribute('type').toUpperCase()!='HIDDEN')
		{datetime_global.cdrs[i].style.display='none'};
	};
	datetime_icon('set');
}

// трансформация строки в дату
function datetime_str2date(strDate, elidx)
{
	var tempDate = new Date;
	if (elidx) {tempDate = datetime_getNow(elidx)};
	var tempDate2 = new Date;
	if (elidx) {tempDate2 = datetime_getNow(elidx)};
	if (strDate.replace(/(\D|0)/gi, '')=='') {strDate=''};
	if (strDate!='')
	{
		tempDate.setDate(1);
		strDate.search(/\.(\d*)\./);
		var m = Number(RegExp.$1);
		if (m==0)
		{	
			strDate.search(/\.(\d*)(?:$|\,| )/);
			tempDate.setFullYear(Number(RegExp.$1)-1);
			tempDate.setMonth(11);
		}
		else if (m==13)
		{
			strDate.search(/\.(\d*)(?:$|\,| )/);
			tempDate.setFullYear(Number(RegExp.$1)+1);
			tempDate.setMonth(0);
		}
		else
		{
			strDate.search(/\.(\d*)(?:$|\,| )/);
			tempDate.setFullYear(RegExp.$1);
			tempDate.setMonth(m-1);
		};
		strDate.search(/^(\d*)\./);
		tempDate.setDate(RegExp.$1);
	};
	if (isNaN(tempDate)) {tempDate=tempDate2}
	return tempDate;
}

// корректировка нулей
function datetime_corZero(strDate)
{
	strDate = strDate.replace(/ +/g, ' ');
	strDate = strDate.replace(/(^| |\.|\:)(\d)($| |\.|\:)/g, '$10$2$3');
	strDate = strDate.replace(/(^| |\.|\:)(\d)($| |\.|\:)/g, '$10$2$3');
	return strDate.replace(/(^ | $)/g, '');
}