window.calendar =
  {
    attach : function(object)
      {
        if (typeof(object) != 'object') object = document.getElementById(object);

        var regexp_date = /^([0-9]{2})\.([0-9]{2})\.([0-9]{4})$/;
        result = ((object.value == undefined)?false:regexp_date.exec(object.value));

        var calendar = document.createElement('div');
        calendar.className = 'calendar';
        calendar.id = object.id + '_calendar';
        calendar.style.visibility = 'hidden';
        object.parentNode.appendChild(calendar);

        if (result) calendar.innerHTML = this.refresh(object, result[3], result[2], result[1]);
        else        calendar.innerHTML = this.refresh(object);

        object.onmouseover = function(event)
          {
            calendar.style.visibility = 'visible';
          };

        object.onmouseout = function(event)
          {
            calendar.style.visibility = 'hidden';
          };

        object.onchange = function(event)
          {
            var regexp_date = /^([0-9]{2})\.([0-9]{2})\.([0-9]{4})$/;
            if (result = ((object.value == undefined)?false:regexp_date.exec(object.value))) document.getElementById(object.id + '_calendar').innerHTML = window.calendar.refresh(this, result[3], result[2], result[1]);
          };

        object.onkeyup = function(event)
          {
            var regexp_date = /^([0-9]{2})\.([0-9]{2})\.([0-9]{4})$/;
            if (result = ((object.value == undefined)?false:regexp_date.exec(object.value))) document.getElementById(object.id + '_calendar').innerHTML = window.calendar.refresh(this, result[3], result[2], result[1]);
          };

        calendar.onmouseover = function(event)
          {
            calendar.style.visibility = 'visible';
          };

        calendar.onmouseout = function(event)
          {
            calendar.style.visibility = 'hidden';
          };
      },

    refresh : function(object, year, month, day, to, index)
      {
        if (typeof(object) != 'object') object = document.getElementById(object);

        var date_int = new Array();
        date_int['year']  = parseInt(year);
        date_int['month'] = parseInt(month);
        date_int['day']   = parseInt(day);

        if ((to != undefined) && (index != undefined))
          {
            switch (to)
              {
                case('-'):
                  switch (index)
                    {
                      case ('m'):
                        if (date_int['month'] > 1)
                          {
                            date_int['month']--;
                          }
                        else
                          {
                            date_int['month'] = 12;
                            date_int['year']--;
                          }
                      break;

                      case ('y'):
                        date_int['year']--;
                      break;
                    }
                break;

                case ('+'):
                  switch (index)
                    {
                      case ('m'):
                        if (date_int['month'] < 12)
                          {
                            date_int['month']++;
                          }
                        else
                          {
                            date_int['month'] = 1;
                            date_int['year']++;
                          }
                      break;

                      case ('y'):
                        date_int['year']++;
                      break;
                    }
                break;
              }
          }

        var date_string = new Array();
        date_string['year']  = date_int['year'].toString();
        date_string['month'] = date_int['month'].toString();
        date_string['day']   = date_int['day'].toString();

        if (date_string['day'].length   == 1) date_string['day']   = '0' + date_string['day'];
        if (date_string['month'].length == 1) date_string['month'] = '0' + date_string['month'];

        result  = '<table class="calendar">';
        result += '  <tr>';
        result += '    <th colspan="7">';
        result += '      <table class="calendar_control">';
        result += '        <tr>';
        result += '          <th><div onclick="document.getElementById(\'' + object.id + '_calendar' + '\').innerHTML = window.calendar.refresh(\'' + object.id + '\', ' + date_string['year'] + ', ' + date_string['month'] + ', ' + date_string['day'] + ', \'-\', \'y\');">' + (date_int['year']  - 1) + '</div></th>';
        result += '          <th><div onclick="document.getElementById(\'' + object.id + '_calendar' + '\').innerHTML = window.calendar.refresh(\'' + object.id + '\', ' + date_string['year'] + ', ' + date_string['month'] + ', ' + date_string['day'] + ', \'-\', \'m\');">' + '<' + '</div></th>';
        result += '          <th>' + date_string['month'] + '.' + date_string['year'] + '</th>';
        result += '          <th><div onclick="document.getElementById(\'' + object.id + '_calendar' + '\').innerHTML = window.calendar.refresh(\'' + object.id + '\', ' + date_string['year'] + ', ' + date_string['month'] + ', ' + date_string['day'] + ', \'+\', \'m\');">' + '>' + '</div></th>';
        result += '          <th><div onclick="document.getElementById(\'' + object.id + '_calendar' + '\').innerHTML = window.calendar.refresh(\'' + object.id + '\', ' + date_string['year'] + ', ' + date_string['month'] + ', ' + date_string['day'] + ', \'+\', \'y\');">' + (date_int['year']  + 1) + '</div></th>';
        result += '        </tr>';
        result += '      </table>';
        result += '    </th>';
        result += '  </tr>';
        result += '  <tr>' + "\n";
        result += '    <th class="calendar_work_day">Mn</th><th class="calendar_work_day">Tu</th><th class="calendar_work_day">Wn</th><th class="calendar_work_day">Th</th><th class="calendar_work_day">Fr</th><th class="calendar_rest_day">St</th><th class="calendar_rest_day">Sn</th>' + "\n";
        result += '  </tr>' + "\n";
        result += '  <tr>';

        today = new Date();

        var week_day = 0;
        var sdate = new Date(date_string['month'] + '/01/' + date_string['year']);
        for (var day = 0; day < sdate.getDay() - 1; day++)
          {
            week_day++;
            result += '    <td></td>';
          }
        var days_in_month = this.days_in_month(date_int['month'], date_int['year']);
        for (var day = 1; day <= days_in_month; day++)
          {
            week_day++;
            day_string = day.toString(); if (day_string.length == 1) day_string = '0' + day_string;
            result += '    <td class="calendar_' + ((week_day == 6) || (week_day == 7)?'rest':'work') + (((day == today.getDate()) && (date_int['month'] == today.getMonth() + 1) && (date_int['year'] == today.getYear()))?'_to':'_') + 'day" onclick="window.document.getElementById(\'' + object.id + '\').value=\'' + day_string + '.' + date_string['month'] + '.' + date_string['year'] + '\'; document.getElementById(\'' + object.id + '_calendar' + '\').style.visibility = \'hidden\'; document.getElementById(\'' + object.id + '\').onkeydown();"><div onmouseover="this.classname=\'calendar_active\'" onmouseout="this.className=\'\'">' + day + '</div></td>';

            if (week_day == 7)
              {
                result += "</tr><tr>";
                week_day = 0;
              }
          }
        result += '  </tr>';
        result += '</table>';

        return result;
      },

    days_in_month : function(m, y)
      {
        var monthes = new Array(null, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
        return (((m == 2) && (y % 4 == 0))?29:(monthes[m]));
      }
  }