// номер кнопки - для одноименных элементов
var iCALENDAR_BUTTONINDEX;
var gsCalendarFormName = "";

// путь к картинкам
var imagesFolder = 'des_1/img/';

//var g_CLDR_LANG = 'en'
// имена месяцев и т.п.
var calendarNamesHash = new Array();
calendarNamesHash.ru = new Array();
calendarNamesHash.en = new Array();
calendarNamesHash.ru.month = ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'];
calendarNamesHash.ru.monthShort = ['янв', 'фев', 'мар', 'апр', 'мая', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'];
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[ g_CLDR_LANG == '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 getDateVal(value,what){
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) {
    if (what == 'y') return date[1];
    if (what == 'm') return date[2];
    if (what == 'd') return date[3];
  }
}
  return null;
}

// интерфейсные функции
function updateCalendar(name, date)
{

// ALAN: это я закомментил. Я сделал так, что date сюда передается 
// вторым аргументом и нет необходимости его 
// доставать из хидена
//  var date = getCalendarDateUnchecked(name);

  var dateInput = document.getElementsByName(name)[iCALENDAR_BUTTONINDEX];
//  alert(sDT_FORMAT);
  if (dateInput) dateInput.value = date ? dt_Format(date, sDT_FORMAT) : ' ';

/* 
//commented by Alan
  var hiddenValue = document.getElementsByName(name)[0];
  if (hiddenValue) 
  {
    var dateH = hiddenValue.value;
    var yearInput = document.getElementsByName('yyyyCldr')[0];
    var monthInput = document.getElementsByName('mmCldr')[0];
    var dayInput = document.getElementsByName('ddCldr')[0];
    if (yearInput) yearInput.value = getDateVal(dateH,'y');
    if (monthInput) monthInput.value = getDateVal(dateH,'m');
    if (dayInput) dayInput.value = getDateVal(dateH,'d');
  }

  var dateInput = document.getElementsByName(name + 'InputCldr')[0];
  var hoursInput = document.getElementsByName(name + 'HoursCldr')[0];
  var minutesInput = document.getElementsByName(name + 'MinutesCldr')[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) 
{
// Alan : у меня она не используется
// ее вызов закомменчен в getCalendarDate(name) 
  var hiddenValue = document.getElementsByName(name)[iCALENDAR_BUTTONINDEX];
  return hiddenValue ? value2date(hiddenValue.value) : null;
}

function getCalendarDate(name) 
{
  var ebox = document.getElementsByName(name)[iCALENDAR_BUTTONINDEX];

  if (ebox)
  {
    sDate = ebox.value;
    dDate = dt_Check(sDate, "yyyy-mm-dd");
    if ( dDate)
    {
      return dDate;
    }
    else
    {
      return new Date();
    }
  }
  else
  {
    return false;
  }
/*
// Alan: это я закомментил, потому что мне нужно, чтобы
// при показе календаря изначально была дата не из хидена
// (я его вообще не использую), а из самого ебокса

// таким образом, функция getCalendarDateUnchecked у емня вообще не исп-ся

  var date=getCalendarDateUnchecked(name);
  return date ? date : new Date();
*/
}

function putCalendarDate(name, date) 
{
  // Alan: ''nj я перенес сюда из строки 1 (см. ниже)
  // а все что ниже - закомментил
  // кроме того, я в этот вызов добавил второй аргумент,
  //чтобы обойтись без hidden
  updateCalendar(name, date);

/*
  var hiddenValue = document.getElementsByName(name)[0];
  if (hiddenValue){ 
    hiddenValue.value = date2value(date);
    updateCalendar(name); // строка 1
  }
*/  
}

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);
return;
  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 ClearDate(name)
{
  //Alan тут name в общем-то не нужен,я обнаружил, что есть  activeCalendarName
  // им и обойдемся
  var dateInput = document.getElementsByName(activeCalendarName)[iCALENDAR_BUTTONINDEX];
  if (dateInput) dateInput.value = "";
  // закрываем календарь
  hideCalendar();

}

function setTodayFromCalendar() 
{
  var date=new Date();
  setDateFromCalendar(date.getDate(),date.getMonth(),date.getFullYear());
}


function getCalendarTimeFromString(fieldName) 
{
  var hoursInput = document.getElementsByName(fieldName + 'HoursCldr')[0];
  var minutesInput = document.getElementsByName(fieldName + 'MinutesCldr')[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)[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 {
// если по какой-то причине регексп не сработал
  if (dateInput.value){
    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('<input type="hidden" name="' + name + '" value="' + value + '" />');
document.write('<input type="hidden" name="' + 'yyyyCldr" value="' + getDateVal(value,'y') + '" />');
document.write('<input type="hidden" name="' + 'mmCldr" value="' + getDateVal(value,'m') + '" />');
document.write('<input type="hidden" name="' + 'ddCldr" value="' + getDateVal(value,'d') + '" />');

document.write('<style>.calendtbl {display: inline; margin: 0; vertical-align: text-bottom; width: 10px;} .calendtbl td{padding: 0; color:#4C4C21; font-size: 11px;}</style>');

document.write('<table cellpadding="0" cellspacing="0" border="1" bordercolor="Blue" class="calendtbl"><tr>');
if (options != 2) {
document.write('<td><input type="text" name="' + name + '" class="formEl1" style="background-color:red;width: 80px; text-align: center;" onBlur="getCalendarDateFromString(\'' + name + '\');" onKeyDown="if (event.keyCode==13) {getCalendarDateFromString(\'' + name + '\');}" /><\/td>');
document.write('<td><img style="cursor: pointer;" name="' + name + 'BtnCldr" src="' + imagesFolder + 'common-calenddayselect.gif" width="15" height="18" alt="Дата" onClick="showCalendarForElement(\'' + name + '\', event); return false;" /><\/td>');
document.write('<td valign="bottom"><div id="' + name + 'PtrCldr" style="width: 1px; height: 1px;"><spacer type="block" width="1" height="1" /><\/div><\/td>');
}
if (options == 0) {document.write('<td>&nbsp;&nbsp;<\/td>');}
if (options != 1) {
document.write('<td><input type="text" name="' + name + 'HoursCldr" class="formEl1" style="width: 30px; text-align: center;" onBlur="getCalendarTimeFromString(\'' + name + '\');" onKeyDown="if (event.keyCode==13) {getCalendarTimeFromString(\'' + name + '\');}" /><\/td>');
document.write('<td><small>&nbsp;:&nbsp;<\/small><\/td>');
document.write('<td><input type="text" name="' + name + 'MinutesCldr" class="formEl1" style="width: 30px; text-align: center;" onBlur="getCalendarTimeFromString(\'' + name + '\');" onKeyDown="if (event.keyCode==13) {getCalendarTimeFromString(\'' + name + '\');}" /><\/td>');
}
document.write('<\/tr><\/table>');
}

function showCalendarForElement(elemName, event) 
{
//  alert(event.srcElement.name);  
  
  iCALENDAR_BUTTONINDEX = htm_GetThisElementIndexInArray_ByName(event);
//  alert(iCALENDAR_BUTTONINDEX);  
  

  var badSelect = document.getElementById('price');
  
  if(badSelect)
  {
    badSelect.style.visibility = 'hidden';
  }

  var calPtr = document.getElementById(elemName + 'PtrCldr');
  
  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.display == 'block' && activeCalendarName == elemName) 
    {
      calLeer.style.display == 'none';
    } 
    else 
    {
      activeCalendarName = elemName;
      // скрываем слой
///      calLeer.style.display = 'none';
      // вычисляем где именно должен быть этот календарь.
      var calPosition = new getElementPosition(calPtr);
      // заполняем нужным кодом...
      // смотрим какая дата нас интересует
      var currDate = getCalendarDate(elemName);
      // собственно вызываем код
      
      if (typeof(currDate) == "undefined" || !currDate) 
      {
        alert(g_CLDR_NOCELLFORDATE);
        return;
      }

      calLeer.innerHTML = calendarHTML(currDate.getMonth(), currDate.getFullYear(), currDate);
      // ставим слой на место
      calLeer.style.position = 'absolute';
      calLeer.style.left = event.x - 100 + document.body.scrollLeft;
      calLeer.style.top = event.y + 20 + document.body.scrollTop;
      
      //hide all selects in form
      var calEditBox = document.getElementById(elemName);
      gsCalendarFormName = "";
      if (calEditBox) 
      {
        if (typeof(calEditBox.form) != "undefined") 
        {
          var oForm = calEditBox.form;
          gsCalendarFormName = oForm.name;
          htm_HideAllSelects(gsCalendarFormName);
        }
      }
      
      
      // и показываем
      calLeer.style.display = 'block';
      
      
      // наконец, прекращаем баблинг (может, кто-то открыл без event'а)
      if (event) event.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.display = 'none';
  closeCalendarTimeOut = 0;
  
  var badSelect = document.getElementById('price');
  if(badSelect){badSelect.style.visibility = 'visible'}

  htm_ShowAllSelects(gsCalendarFormName);

}

function switchMonthTo(month, year) 
{
var calLeer = document.getElementById('candarLeer');
if (calLeer) 
  {
// заполняем нужным кодом...
// смотрим какая дата нас интересует
  var currDate = getCalendarDate(activeCalendarName);
// собственно вызываем код
  calLeer.innerHTML = calendarHTML(month, year, currDate);
  }
}

//--------------------------------------------------------------

function switchMonthTo_BySelect(iMonth)
{
  oYear = document.getElementById('cldrYearID');
  if (!oYear) {return;}
  iYear = oYear.value;
  switchMonthTo(iMonth, iYear);
}
//--------------------------------------------------------------

function cldr_DrawMonthSelect(iMonth)
{
  var sStr = "";
  sStr = '<select name="" onchange="switchMonthTo_BySelect(this.value);" >';
  
  for (i = 0; i < calendarNames.month.length; i++)
  {
    iMon = i;
    sSelected = (iMon == iMonth) ? " selected " : "";
    sStr += '<option value="' + iMon + '" ' + sSelected + '>' + calendarNames.month[i];
  }
  
  sStr += '</select>';
  return sStr;
}

//------------------------------------------------

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" bordercolor="Green" style="z-index:1; border: 1px solid Blue; border-bottom: 2px solid Blue;  border-right: 2px solid Blue; background-color: #F1F1EA; cursor: default;">';
  calendarCode += '<tr><td><table cellpadding="0" cellspacing="3" border="0" bordercolor="Black" width="100%">';
  // здесь указываем клик на прошлый год
  calendarCode += '<tr>';
  // текущий (показываемый) год
  calendarCode += '<td class="tdlc" style="padding-right:5px;">' +
  '<table border="0" bordercolor="brown">' +
  '<tr>' +
  '<td rowspan="2" style="padding-right:2px;">' +
  '<input id="cldrYearID" name="cldrYear" onblur="switchMonthTo(' + thisMonth + ', this.value)" type="Text" size="3" maxlength="4" value="' + thisYear + '">' +
  '</td>' +
  '<td class="tdcc"><img  alt="Увеличение значения с шагом: 1"  onclick="spinner_Start(\'cldrYear\', 1);" style="cursor: pointer;" src="des_1/img/sort_up.gif" width="11px" height="6px"></td>' +
  '<tr><td class="tdcc"><img  alt="Уменьшение значения с шагом: 1"  onclick="spinner_Start(\'cldrYear\', -1);" style="cursor: pointer;" src="des_1/img/sort_down.gif" width="11px" height="6px"></td></tr>' +
  '</tr></table>' +
  '<\/td>';
  // текущий месяц
  calendarCode += '<td  class="tdrc">' + cldr_DrawMonthSelect(thisMonth) + '<\/td>';
  // клик на следующий месяц
  calendarCode += '<\/tr>';
  calendarCode += '<\/table><\/td><\/tr>';
  // начинаем таблицу самого месяца
  calendarCode += '<tr><td style="border-top: 1px solid Blue; background-color: White;"><table cellpadding="1" cellspacing="1" border="0" width="100%" style="border-bottom: 1px solid Blue;"><tr>';
  calendarCode += '<td>&nbsp;<\/td><td>&nbsp;<\/td>';
  for (var i = 0; i < calendarNames.weekday.length; i++) {
  var styleClass = (i < calendarNames.weekday.length - 1)? 'whiteCell' : 'sundayCell';
  calendarCode += '<td align="right">' + calendarNames.weekday[i] + '<\/td>';
  }
  calendarCode += '<td>&nbsp;<\/td><td>&nbsp;<\/td><\/tr>';
  
  // сам месяц
  calendarCode += '<tr><td><br /><\/td><td><br /><\/td>';
  // рисуем пустые ячейки если нужно...
  var daysToStart = (drawMonth.getDay() == 0)? 7 : drawMonth.getDay();
  for (var i = 0; i < daysToStart - 1; i++) calendarCode += '<td><br /><\/td>';
  
  // собственно циферки
  for (var i = 1; i < 33; i++) {
  drawMonth.setDate(i);
  if (isThisMonth && i == currDate.getDate()) {
  calendarCode += '<td align="center"  onClick="setDateFromCalendar(' + i + ', ' + month + ', ' + year + ');" class="tdCldrCurrDay" >' + i + '<\/td>'
  } else {
  if (drawMonth.getMonth() == thisMonth) {
  var styleClass = (drawMonth.getDay() == 0)? 'sundayCell' : 'whiteCell'
  calendarCode += '<td class="' + styleClass + '" align="center" onMouseOver="this.className = \'overCell\';" onMouseOut="this.className = \'' + styleClass + '\';" onClick="setDateFromCalendar(' + i + ', ' + month + ', ' + year + ');" style="border: solid 1px #E7E7E0; cursor: pointer; cursor: hand;">' + i + '<\/td>';
  } else break;
  }
  if (drawMonth.getDay() == 0) calendarCode += '<td><br /><\/td><td><br /><\/td><\/tr><tr><td><br /><\/td><td><br /><\/td>';
  }
  
  // опять рисуем пустые ячейки
  if (drawMonth.getDay() != 1) {
  var daysToEnd = 8 - ((drawMonth.getDay() == 0)? 7 : drawMonth.getDay());
  for (var i = 0; i < daysToEnd; i++) calendarCode += '<td><br /><\/td>';
  }
  calendarCode += '<\/tr><\/table><\/td><\/tr>';
  // ссылка на сегодня
  calendarCode += '<tr><td valign="center">' +
  '<table width="100%"><tr>' +
  '<td onMouseOver="this.className = \'overCell\';" onMouseOut="this.className = \'whiteCell\';" style="padding: 6px; cursor: pointer; cursor: hand;" align="center" onClick="setTodayFromCalendar();">'+calendarNames.today+'<\/td>' +
  '<td class="tdrc" style="padding-right:6px"><img src="des_1\\img\\pic_clear2.gif" style="cursor: pointer; cursor: hand;" alt="' + g_CLDR_CLEARDATE + '" onclick="ClearDate();"></td>' +
  '<\/tr><\/table>' +
  '<\/td><\/tr>';
  // конец
  calendarCode += '<\/table>';
  return calendarCode;
}

//--------------------------------------------------------------

function getElementPosition(elemPtr) {
var posX = elemPtr.offsetLeft;
var posY = elemPtr.offsetTop;
while (elemPtr.offsetParent != null) {
if (elemPtr.tagName == 'TABLE' && elemPtr.offsetParent.tagName== 'TABLE')
{elemPtr = elemPtr.offsetParent;}
else
{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);
