/***********************************
	Глобальные переменные:
	chooseYear - name элемента select для выбора года;
	choseMonth - name элемента select для выбора месяца;
	dateChooser - name формы, в которую помещаются элементы chooseYear и choseMonth;
	tableBody - id элемента tbody, в который помещаются числа;
	tableHeader - id элемента th, в который помещается заголовок календаря (выбранные месяц и год);
	calendarTable - id элемента table, в который помещается весь календарь;
	calendar - id элемента div, в который помещается весь календарь;
	field - name поля, в которое записывается выбранное значение даты
	ru - признак русского языка
	year_from - год, с которого начинается отображение
	additional_data_chooser - выпадающий список для альтернативного выбора даты (за последние 24 часа, за последнюю неделю и т.д.)
	from - name поля "дата с"
	to - name поля "дата по"
***********************************/
var chooseYear, chooseMonth, dateChooser, tableBody, tableHeader, calendarTable, calendar, field, ru, year_from, additional_data_chooser, from, to;

// устанавливает значения, которые не меняются в течение работы данной страницы
function setValues(calendar1, calendarTable1, tableHeader1, tableBody1, dateChooser1, chooseMonth1, chooseYear1, ru1, year_from1, additional_data_chooser1, from1, to1){
	calendar = calendar1;
	calendarTable = calendarTable1;
	tableHeader = tableHeader1; 
	tableBody = tableBody1;
	dateChooser = dateChooser1;
	chooseMonth = chooseMonth1;
	chooseYear = chooseYear1;	
	additional_data_chooser = additional_data_chooser1;
	from = from1;
	to = to1;
	if (ru1 && ru1 == "ru"){
		ru = 1;
	}else{
		ru = 0;
	}
	if (year_from1){
		year_from = year_from1;
	}else{
		var today = new Date();
		year_from = today.getFullYear();
	}
	fillYears();
}

/*********************************
	Вспомогательные функции
*********************************/

// день недели первого месяца
function getFirstDay(theYear, theMonth){
	var firstDate = new Date(theYear, theMonth,1);
	return firstDate.getDay();	
}

// число дней в месяце
function getMonthLen(theYear, theMonth){
	var nextMonth = new Date(theYear, theMonth+1, 1);
	nextMonth.setHours(nextMonth.getHours()-3);
	return nextMonth.getDate();
}

function getElementPosition(elemID){
	var offsetTrail = document.getElementById(elemID);
	var offsetLeft = 0;
	var offsetTop = offsetTrail.clientHeight+5;
	while (offsetTrail){
		offsetLeft += offsetTrail.offsetLeft;
		offsetTop +=offsetTrail.offsetTop;
		offsetTrail = offsetTrail.offsetParent;
	}
	if (navigator.userAgent.indexOf("Mac") != -1 && typeof document.body.leftMargin != "undefined"){
		offsetLeft += document.body.leftMargin;
		offsetTop += document.body.topMargin;
	}
	return {left:offsetLeft, top:offsetTop};
}

// позиционирование и отображение календаря
function showCalendar(evt, field){
	evt = (evt) ? evt : event;
	if (evt){
		var elem = (evt.target) ? evt.target : evt.srcElement;
		var position = getElementPosition(elem.id);
		populateTable(dateChooser, field);
		shiftTo(calendar, position.left + elem.offsetWidth, position.top);
		show(calendar);
	}
}

// убираем календарь и устанавливаем дату в текущую
function hideCalendar(){
	hide(calendar);
	var today = new Date();
	setCurrMonth(today);
	setCurrYear(today);
}

/*********************************
	Рисование содержимого календаря
*********************************/
// Очистка и повторное заполнение таблицы на основе выбора в форме
function populateTable(form, field1){
	// запоминаем поле, в которое надо вывести дату
	if (field1){
		field = field1;
	}
	
	hide(calendar);
//	show(calendar);

	var today = new Date();
	//выбираем дату, введенную в поле
	var selDate = SelectedDate(field);
	
	// определяем дату, введенную в форму
	var theMonth = chooseMonth.selectedIndex;
	var theYear = parseInt(chooseYear.options[chooseYear.selectedIndex].text);

	// инициализация зависящих от даты переменных
	var firstDay = getFirstDay(theYear, theMonth);
	if (firstDay == 0 && ru){
		firstDay = 7;
	}
	var howMany = getMonthLen(theYear, theMonth);

	// заполнение заголовка таблицы, содержащего название месяца и год
	document.getElementById(tableHeader).innerHTML = chooseMonth.options[theMonth].text + " " + theYear;

	// инициализация переменных для создания таблицы
	var dayCounter = 1;
	var TBody = document.getElementById(tableBody);

	// очистка существующих строк таблицы
	while (TBody.rows.length > 0){
		TBody.deleteRow(0);
	}

	var newR, newC, dateNum;
	var done = false;
	while(!done){
		// создаем новую строку в конце таблицы
		newR = TBody.insertRow(TBody.rows.length);
		if (newR){
			for(var i=0; i<7; i++){
				// создаем новую ячейку с конце строки
				newC = newR.insertCell(newR.cells.length);
				// если русский язык, то неделя начинается с понедельника и нумерациядней уменьшается на 1
				if (TBody.rows.length == 1 && i<firstDay-ru){
					// до первого дня клетки должны быть пустыми
					newC.innerHTML = "&nbsp;";
					continue;
				}
				if (dayCounter == howMany){
					// после этой строки новых быть не должно
					done = true;
				}
				// помещаем в ячейку число и ссылку (для ячеек после последнего дня - ничего)
				if (dayCounter <= howMany){
					if (today.getFullYear() == theYear && today.getMonth() == theMonth && today.getDate() == dayCounter){
						newC.id = "today";
					}
					if (today.getFullYear() > theYear || (today.getFullYear() == theYear && today.getMonth() > theMonth) || (today.getFullYear() == theYear && today.getMonth() == theMonth && today.getDate() >= dayCounter)){
						newC.innerHTML = "<a href='#' onclick='chooseDate(" + dayCounter + "," + theMonth + "," + theYear + "); return false;'>" + dayCounter + "</a>";
					}else{
						newC.innerHTML = dayCounter;
					}
					if (theYear == selDate.getFullYear() && theMonth == selDate.getMonth() && dayCounter == selDate.getDate()){
						if (newC.id){
							newC.id = "stoday";
						}else{
							newC.id = "selected";
						}
					}
					dayCounter++;
				}else{
					newC.innerHTML = "&nbsp;";
				}
			}
		}else{
			done = true;
		}
	}
}

/**************************************
	Инициализация
**************************************/
// Формирование динамического списка для выбора года
function fillYears(){
	var today = new Date();
	var thisYear = today.getFullYear();
	while (chooseYear.options.length > 0){
		chooseYear.options.remove(0);
	}
	for (i = year_from; i<thisYear + 1; i++){
		chooseYear.options[chooseYear.options.length] = new Option(i,i);
	}
	setCurrMonth(today);
	setCurrYear(today);
}

// делаем текущий месяц выранным
function setCurrMonth(today){
	chooseMonth.selectedIndex = today.getMonth();
}

// делаем текущий год выранным
function setCurrYear(today){
	var yearChooser = chooseYear;
	for (i = 0; i < yearChooser.options.length &&  yearChooser.options[i].text != today.getFullYear(); i++ ){
	}
	yearChooser.selectedIndex = i;
}


/**************************************
	Обработка выбора
**************************************/
function chooseDate(date, month, year, field1){
	if (field1){
		field = field1;
	}
	chooseDateShorten(date, month, year, field);
	hideCalendar();
	changeSelect();
}

function chooseDateShorten(date, month, year, field){
	if (date<10){
		date = "0"+date;
	}
	month = month+1;
	if (month<10){
		month = "0"+month;
	}
	field.value = date+"."+month+"."+year;
}

// выбираем в выпадающем списке элемент, соответствующий выбранным датам (нпр, за последние 24 часа, за последнюю неделю и пр.)
function changeSelect(){
	var today = new Date();
	var theDay = today.getDate();
	var theMonth = today.getMonth();
	var theYear = today.getFullYear();
	to_date = SelectedDate(to);
	additional_data_chooser.selectedIndex = 0;
	if (theYear == to_date.getFullYear() && theMonth == to_date.getMonth() && theDay == to_date.getDate()){
		from_date = SelectedDate(from);
		m_year = theYear - from_date.getFullYear();
		m_month = theMonth - from_date.getMonth();
		m_day = theDay - from_date.getDate();
		var i;
		for (i=0;i<additional_data_chooser.options.length;i++){
			if (additional_data_chooser.options(i) && additional_data_chooser.options(i).value==m_year+"."+m_month+"."+m_day){
				additional_data_chooser.selectedIndex = i;
				break;
			}
		}
	}
}

// возвращает дату в поле field
function SelectedDate(field){
	var str = new String(field.value);
	var ar = str.split(".");
	var d = new Date(ar[2],ar[1]-1,ar[0]);
	return d;	
}

// заполняет поля выбора даты в соответствии с выбранным элементом выпадающего списка
function SetDate(index){
	var today = new Date();
	var day = today.getDate();
	var month = today.getMonth();
	var year = today.getFullYear();
	var selected = new String(additional_data_chooser.options(additional_data_chooser.selectedIndex).value);
	var ar = selected.split(".");
	if (ar.length==3){
		var newDate = new Date(year-ar[0], month - ar[1], day-ar[2]);		
		chooseDateShorten(newDate.getDate(), newDate.getMonth(), newDate.getFullYear(), from);
		chooseDateShorten(day, month, year, to);
	}
}


