///////////////////////////////////////
/// Функции для работы с календарем ///
///////////////////////////////////////

// Отображает или скрывает календарь
function calendar(id_dateObject, id_calContainer, id_grid, id_month, id_year)
{
	if (document.getElementById(id_calContainer).style.display == 'none') 
	{
		document.getElementById(id_calContainer).style.display = 'block';		
		buildCalendar(getFieldDate(id_dateObject), id_dateObject, id_calContainer, id_grid, id_month, id_year);
	}
	else
		document.getElementById(id_calContainer).style.display = 'none';
		
	return (false);
}

// Возвращает из поля типа ДАТА с форматом DD.MM.YYYY месяц и год
function getFieldDate(id_dateObject)
{
	var curDate = new Date();
	var result = new Array(curDate.getDate(), curDate.getMonth() + 1, curDate.getYear());
	if (navigator.appName != "Microsoft Internet Explorer") result[2] = result[2] + 1900;
	// Проверим поле дата. Правильный ли там формат
	if (checkDateField(id_dateObject))
	{
		var dateArr = parseDateField(id_dateObject);
		result = new Array(dateArr[0], dateArr[1], dateArr[2]);
	}
	return result;
}

// Разбивает дату на состовляющие из формата DD.MM.YYYY
function parseDateField(id_dateObject)
{
	var dateString = new String(document.getElementById(id_dateObject).value);
	var dateArr = dateString.split(".");
	
	if (dateArr[0] == '01') dateArr[0] = 1;
	if (dateArr[0] == '02') dateArr[0] = 2;
	if (dateArr[0] == '03') dateArr[0] = 3;
	if (dateArr[0] == '04') dateArr[0] = 4;
	if (dateArr[0] == '05') dateArr[0] = 5;
	if (dateArr[0] == '06') dateArr[0] = 6;
	if (dateArr[0] == '07') dateArr[0] = 7;
	if (dateArr[0] == '08') dateArr[0] = 8;
	if (dateArr[0] == '09') dateArr[0] = 9;	
	
	if (dateArr[1] == '01') dateArr[1] = 1;
	if (dateArr[1] == '02') dateArr[1] = 2;
	if (dateArr[1] == '03') dateArr[1] = 3;
	if (dateArr[1] == '04') dateArr[1] = 4;
	if (dateArr[1] == '05') dateArr[1] = 5;
	if (dateArr[1] == '06') dateArr[1] = 6;
	if (dateArr[1] == '07') dateArr[1] = 7;
	if (dateArr[1] == '08') dateArr[1] = 8;
	if (dateArr[1] == '09') dateArr[1] = 9;	
	
	return dateArr;
}

// Строим календарь
function buildCalendar(data, id_dateObject, id_calContainer, id_grid, id_month, id_year)
{
	// Меняем месяц и год
	document.getElementById(id_month).value = data[1];
	document.getElementById(id_year).value = data[2];
	
	// Получаем массив дней месяца
	var days = prepareDaysOfMonths(data);
	
	// Строим дни месяца
	var html = '<table id="caltab">';
	var i; var y;
	for (i = 0; i < days.length; i++)
	{
		html = html + '<tr>';
		for (y = 0; y < days[i].length; y++)
		{
			if (days[i][y] == 0) html = html + '<td>&nbsp;</td>';
			//else if (days[i][y] == data[0]) html = html + '<td onclick="return returnDateInField(' + days[i][y] + ', '+ data[1] + ', ' + data[2] + ', \'' + id_dateObject + '\');"><a href="">' + days[i][y] + '</b></td>';
			else if (days[i][y] == data[0]) html = html + '<td><b>' + days[i][y] + '</b></td>';
			else html = html + '<td><a href="" onclick="return returnDateInField(' + days[i][y] + ', '+ data[1] + ', ' + data[2] + ', \'' + id_dateObject + '\', \'' + id_calContainer + '\');">' + days[i][y] + '</a></td>';
		}
		html = html + '</tr>';
	}
	var html = html + '</table>';
	document.getElementById(id_grid).innerHTML = html;
}

// готовит массив дней текущего месяца
function prepareDaysOfMonths(data)
{
	// Получаем номер дня недели для 1 числа месяца. Корректируем 
 	// его, чтобы воскресенье соответствовало числу 7, а не числу 0
 	var firstDayOfMonth = new Date(data[2], data[1] - 1, 1);
	var wday = firstDayOfMonth.getDay();
	if (wday == 0) wday = 7;
	// Начинаем с этого числа в месяце (если меньше нуля 
  	// или больше длины месяца, тогда в календаре будет пропуск).
  	var n = - (wday - 2);
  	var cal = new Array();
  	// Цикл по строкам.
  	var y;
	for (y = 0; y < 6; y++) 
	{
		// Будущая строка. Вначале пуста.
    	var row = new Array();
    	var notEmpty = false;
    	// Цикл внутри строки по дням недели.
 		var x;  
		for (x = 0; x < 7; x++)
		{
			// Текущее число >0 и < длины месяца?
      		if (checkDate(data[1], n, data[2]))
			{
   				// да. Заполняем клетку.
   				row.push(n);
  				notEmpty = true;
      		} 
      		else
			{
        		// Нет. Клетка пуста.
        		row.push(0);
			}
			n++;
		}
		// Если в данной строке нет ни одного непустого элемента,
    	// значит, месяц кончился.
    	if (!notEmpty) break;
    	// Добавляем строку в массив.
    	cal.push(row);
	}
	return cal;
}

// Смена месяца иои года
function changeMonthOrYear(id_dateObject, id_calContainer, id_grid, id_month, id_year)
{
	var arr = new Array(1, document.getElementById(id_month).value, document.getElementById(id_year).value);
	buildCalendar(arr, id_dateObject, id_calContainer, id_grid, id_month, id_year);
	returnDateInField(1, document.getElementById(id_month).value, document.getElementById(id_year).value, id_dateObject, id_calContainer, false);
}

// Возвращает дату в поле
function returnDateInField(day, month, year, id_dateObject, id_calContainer, close)
{
	var result = '';
	if (day < 10) result = result + '0' + day + '.'; else result = result = + day + '.';
	if (month < 10) result = result + '0' + month + '.'; else result = result + month + '.';
	result = result + year;
	document.getElementById(id_dateObject).value = result;
	if (close != false)document.getElementById(id_calContainer).style.display = 'none';
	return (false);
}

// Проверяет поле типа ДАТА на соотвествие формату
function checkDateField(id_dateObject)
{
	var dateString = new String(document.getElementById(id_dateObject).value);
	// В дате должно быть 10 символов
	if (dateString.length == 10)
	{
		// Разделим дату на массив через точку
		var dateArr = dateString.split(".");
		// Должны получить три значения в массиве
		if (dateArr.length == 3)
		{
			if (checkDate(dateArr[1], dateArr[0], dateArr[2])) return (true);
		}
	}
	return (false);
}

// Проверяем дату по аналогии с функцией PHP
function checkDate(month, day, year)
{	
	if (day == '01') day = 1;
	if (day == '02') day = 2;
	if (day == '03') day = 3;
	if (day == '04') day = 4;
	if (day == '05') day = 5;
	if (day == '06') day = 6;
	if (day == '07') day = 7;
	if (day == '08') day = 8;
	if (day == '09') day = 9;	
	var day = parseInt(day);
	if (isNaN(day)) return (false);
	
	if (month == '01') month = 1;
	if (month == '02') month = 2;
	if (month == '03') month = 3;
	if (month == '04') month = 4;
	if (month == '05') month = 5;
	if (month == '06') month = 6;
	if (month == '07') month = 7;
	if (month == '08') month = 8;
	if (month == '09') month = 9;
	month = parseInt(month);
	if (isNaN(month)) return (false);
	
	var year = parseInt(year);
	if (isNaN(year)) return (false);
	
	if (year <= 0) return (false);
	
	var yearString = new String(year);
	if (yearString.length != 4) return (false);
	
	// Проверим корректность даты (топорно)
	// Месяц
	if (month < 1 || month > 12) return (false);
	// День 
	if (day < 1 || day > 31) return (false);
	// Теперь по связке день - месяц
	var daysInMonth = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	// Год высокосный тогда, когда он делится на 4 и не делится при этом на 100
	if (year % 4 == 0 && year % 100 != 0) daysInMonth[1] = 29;
	
	if (day > daysInMonth[month - 1]) return (false);
	
	return (true);
}

function checkDates(from_id, to_id)
{
	var from = getFieldDate(from_id);
	var to = getFieldDate(to_id);
	
	var from_date = new Date(from[2], from[1] - 1, from[0]);
	var to_date = new Date(to[2], to[1] - 1, to[0]);
	
	if (from_date.getTime() < to_date.getTime()) return (true);
	
	return (false);
}

function checkDateToday(date_id)
{
	var from = getFieldDate(date_id);
	
	var from_date = new Date(from[2], from[1] - 1, from[0]);
	var to_date = new Date();
	
	if (from_date.getTime() > to_date.getTime()) return (true);
	
	return (false);
}