

  function hasEvent(day, month, events) {
    var date = month + (day < 10 ? '0' + day : day) + '';
    for (var i=0;i<events.length;++i) {
      var startDate = DateFormatter.format(new Date(events[i].startDate), 'Ymd');
      var endDate = DateFormatter.format(new Date(events[i].endDate), 'Ymd');
      var startDay = DateFormatter.format(new Date(events[i].startDate), 'j');
      var endDay = DateFormatter.format(new Date(events[i].endDate), 'j');
      if (events[i].endDate == 0 || startDate == endDate) {
        if (day == startDay) {
          return true;
        }
      } else if (startDate < endDate) {
        if (date >= startDate && date <= endDate) {
          return true;
        }
      }
    }
    return false;
  }

  function eventsReceived(result) {
        var x = document.getElementById(result.resultDiv);
        x.innerHTML = "";
        x.style.display = 'block';
        var lang = result.lang;
          var prevMonth = DateFormatter.format(new Date(result.prevMonth), "Ym", lang);
          var month = DateFormatter.format(new Date(result.month), "Ym", lang);
          var monthStr = DateFormatter.format(new Date(result.month), "F Y", lang);
          var nextMonth = DateFormatter.format(new Date(result.nextMonth), "Ym", lang);

          var code = '<table class="cal" cellspacing="0" border="0">';

          // days header
          code += '<tr>';
          for (i=1;i<=7;++i) {
            var d = (i>=7?i-7:i);
            code += '<th class="cal_day_title" title="' + $.datepicker.regional[lang]['dayNames'][d] + '">' + $.datepicker.regional[lang]['dayNamesMin'][d] + '</td>';
          }
          code += '</tr>';

          var day = 1;
          var startWeekDay = DateFormatter.startWeekDay(new Date(result.month));
          var lastDayOfMonth = DateFormatter.lastDayOfMonth(new Date(result.month));

          // first row of days
          code += '<tr>';
          for (i=1;i<=7;++i) {
            if (i < startWeekDay) {
              code += '<td class="cal_day">&nbsp;</td>';
            } else {
              if (hasEvent(day, month, result.events)) {
                code += '<td class="cal_active"><a class="cal_active" href="module/event/show?month=' + month + '&day='+day+'" >' + day + '</a></td>';
              } else {
                code += '<td class="cal_day">' + day + '</td>';
              }
              day++;
            }
          }
          code += '</tr>';

          // middle days
          while (day + 7 <= lastDayOfMonth) {
            code += '<tr>';
            for (i=1;i<=7;++i) {
              if (hasEvent(day, month, result.events)) {
                code += '<td class="cal_active"><a class="cal_active" href="module/event/show?month=' + month + '&day='+day+'">' + day + '</a></td>';
              } else {
                code += '<td class="cal_day">' + day + '</td>';
              }
              day++;
            }
            code += '</tr>';
          }

          // last row of days
          finalEmptyFields = day - lastDayOfMonth + 6;
          code += '<tr>';
          while (day <= lastDayOfMonth) {
            if (hasEvent(day, month, result.events)) {
              code += '<td class="cal_active"><a class="cal_active" href="module/event/show?month=' + month + '&day='+day+'">' + day + '</a></td>';
            } else {
              code += '<td class="cal_day">' + day + '</td>';
            }
            day++;
          }
          for (i=0;i<finalEmptyFields;++i) {
            code += '<td class="cal_day">&nbsp;</td>';
          }
          code += '</tr>';

          // navigation
          code += '<tr><td colspan="7" class="cal_nav">';
          code += '<a class="cal_nav" href="#" onclick="renderCalendar(\'' + result.resultDiv + '\', \'' + prevMonth + '\', \'' + lang + '\');return false;">&laquo;</a>';
          code += '<a class="cal_cur_date" href="module/event/show?month='+month+'">' + monthStr + '</a>';
          code += '<a class="cal_nav" href="#" onclick="renderCalendar(\'' + result.resultDiv + '\', \'' + nextMonth + '\', \'' + lang + '\');return false;">&raquo;</a>';
          code += '</td></tr>';
          code += '</table>';
          x.innerHTML = code;
  }

  function renderCalendar(div, month, lang) {
    $.getJSON('/s/jsonevent', { method : 'getEvents', month : month, resultDiv : div, lang : lang}, eventsReceived);
  }
