﻿// путь к картинкам
var imagesFolder = '';

// имена месяцев и т.п.
var calendarNamesHash = new Array();

calendarNamesHash.ru = new Array();
calendarNamesHash.en = new Array();

calendarNamesHash.ru.month = ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'];
calendarNamesHash.ru.monthShort = ['сiч', 'лют', 'бер', 'квiт', 'трав', 'чер', 'лип', 'серп', 'вер', 'жов', 'лист', 'груд'];
calendarNamesHash.ru.weekday = ['Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб', 'Вс'];
calendarNamesHash.ru.today= 'сегодня';
calendarNamesHash.en.month = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
calendarNamesHash.en.monthShort = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
calendarNamesHash.en.weekday = ['M', 'T', 'W', 'T', 'F', 'S', 'S'];
calendarNamesHash.en.today= 'today';

var calendarNames = calendarNamesHash[ tasksLanguage == 'en' ? 'en':'ru'];

// функция инициализации

function calendar(name,value,options) {
writeInFields(name,value,options);
updateCalendar(name);
}

// служебные функции

function zeroFill(value){
return (value<10 ? '0':'')+value;
}

function date2string(date){
return date.getDate() + ' ' + calendarNames.monthShort[date.getMonth()] + ' ' + date.getFullYear();
}

function date2value(date){
return date.getFullYear()+'-'+zeroFill(date.getMonth()+1)+'-'+zeroFill(date.getDate())+' '+ 
      zeroFill(date.getHours())+':'+zeroFill(date.getMinutes())+':00';
}

function value2date(value){
if (value && value != '0000-00-00 00:00:00'){
        var re = /(\d+)-(\d+)-(\d+)\s+(\d+):(\d+):(\d+)/i;
var date = re.exec(value);
if (date) return(new Date(date[1],date[2]-1,date[3],date[4],date[5],date[6]));
}
        return null;
}

// интерфейсные функции

function updateCalendar(name){
var date = getCalendarDateUnchecked(name);

var dateInput = document.getElementsByName(name + 'Input')[0];
var hoursInput = document.getElementsByName(name + 'Hours')[0];
var minutesInput = document.getElementsByName(name + 'Minutes')[0];

if (dateInput) dateInput.value = date ? date2string(date) : '-';
if (hoursInput) hoursInput.value = date ? date.getHours() : '-';
if (minutesInput) minutesInput.value = date ? zeroFill(date.getMinutes()) : '-';
}

function getCalendarDateUnchecked(name) {
var hiddenValue = document.getElementsByName(name)[0];
return hiddenValue ? value2date(hiddenValue.value) : null;
}

function getCalendarDate(name) {
        var date=getCalendarDateUnchecked(name);
return date ? date : new Date();
}

function putCalendarDate(name, date) {
var hiddenValue = document.getElementsByName(name)[0];
if (hiddenValue){ 
hiddenValue.value = date2value(date);
updateCalendar(name);
}
}

function putCalendarValue(name,value){
var hiddenValue = document.getElementsByName(name)[0];
if (hiddenValue){
hiddenValue.value = value;
updateCalendar(name);
}
}

function calendarCallback(name, date, mode){
}

function changeCalendarDate(name, date, mode){
var current=getCalendarDate(name);

putCalendarDate(name,date);

if (date2value(date) != date2value(current)){
calendarCallback(name, date, mode);
}
}

//
//  служебные функции, вычисления, HTML и т.д.
//

var closeCalendarTimeOut = 0;

// все-таки придется где-нибудь хранить какой именно календарик открыть (его имя)
var activeCalendarName = '';

// функция вызывается при клике на дату в календаре

function setDateFromCalendar(dayToSet, monthToSet, yearToSet) {
var dateToSet = getCalendarDate(activeCalendarName);
dateToSet.setFullYear(yearToSet);
dateToSet.setDate(1);
dateToSet.setMonth(monthToSet);
dateToSet.setDate(dayToSet);
changeCalendarDate(activeCalendarName, dateToSet, 'date');
// закрываем календарь
//hideCalendar();
}

function setTodayFromCalendar() {
var date=new Date();
setDateFromCalendar(date.getDate(),date.getMonth(),date.getFullYear());
}

function getCalendarTimeFromString(fieldName) {
var hoursInput = document.getElementsByName(fieldName + 'Hours')[0];
var minutesInput = document.getElementsByName(fieldName + 'Minutes')[0];

if (hoursInput && minutesInput){
var newDate = getCalendarDate(fieldName);
var thisHour=parseInt(hoursInput.value);
var thisMinutes=parseInt(minutesInput.value);
if (!isNaN(thisHour)) newDate.setHours(thisHour);
if (!isNaN(thisMinutes)) newDate.setMinutes(thisMinutes);
changeCalendarDate(fieldName, newDate, 'time');
}
}

function getCalendarDateFromString(fieldName) {
var dateInput = document.getElementsByName(fieldName + 'Input')[0];
var re = /^\s*(\d+)[\s|\/|.]+([^\s]+)[\s|\/|.]+(\d+)\s*$/i;
var results = re.exec(dateInput.value);
if (results){
// если небыло ошибки регекспа

var newDate = getCalendarDate(fieldName);
// определяем год
var newYear = parseInt(results[3]);
if (newYear < 30) newYear += 2000;
else if (newYear < 100) newYear += 1900;
else if (newYear < 1930) newYear += 2000;
// что при последнем может получиться - никто не знает
newDate.setFullYear(newYear);
newDate.setDate(1);

if (isNaN(parseInt(results[2]))) {
var monthStr = results[2].toLowerCase();
// в качестве месяца - строка
// 
for (var i = 0; i < 12; i++) {
if (
calendarNamesHash.ru.month[i].toLowerCase().indexOf(monthStr) == 0 ||
calendarNamesHash.ru.monthShort[i].toLowerCase().indexOf(monthStr) == 0 ||
calendarNamesHash.en.month[i].toLowerCase().indexOf(monthStr) == 0 ||
calendarNamesHash.en.monthShort[i].toLowerCase().indexOf(monthStr) == 0
) {
newDate.setMonth(i);
break;
}
}
} else {
// пришло число в качестве месяца
// если нужно проверять не на американский манер
// ли была передана дата, то это здесь
newDate.setMonth(parseInt(results[2]) - 1);
}
newDate.setDate(parseInt(results[1]));
changeCalendarDate(fieldName, newDate, 'date');
} else {
// если по какой-то причине регексп не сработал
alert('Не понял, что это за дата такая, возвращаю старую...');
        updateCalendar(fieldName);
}
}

// внешний вид и поведение

var pixelSpacer = '<div style="width: 1px; height: 1px;"><spacer type="block" width="1" height="1" /><\/div>';

function writeInFields(name, value, options) {
// Вставляет HTML-код с необходимыми полями...
document.write('<div id="' + name + 'Ptr" style="width: 1px; height: 1px; border:0px;"><spacer type="block" width="1" height="1" /><\/div>');
}

function showCalendarForElement(elemName, evt) {
var calPtr = document.getElementById(elemName + 'Ptr');
if (calPtr) {
// показывает календарь в слое (создает слой, если необходимо)
var calLeer = document.getElementById('candarLeer');
if (!calLeer) {
calLeer = document.createElement('div');
calLeer.id = 'candarLeer';
document.getElementsByTagName('body')[0].appendChild(calLeer);
}
// проверяем показан ли слой, если да - скрываем
if (calLeer.style.visibility == 'visible' && activeCalendarName == elemName) {
calLeer.style.visibility = 'hidden';
} else {
activeCalendarName = elemName;
// скрываем слой
calLeer.style.visibility = 'hidden';
// вычисляем где именно должен быть этот календарь.
var calPosition = new getElementPosition(calPtr);
// заполняем нужным кодом...
// смотрим какая дата нас интересует
var currDate = getCalendarDate(elemName);
// собственно вызываем код
calLeer.innerHTML = calendarHTML(currDate.getMonth(), currDate.getFullYear(), currDate);
// ставим слой на место
calLeer.style.left = calPosition.x - calLeer.offsetWidth;
calLeer.style.top = calPosition.y;
// и показываем
calLeer.style.visibility = 'visible';

// наконец, прекращаем баблинг (может, кто-то открыл без event'а)
if (evt) evt.cancelBubble = true;
// и ставим свой обработчик на клик на календаре (чтобы не скрывался)
addEvent(calLeer, 'click', calendarClick);
// и на mouseout (чтобы скрывался, но через некоторое время ;-)
addEvent(calLeer, 'mouseover', calendarMouseOver);
addEvent(calLeer, 'mouseout', calendarMouseOut);
}
}
}

function calendarClick(e) {
evt = (e)? e : window.event;
evt.cancelBubble = true;
}

function calendarMouseOver(e) {
if (closeCalendarTimeOut) {
clearTimeout(closeCalendarTimeOut);
closeCalendarTimeOut = 0;
}
}

function calendarMouseOut(e) {
if (closeCalendarTimeOut) {
clearTimeout(closeCalendarTimeOut);
}
closeCalendarTimeOut = setTimeout('hideCalendar()', 5000);
}

function hideCalendar() {
var calLeer = document.getElementById('candarLeer');
if (calLeer) calLeer.style.visibility = 'hidden';
closeCalendarTimeOut = 0;
}


function switchMonthTo(month, year) {
var calLeer = document.getElementById('candarLeer');
if (calLeer) {
// заполняем нужным кодом...
// смотрим какая дата нас интересует
var currDate = getCalendarDate(activeCalendarName);
// собственно вызываем код
calLeer.innerHTML = calendarHTML(month, year, currDate);
}
}

function calendarHTML(month, year, currDate) {
// смотрим этот ли месяц показываем
var isThisMonth = (currDate)? (currDate.getMonth() == month && currDate.getFullYear() == year) : false;

// генерирует html-код для указанного месяца

// устанавливаем месяц, который будем рисовать
var drawMonth = new Date(); drawMonth.setMonth(month, 1); drawMonth.setYear(year); drawMonth.setDate(1);

// переменные для кнопок навигации по месяцам/годам
var thisMonth = drawMonth.getMonth();
var nextMonth = (thisMonth == 11)? 0 : thisMonth + 1;
var prevMonth = (thisMonth == 0)? 11 : thisMonth - 1;
var thisYear = drawMonth.getFullYear();
var nextMonthYear = (thisMonth == 11)? thisYear + 1 : thisYear;
var nextYear = thisYear + 1;
var prevMonthYear = (thisMonth == 0)? thisYear - 1 : thisYear;
var prevYear = thisYear - 1;

// запихиваем в строку весь код - открываем таблицы...
var calendarCode = '<table cellpadding="0" cellspacing="0" border="0" style="border: 2px solid #000000; width:180px;">';
calendarCode += '<tr><td class="purpleCell"><table cellpadding="0" cellspacing="3" border="0" width=180px>';
// здесь указываем клик на прошлый год
//calendarCode += '<tr><td><img src="' + imagesFolder + 'arr-prev.gif" width="12" height="12" border="0" onClick="switchMonthTo(' + thisMonth + ', ' + prevYear + ')" style="cursor: pointer; cursor: hand;" /><\/td>';
// текущий (показываемый) год
//calendarCode += '<td align="center" class="purpleCell">' + thisYear + '<\/td>';
// клик на следующий год
//calendarCode += '<td align="right"><img src="' + imagesFolder + 'arr-next.gif" width="12" height="12" border="0" onClick="switchMonthTo(' + thisMonth + ', ' + nextYear + ')" style="cursor: pointer; cursor: hand;" /><\/td><\/tr>';
// клик на предыдущий месяц
calendarCode += '<tr><td><img src="' + imagesFolder + '/images/ico_str_left.gif" align="absmiddle" width="16" height="16" border="0" onClick="switchMonthTo(' + prevMonth + ', ' + prevMonthYear + ')" style="cursor: pointer; cursor: hand;" /> ' + calendarNames.month[thisMonth] + ' <img src="' + imagesFolder + '/images/ico_str_right.gif" width="16" height="16" border="0" align="absmiddle" onClick="switchMonthTo(' + nextMonth + ', ' + nextMonthYear + ')" style="cursor: pointer; cursor: hand;" /><\/td>';
// текущий месяц
//calendarCode += '<td align="center" class="purpleCell">' + calendarNames.month[thisMonth] + '<\/td>';
// клик на следующий месяц
calendarCode += '<td align="center">' + thisYear + '<\/td><\/tr>';
calendarCode += '<\/table><\/td><\/tr>';

// начинаем таблицу самого месяца
calendarCode += '<tr><td style="border-top: 1px solid #808080;" bgcolor="#ffffff"><table class="tbl_cal" cellpadding="0" cellspacing="0" border="0" width="100%"><tr>';
calendarCode += '';
for (var i = 0; i < calendarNames.weekday.length; i++) {
var styleClass = (i < calendarNames.weekday.length - 2)? 'whiteCellWeek' : 'sundayCellWeek';
calendarCode += '<td class="' + styleClass + '" align="center">' + calendarNames.weekday[i] + '<\/td>';
}
calendarCode += '<\/tr>';

// разделительная полоска
// сам месяц
calendarCode += '<tr>';

// рисуем пустые ячейки если нужно...
var daysToStart = (drawMonth.getDay() == 0)? 7 : drawMonth.getDay();
for (var i = 0; i < daysToStart - 1; i++)	{
	var styleClass = (i == 5 || i == 6)? 'sundayCellWeek' : 'whiteCellWeek';
	calendarCode += '<td class="' + styleClass + '"><br /><\/td>'; /*smith*/
}

// собственно циферки
for (var i = 1; i < 33; i++) {
drawMonth.setDate(i);
if (isThisMonth && i == currDate.getDate()) {
calendarCode += '<td class="blackCell" align="center">' + i + '<\/td>'
} else {
if (drawMonth.getMonth() == thisMonth) {
i < 10 ? i_echo = '0'+i : i_echo = i;
var styleClass = (drawMonth.getDay() == 0 || drawMonth.getDay() == 6) ? 'sundayCell' : 'whiteCell'
calendarCode += '<td class="' + styleClass + '" align="center" onMouseOver="this.className = \'overCell\';" onMouseOut="this.className = \'' + styleClass + '\';" onClick="set_celendar(\'' + i_echo + '.' + (month+1) + '.' + year + '\'); hideCalendar();" style="cursor: pointer; cursor: hand; text-decoration: underline;">' + i + '<\/td>'; /*setDateFromCalendar(' + i + ', ' + month + ', ' + year + ');*/
} else break;
}
if (drawMonth.getDay() == 0) calendarCode += '<\/tr><tr>';
}

// опять рисуем пустые ячейки
if (drawMonth.getDay() != 1) {
var daysToEnd = 8 - ((drawMonth.getDay() == 0)? 7 : drawMonth.getDay());
for (var i = 0; i < daysToEnd; i++){
	var styleClass = (i < daysToEnd - 2)? 'whiteCellWeek' : 'sundayCellWeek';
	calendarCode += '<td class="' + styleClass + '"><br /><\/td>';
	}
}
calendarCode += '<td class="whiteCell"><br /><\/td><td class="whiteCell"><br /><\/td><\/tr><\/table><\/td><\/tr>';

// ссылка на сегодня
//calendarCode += '<tr><td class="whiteCell" onMouseOver="this.className = \'overCell\';" onMouseOut="this.className = \'whiteCell\';" style="border-top: 1px solid #000000; padding: 3px; cursor: pointer; cursor: hand;" align="center" onClick="setTodayFromCalendar();">'+calendarNames.today+'<\/td><\/tr>';

// конец
calendarCode += '<\/table>';

return calendarCode;
}

function getElementPosition(elemPtr) {
var posX = elemPtr.offsetLeft;
var posY = elemPtr.offsetTop;
while (elemPtr.offsetParent != null) {
elemPtr = elemPtr.offsetParent;
posX += elemPtr.offsetLeft;
posY += elemPtr.offsetTop;
}
this.x = posX;
this.y = posY;
return this;
}

function addEvent(elementPtr, eventType, eventFunc) {
if (elementPtr.addEventListener) {
elementPtr.addEventListener(eventType, eventFunc, false);
} if (elementPtr.attachEvent) {
elementPtr.attachEvent('on' + eventType, eventFunc);
} else {
// что делать если ни то ни другое не поддерживается
}
}

addEvent(document, 'click', hideCalendar);
addEvent(window, 'resize', hideCalendar);

function set_celendar(date) {
	$("#date_polis").attr("value", date);
}
