// Кол-во дней по месяцам в обычном и високосном годах
var monthmaxdays    = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
var monthmaxdaysvys = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
var monthnames = ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"];

// Минимальная возможная дата
var absmindate = new Date(2007, 5, 8, 0, 0, 0, 0);

// Сдвиг на shift месяцев от заданной даты
function shiftmonth(_init, shift) {
  var init = new Date(_init.getTime());  var forward = (shift > 0 ? true : false);
  var count = Math.abs(shift);
  for (var i=1; i <= count; i++) {    var curmonth = init.getMonth();
    var nextmonth = 0;
    if (forward) {      nextmonth = curmonth+1;
      if (nextmonth == 12) {        nextmonth = 0;
        init.setFullYear(init.getFullYear()+1);
      }
    } else {      nextmonth = curmonth-1;
      if (nextmonth == -1) {
        nextmonth = 11;
        init.setFullYear(init.getFullYear()-1);
      }
    }
    init.setMonth(nextmonth);
  }
  return init;
}

// Строим календарь на заданный месяц
function buildcalendar(year, month) {
  var daysarray = (year % 4 ? monthmaxdays : monthmaxdaysvys);
  delete initmonth;  initmonth = new Date(year, month, 1, 0, 0, 0, 0);
  if (initmonth.getTime() >= absmaxdate.getTime()) initmonth = new Date(absmaxdate.getFullYear(), absmaxdate.getMonth(), 1, 0, 0, 0, 0);
  if (initmonth.getTime() <= absmindate.getTime()) initmonth = new Date(absmindate.getFullYear(), absmindate.getMonth(), 1, 0, 0, 0, 0);
  var startday = initmonth.getDay();
  if (startday == 0) startday = 7;
  var curday = 1;
  $("TD[id^=cal_cell_]").html("&nbsp;").removeClass("cal_selected");
  for (var i=startday; i <= daysarray[initmonth.getMonth()]+startday-1; i++) {
    var curdate = new Date(initmonth.getFullYear(), initmonth.getMonth(), curday, 0, 0, 0, 0);
    if ((curdate.getTime() >= absmindate.getTime()) && (curdate.getTime() <= absmaxdate.getTime())) {
      $("#cal_cell_"+i).html("<a href='./?year="+initmonth.getFullYear()+"&month="+(initmonth.getMonth()+1)+"&day="+curday+"'>"+curday+"</a>");
    } else {      $("#cal_cell_"+i).html(""+curday+"");
    }
    if ((curdate.getFullYear()==requestdate.getFullYear()) && (curdate.getMonth()==requestdate.getMonth()) && (curday==requestdate.getDate())) {      $("#cal_cell_"+i).addClass("cal_selected");
    }
    curday++;
  }

  var startpoint = -2;
  var normabsmin = 12*absmindate.getFullYear() + absmindate.getMonth();
  var normabsmax = 12*absmaxdate.getFullYear() + absmaxdate.getMonth();
  var normcurrent = 12*initmonth.getFullYear() + initmonth.getMonth();
  if (normcurrent - normabsmin < 2) startpoint = normabsmin - normcurrent;
  if (normabsmax - normcurrent < 2) startpoint = normabsmax - normcurrent - 4;
  var monthstr = '';
  for (var i=startpoint; i<=startpoint+4; i++) {    var nextdate = shiftmonth(initmonth, i);
    monthstr += "<a href='#' "+(eval(i)==0 ? "class='current' " : "")+"onclick='buildcalendar("+eval(nextdate.getFullYear())+", "+eval(nextdate.getMonth())+"); return false;'>"+monthnames[eval(nextdate.getMonth())]+" "+eval(nextdate.getFullYear())+"</a> ";
    delete nextdate;
  }
  $("#month_cont").html(monthstr);
}

function prevyear() {  initmonth.setFullYear(initmonth.getFullYear()-1);
  buildcalendar(initmonth.getFullYear(), initmonth.getMonth());
}

function nextyear() {
  initmonth.setFullYear(initmonth.getFullYear()+1);
  buildcalendar(initmonth.getFullYear(), initmonth.getMonth());
}

function prevmonth() {
  initmonth = shiftmonth(initmonth, -1);
  buildcalendar(initmonth.getFullYear(), initmonth.getMonth());
}

function nextmonth() {
  initmonth = shiftmonth(initmonth, 1);
  buildcalendar(initmonth.getFullYear(), initmonth.getMonth());
}