//****************************************************************************
// calendar.js (supply with css-file: calendar.css)
//****************************************************************************
//      Author: Roman Konuhov
//    Category: Date/Time
// Description: A GUI control to select date in an HTML form.
//              Has been tested in MSIE7/8, Mozilla 3.5, Opera, NN9, Chrome, Safari
//****************************************************************************
// The lib is FREEWARE. This means you can use it anywhere you want, you can 
// do anything with it. Author is NOT responsible for any consequences of
// using this library. 
// If you don't agree with this, you SHOULD NOT use the lib.
//****************************************************************************
// All improvings, feature requests, bug reports, etc. are gladly accepted.
//****************************************************************************

var Days = ['Пн','Вт','Ср','Чт','Пт','Сб','Вс'];
var Months = ['Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'];
var Years = ['2009','2010','2011','2012','2013','2014','2015'];
var DaysCount = [31,28,31,30,31,30,31,31,30,31,30,31];
var picElem = '';
var formElem = '';

document.write('<div id="calendar" style="display: none"></div>');


// берет данные из формы, на которую ссылается элемент dataField
// инициализирует переменные picElem переменной elem(элемент, нажатие на который привело к вызову этой функции)
// 						   и formElem переменной dataField(элемент, содержащий дату)
// в случае, если элемент dataField пуст или дата, содержащаяся в нем не соответствует принятому в данному скрипте
// формату, берется текущая дата
function Calendar(elem, dataField)
{			
	// реглярное выражение, соответстующее формату даты yyyy-mm-dd hh:mm:ss, где dd = 01-31; mm = 01-12; yyyy = 2000-2029, hh = 00-23, mm = 00-59, ss = 00-59;
	var dtre = new RegExp(/^(20[0-2]{1}[0-9]{1})\-((0?[1-9]{1})|(1[1-2]{1}))\-((0?[1-9]{1})|((1|2)[0-9]{1})|(3[0-1]{1}))\s+(((0|1)?[0-9]{1})|(2[0-3]{1}))\:([0-5]?[0-9]{1})\:([0-5]?[0-9]{1})$/);
	var date = new Date();
	var day = date.getDate();
	var month = date.getMonth();
	var year = date.getFullYear();
	var hour = date.getHours();
	var min = date.getMinutes();
	var sec = date.getSeconds();
	
	var dtstr = dataField.value;
	picElem = elem;
	formElem = dataField;
	
	if (typeof(dtstr) != 'undefined')
	if (dtstr.length)
	{
		dtstr = dtstr.replace(/(\s)+/, '$1');
		if (dtre.test(dtstr)) 
		{
			dtstr = dtstr.split(" ");
			dateArray = dtstr[0].split("-");
			year = dateArray[0];
			month = dateArray[1]-1;
			day = dateArray[2];
			timeArray = dtstr[1].split(":");
			hour = timeArray[0];
			min = timeArray[1];
			sec = timeArray[2];
		}
	}
	//alert(day+'/'+month+'/'+year);
	showCalendar(day, month, year, hour, min, sec);
	return false;
}


// прячет календарь
function hideCalendar()
{
	main = document.getElementById('calendar');
	main.style.display = 'none';
	return false;
}


// изменяет данные в форме, откуда взяты начальные данные
function changeData(day, month, year, hour, min, sec)
{
	formElem.value = year+'-'+(((month)<9)?'0':'')+(month+1)+'-'+(((day)<10)?'0':'')+day+' '+(((hour)<9)?'0':'')+hour+':'+(((min)<9)?'0':'')+min+':'+(((sec)<9)?'0':'')+sec;
	hideCalendar();
	return false;
}


// отображает календарь
function showCalendar(day, month, year, hour, min, sec)
{
	var weeks = new Array();
	for (i=0; i<6;i++) weeks[i] = new Array();
	// число дней в текущем месяце
	var dayInMonth = DaysCount[month] + (((month == 1) && !(year%4)) ? 1:0);
	// счетчик для дней месяца
	var daycnt = 1;
	// первая неделя
	var weekNum = 0;

	// вычисление смещения элемента, на котором был произведен клик мышью,
	// по отношению к левому и верхнему краям страницы(посредством вычисления 
	// смещения родительских элементов)
	var posX = 0;
	var posY = 0;
	for(el=picElem.offsetParent; el!=null; el=el.offsetParent) 
	{
    	posX += el.offsetLeft; 
    	posY += el.offsetTop;
    }	
	main = document.getElementById('calendar');
	main.style.left = posX+picElem.offsetLeft+Math.round(picElem.offsetWidth/2)+'px';
	main.style.top = posY+picElem.offsetTop+Math.round(picElem.offsetHeight/2)+'px';
    main.style.display = '';
	
	for (i=0; i<7; i++)
	{
		var curDate = new Date(year, month, daycnt);
		var curDay = curDate.getDay();
		curDay -= 1;
		if (curDay == -1) curDay = 6;
		if (i == curDay)
		{
			weeks[weekNum][i] = (daycnt);
			daycnt++;
		}
		else
			weeks[weekNum][i] = ('');
	}
	
	while (true)
	{
		weekNum++;
		for (i=0; i<7; i++)
		{
			if (daycnt>dayInMonth)
				weeks[weekNum][i] = '';
			else
				weeks[weekNum][i] = daycnt;
			daycnt++;			 
		}
		if (daycnt>dayInMonth) break;
	}
	
	var out = '';
	out += '<table cellpadding="0" cellspacing="0" border="0" class="calendar_top"><tr><td>';
	out += '<select name="month" class="list_month" onchange="showCalendar('+day+', this.value, '+year+', '+hour+', '+min+', '+sec+')">';
	for (i=0; i<12; i++)
		out += '<option value="'+i+'" '+((i == month)?'selected':'')+'>'+Months[i]+'</option>';
	out += '</select>';
	out += '<select name="year" class="list_year" onchange="showCalendar('+day+', '+month+', this.value, '+hour+', '+min+', '+sec+')">';
	var j = 0;
	for (i=2009; i<2016; i++)
	{
		out += '<option value="'+i+'" '+((i == year)?'selected':'')+'>'+Years[j]+'</option>';
		j++;
	}
	out += '</select>';
	out += '<a href="#" class="close" onclick="return hideCalendar()">X</a>'
	out += '</td></tr></table>';
	
	out += '<table cellpadding="0" cellspacing="1" border="0" class="calendar_bottom"><tr>';
	for (j=0; j<7; j++)
		out += '<td class="'+(((j == 5) || (j == 6))?'sel_cell_day':'cell_day')+'">'+Days[j]+'</td>';
	out += '</tr><tr>';
	for (i=0; i<=weekNum; i++)
	{
		for (j=0; j<7; j++)
			out += '<td class="'+((weeks[i][j] == day)?'sel_cell':'cell')+'"><a href="#" onclick="return changeData('+weeks[i][j]+', '+month+', '+year+', '+hour+', '+min+', '+sec+')">'+weeks[i][j]+'</a></td>';
		out += '</tr>';
	}
	out += '</table>';

//	out = '<div class="calendar">'+out+'</div>';
    main = document.getElementById('calendar');
    main.innerHTML = out;  	
	return false;
}
