<!--
wpCalendar=
 {
  is_init:0,                                // флаг первичной инициализации
  is_open:0,                                // флаг открытого календаря
  
  id_src_year:"",                           // id поля года
  id_src_month:"",                          // id поля месяца
  id_src_day:"",                            // id поля дня
  
  cur_year:0,                               // текущий год
  cur_month:0,                              // текущий месяц
  cur_day:0,                                // текуший год
  
  cur_x:0,                                  // позиция текущей даты по горизонтали
  cur_y:0,                                  // позиция текущей даты по вертикали
  
  min_year:0,                               // минимальный год
  max_year:0,                               // максимальный год
  
  max_day:0,                                // число дней в текущем месяце
  
  is_v:0,                                   // признак високосного года
  
  base_dow:0,                               // день недели первого дня месяца
  
  lim_row_1:1,                              // номер первой активной ячейки в строке №1
  lim_row_5:0,                              // номер последней активной ячейки в строке №5
  lim_row_6:0,                              // номер последней активной ячейки в строке №6
  

  // Первичная инициализация
  create:function()
   { 
    var i,j,objTD;
    
    // Проверяемся на повторный вызов
    if(this.is_init!=0)
     return;
     
     
    // Назначаем обработчик для ячеек
    for(i=1;i<7;i++)
     for(j=1;j<8;j++)
      {
       objTD=document.getElementById("id_cal_cell_"+i+"_"+j);
       if(objTD)
        objTD.onclick=function()
                       {
                        wpCalendar.onclick(this);
                        return false;
                       }
      }
      
      
    // Устанавливаем флаг первичной инициализации
    this.is_init=1;
   },
  
  
  // Иинициализация календаря
  init:function(obj_parent,id_year,id_month,id_day,min_year,max_year)
   {
    var objFld;
    var dt;
    var off;
    var objWin;
    var pX,pY;
    var i,j;
    
    
    // Осуществляем первичную инициализацию
    this.create();
    
    
    // Закрываем ранее открытое окно календаря
    if(this.is_open!=0)
     this.close();
    

    // Доступаемся к окну календаря
    objWin=document.getElementById("id_cal");
    if(!objWin)
     {
      alert("Не найден html-код календаря");
      return;
     }

  
    // Запоминаем id полей ввода даты
    this.id_src_year=id_year;
    this.id_src_month=id_month;
    this.id_src_day=id_day;
    

    // Задаем диапазон годов
    if(max_year<100)
     max_year=min_year+max_year;

    if(min_year>max_year)
     {
      i=min_year;
      min_year=max_year;
      max_year=i;
     }
     
    if(min_year<1900)
     {
      alert("Начальный год не может быть меньше 1900 года");
      return;
     }
     
    if(max_year>2047)
     {
      alert("Конечный год не может быть больше 2047 года");
      return;
     }
     
    this.min_year=min_year;
    this.max_year=max_year;


    // Получаем текущие значения полей ввода даты
    if(this.id_src_year.length>0)
     {
      objFld=document.getElementById(this.id_src_year);
      if(objFld)
       this.cur_year=parseInt(objFld.options[objFld.selectedIndex].value);
     }

    if(this.id_src_month.length>0)
     {
      objFld=document.getElementById(this.id_src_month);
      if(objFld)
       this.cur_month=parseInt(objFld.options[objFld.selectedIndex].value);
     }

    if(this.id_src_day.length>0)
     {
      objFld=document.getElementById(this.id_src_day);
      if(objFld)
       this.cur_day=parseInt(objFld.options[objFld.selectedIndex].value);
     }
     

    // При отсутствии значений берем текущую дату 
    if(this.cur_year==0 
    || this.cur_month==0
    || this.cur_day==0)
     {
      dt=new Date();
      
      this.cur_year=dt.getFullYear();
      this.cur_month=dt.getMonth()+1;
      this.cur_day=dt.getDate();
     }
     

    // Проверяем корректность года
    if(this.cur_year<this.min_year)
      this.cur_year=this.min_year;
     else
    if(this.cur_year>this.max_year)
      this.cur_year=this.max_year;
    
    
    // Получаем координаты родительского объекта
    pX=jscGetPageOffsetX(obj_parent);
    pY=jscGetPageOffsetY(obj_parent);
 
 
    // Задаем координаты окна календаря
    jscSetPosX(objWin,pX);
    jscSetPosY(objWin,pY);
    
    
    // Выставляем текущий месяц
    objFld=document.getElementById("id_cal_month");
    if(objFld)
     objFld.selectedIndex=this.cur_month-1;
    
    
    // Формируем список годов
    objFld=document.getElementById("id_cal_year");
    if(objFld)
     {
      for(i=objFld.options.length-1;i>-1;i--)
       objFld.options[i]=null;
       
      for(i=this.min_year,j=0;i<=this.max_year;i++)
       {
        objFld.options[j]=new Option(i,i);

        if(j==this.cur_year)
         objFld.selectedIndex=j;
         
        j++;
       }
     }
    

    // Настраиваем период
    this.preparePD();
        

    // Назначаем клавиатурный обработчик
    this.save_onkeydown=document.onkeydown;
    document.onkeydown=function(ev)
                        {
                         wpCalendar.onkeydown(ev);
                        }
    this.is_open=1;


    // Активируем окно календаря
    objWin.style.display="block";
   },
   
   
  // Настройка периода
  preparePD:function()
   {
    var objWin;
    
    
    // Доступаемся к окну календаря
    objWin=document.getElementById("id_cal");
    if(!objWin)
     {
      alert("Не найден html-код календаря");
      return;
     }

  
    // Определяем високосность года
    this.is_v=this.isV(this.cur_year);
     

    // Определяем количество дней в текущем месяце
    this.max_day=this.getDaysCount(this.cur_month,this.is_v);
    

    // Проверяем корректность текущей даты и при необходимости подправляем ее до корректной 
    if(this.cur_day>this.max_day)
     this.cur_day=this.max_day;
     

    // Определяем день недели для начала месяца
    dt=new Date(this.cur_year,this.cur_month-1,1);
    this.base_dow=dt.getDay();
    if(this.base_dow==0)
     this.base_dow=7;
     

    // Определяем смещения неполных строк таблицы календаря
    this.lim_row_1=this.base_dow;
    
    off=this.max_day-29+this.base_dow;
    if(off<8)
     {
      this.lim_row_5=off;
      this.lim_row_6=0;
     }
     else
     {
      this.lim_row_5=7;
      this.lim_row_6=off-7;
     }
     

    // Определяем координаты текущей даты
    this.cur_y=Math.floor((this.cur_day+this.base_dow-2)/7)+1;
    this.cur_x=(this.cur_day+this.base_dow-1)%7;
    if(this.cur_x==0)
     this.cur_x=7;


    // Активируем ссылки перехода между месяцами
    objFld=document.getElementById("id_cal_prev");
    if(objFld)
     {
      cls="calPageActive";
      
      if(this.cur_year==this.min_year
      && this.cur_month==1)
       cls="calPageHide";
       
      objFld.className=cls;
     }

    objFld=document.getElementById("id_cal_next");
    if(objFld)
     {
      cls="calPageActive";
      
      if(this.cur_year==this.max_year
      && this.cur_month==12)
       cls="calPageHide";
       
      objFld.className=cls;
     }


    // Отрисовываем месяц
    this.drawMonth(objWin); 
   },
   
   
  // Отрисовка месяца
  drawMonth:function(objWin)
   {
    var i,j;
    
    // Зачищаем первую строку
    for(i=1,j=1;j<this.lim_row_1;j++)
     this.setCell(i,j,0);
     
    for(d=1;j<8;j++,d++)
     this.setCell(i,j,d);
     
    // Выводим строки 2-4
    for(i=2;i<5;i++)
     for(j=1;j<8;j++,d++)
      this.setCell(i,j,d);
      
    // Выводим строку 5
    for(i=5,j=1;j<=this.lim_row_5;j++,d++)
     this.setCell(i,j,d);
     
    for(j=this.lim_row_5+1;j<8;j++)
     this.setCell(i,j,0);
     
    // Выводим строку 6
    for(i=6,j=1;j<=this.lim_row_6;j++,d++)
     this.setCell(i,j,d);
     
    for(j=this.lim_row_6+1;j<8;j++)
     this.setCell(i,j,0);
   },
   
   
  // Задание содержимого ячейки таблицы дат
  setCell:function(row,col,value)
   {
    var objCell,cls;
    

    // Получаем ячейку таблицы дат
    objCell=document.getElementById("id_cal_cell_"+row+"_"+col);
    if(!objCell)
     return;


    // Задаем ее текст     
    objCell.innerHTML=(value==0 ? "&nbsp;" : value); 
    

    // Задаем класс ячейки
    cls="";
    if(col==this.cur_x
    && row==this.cur_y)
      cls="tdCalActive";
     else
    if(value!=0
    && col>5)
      cls="tdCalWeekend";
     
    objCell.className=cls;

   
    // Задаем стиль курсора    
    objCell.style.cursor=(value==0 ? "default" : "pointer");
    
    
    // Записываем номер дня в атрибут ячейки
    objCell.setAttribute("jsc_day",value);
   },
   
   
  // Управление активностью ячейки
  setActive:function(row,col,is_active)
   {
    var objCell,cls,day;
    

    // Получаем ячейку таблицы дат
    objCell=document.getElementById("id_cal_cell_"+row+"_"+col);
    if(!objCell)
     return;
     
     
    // Сохраняем параметры текущей даты
    if(is_active==1)
     {
      day=parseInt(objCell.getAttribute("jsc_day"));
      if(day==0)
       return;
       
      this.cur_day=day;
      
      this.cur_y=row;
      this.cur_x=col;
     }


    // Задаем класс ячейки
    cls="";
    if(is_active==1)
      cls="tdCalActive";
     else
    if(col>5)
      cls="tdCalWeekend";
     
    objCell.className=cls;
   }, 
  
  
  // Проверка года на високосность
  isV:function(y)
   {
    var rc=0;
    
    if(y%4==0
    && (y%100!=0
    ||  y%400==0))
     rc=1;
     
    return(rc);
   },
   
   
  // Определение количества дней в месяце
  getDaysCount:function(m,is_v)
   {
    rc=31;
    
    if(m==2)
     if(is_v==0)
       rc=28;
      else
       rc=29;
     else
    if(m==4
    || m==6
    || m==9
    || m==11)
     rc=30;
    
    return(rc)
   },
   
   
  // Завершение работы с записью результатов
  submit:function()
   {
    var objFld;
    var i;
    
    // Задаем значения родительских полей
    objFld=document.getElementById(this.id_src_year);
    if(objFld)
     for(i=0;i<objFld.options.length;i++)
      if(objFld.options[i].value==this.cur_year)
       {
        objFld.selectedIndex=i;
        break;
       }
       
    objFld=document.getElementById(this.id_src_month);
    if(objFld)
     for(i=0;i<objFld.options.length;i++)
      if(objFld.options[i].value==this.cur_month)
       {
        objFld.selectedIndex=i;
        break;
       }
       
    objFld=document.getElementById(this.id_src_day);
    if(objFld)
     for(i=0;i<objFld.options.length;i++)
      if(objFld.options[i].value==this.cur_day)
       {
        objFld.selectedIndex=i;
        break;
       }
       
       
    // Вызываем нотификацию
    this.update();   
   
   
    // Закрываем окно
    this.close();
   },
   
   
  // Завершение работы без записи результата
  close:function()
   {
    var objWin;

    objWin=document.getElementById("id_cal");
    if(!objWin)
     return;
     
     
    document.onkeydown=this.save_onkeydown; 
  
    objWin.style.display="none";
   },
   
   
  // Смена текущего месяца
  changePage:function(offset)
   {
    var newMonth,newYear;
    var objFld;
    var i;
        
    if(offset==0)
     return;
     
    newMonth=this.cur_month;
    newYear=this.cur_year;
    
     
    // Вычисляем параметры нового периода
    if(offset==-1)
     {
      // Предыдущий период
      newMonth--;
      if(newMonth==0)
       {
        newYear--;
        newMonth=12;
        
        if(newYear<this.min_year)
         return;
       }  
     }
     else
     {
      // Следующий период
      newMonth++;
      if(newMonth>12)
       {
        newYear++;
        newMonth=1;
        
        if(newYear>this.max_year)
         return;
       }
     }
     

    // Изменяем текущие значения выпадающих списков
    objFld=document.getElementById("id_cal_month");
    if(objFld)
     for(i=0;i<objFld.options.length;i++)
      if(objFld.options[i].value==newMonth)
       {
        objFld.selectedIndex=i;
        break;
       }
       
    if(newYear!=this.cur_year)
     {
      objFld=document.getElementById("id_cal_year");
      if(objFld)
       for(i=0;i<objFld.options.length;i++)
        if(objFld.options[i].value==newYear)
         {
          objFld.selectedIndex=i;
          break;
         }
     }
         
         
    // Задаем новый период
    this.cur_month=newMonth;
    this.cur_year=newYear;

    this.preparePD();
   },
   
   
  // Смена месяца
  changeMonth:function(objSel)
   {
    var n,newMonth;
    
    
    // Получаем новый месяц
    n=objSel.selectedIndex;
    newMonth=objSel.options[n].value;
    
    
    // Сравниваем с текущим
    if(newMonth==this.cur_month)
     return;
     
     
    // Настраиваем параметры нового месяца
    this.cur_month=newMonth;
    this.preparePD();
   },
   
   
  // Смена года
  changeYear:function(objSel)
   {
    var n,newYear;
    
    
    // Получаем новый год
    n=objSel.selectedIndex;
    newYear=objSel.options[n].value;
    
    
    // Сравниваем с текущим
    if(newYear==this.cur_year)
     return;
     
     
    // Настраиваем параметры нового месяца
    this.cur_year=newYear;
    this.preparePD();
   },
   
   
  // Обработка клика мышки
  onclick:function(objTD)
   {
    var row,col,day;
    
    // Получаем индексы новой текущей ячейки
    row=objTD.getAttribute("jsc_row");
    col=objTD.getAttribute("jsc_col");
    day=parseInt(objTD.getAttribute("jsc_day"));
    
    
    // Проверяем их на корректность
    if(row<1 || row>6)
     return;
     
    if(col<1 || col>7)
     return;
     
    if(day<1 || day>this.max_day)
     return;
     
    if(row==1 && col<this.lim_row_1)
     return;
     
    if(row==5 && col>this.lim_row_5)
     return;
     
    if(row==6 && col>this.lim_row_6)
     return;
     
     
    // Деактивируем старую активную ячейку
    this.setActive(this.cur_y,this.cur_x,0);
    
    
    // Активируем новую активную ячейку
    this.setActive(row,col,1);
    
    
    // Вызываем завершение с заданием даты
    this.submit();
   },
   
   
  // Клавиатурный обработчик
  onkeydown:function(ev)
   {
    var key,isShift,isAlt,isCtrl;
    var isProcess=0,isSkip;
    var obj;
    var newRow,newCol;
    var objTD;

    
    // Разбираемся с параметрами события
    ev=(ev || window.event);
    key=ev.which || ev.keyCode;
    isShift=ev.shiftKey;
    isAlt=ev.altKey;
    isCtrl=ev.ctrlKey;

    obj=(ev.target || ev.srcElement);
    
    
    // Пропускаем операции с выпадающими списками календаря
    if(obj.id=="id_cal_month"
    || obj.id=="id_cal_year")
     return;
     
    if(obj.tagName=="INPUT"
    || obj.tagName=="SELECT"
    || obj.tagName=="TEXTAREA")
     return;

    
    // Обрабатываем перемещения
    if(!isShift 
    && !isAlt
    && !isCtrl)
     if(key>=37
     && key<=40)
      {
       // Это перемешение текущей ячейки
       newRow=this.cur_y;
       newCol=this.cur_x;
       
       if(key==37)
        {
         newCol--;
         if(newCol<1)
          {
           newRow--;
           newCol=7;
          }
        }      
        else
       if(key==38)
        {
         newRow--;
        }
        else
       if(key==39)
        {
         newCol++;
         if(newCol>7)
          {
           newRow++;
           newCol=1;
          }
        }
        else
       if(key==40)
        {
         newRow++;
        }
        
       isSkip=0; 
       if(newRow<1)
         isSkip=1;
        else
       if(newRow>6)
         isSkip=1;
        else
       if(newRow==1
       && newCol<this.lim_row_1)
         isSkip=1;
        else
       if(newRow==5
       && newCol>this.lim_row_5)
         isSkip=1;
        else
       if(newRow==6
       && newCol>this.lim_row_6)
         isSkip=1;
         
       if(isSkip==0)
        {
         this.setActive(this.cur_y,this.cur_x,0);
         this.setActive(newRow,newCol,1);
        }
       
       isProcess=1;
      }
      else
     if(key==27)
      {
       // Это закрытие календаря
       this.close();
       isProcess=1;
      }
      else
     if(key==13)
      {
       // Это выбор даты
       this.submit();
       isProcess=1;
      }
      
    if(!isShift 
    && !isAlt
    && isCtrl
    && (key==37
    ||  key==39))
     {
      if(key==37)
        this.changePage(-1);
       else
      if(key==39)
        this.changePage(1);
        
      isProcess=1;
     }


    // Прекращаем обработку события
    if(isProcess)
     if(ev.preventDefault)
       ev.preventDefault;
      else
       window.event.returnValue=false;
   },
   
   
  // Сохраненный обработчик
  save_onkeydown:function(ev)
   {
   },
   
   
  // Нотификатор обновления
  update:function()
   {
   }
 };
//-->
