
var mouse_down = 0; // track if the mouse is down
var click = 0; // track unique clicks
var loading = 0;

function getDaysInMonth(year, month) {
  return [31,((!(year % 4 ) && ( (year % 100 ) || !( year % 400 ) ))?29:28),31,30,31,30,31,31,30,31,30,31][month-1];
}

function getDayOfWeek(year, month, day) {
  var date = new Date(year,month-1,day)
  return date.getDay();
}

function calendarSelectDay(day) {
  var parts = day.id.split('-');
  var year = parts[1];
  var month = parts[2];
  var day = parts[3];
  window.location = '/' + encodeURIComponent(month + '-' + day + '-' + year);
}

function calendarHilightDay(day) {
  day.style.backgroundColor = '#CCF';
}

function calendarUnhilightDay(day) {
  day.style.backgroundColor = '';
}

function calendarCreate(year, month, container) {

  var months = ['January','February','March','April','May','June','July','August','September','October','November','December'];

  if (month > 12) {
    year++;
    month = 1;
  }

  var day = 1;
  var day_of_week = getDayOfWeek(year, month, 1); // get dow for first day
  var days_in_month = getDaysInMonth(year, month);

  var label = document.createElement('div');
  label.className = 'calendar-label';
  label.appendChild(document.createTextNode(months[month-1] + ' ' + year));
  container.appendChild(label);

  var table = document.createElement('table');
  table.className = 'calendar';

  var tbody = document.createElement('tbody');
  var trow = document.createElement('tr');

  var th = document.createElement('th');
  th.appendChild(document.createTextNode('S'));
  trow.appendChild(th);

  var th = document.createElement('th');
  th.appendChild(document.createTextNode('M'));
  trow.appendChild(th);

  var th = document.createElement('th');
  th.appendChild(document.createTextNode('T'));
  trow.appendChild(th);

  var th = document.createElement('th');
  th.appendChild(document.createTextNode('W'));
  trow.appendChild(th);

  var th = document.createElement('th');
  th.appendChild(document.createTextNode('T'));
  trow.appendChild(th);

  var th = document.createElement('th');
  th.appendChild(document.createTextNode('F'));
  trow.appendChild(th);

  var th = document.createElement('th');
  th.appendChild(document.createTextNode('S'));
  trow.appendChild(th);

  tbody.appendChild(trow);

  var x=0;

  for (var row=0; day < days_in_month; row++) {
    var trow = document.createElement('tr');

    for (var cell=0; cell < 7; cell++) {
      var tcell = document.createElement('td');

      if ( (row == 0 && cell >= day_of_week) || (row > 0 && day <= days_in_month) ) {
        var text = document.createTextNode(day);

        if (year == current_year && day == current_day && month == current_month) {
            tcell.className = 'selected';
        } else {
            tcell.className = 'active';
        }

        tcell.id = 'day-' + year + '-' + month + '-' + day;
        tcell.title = 'Claim this day';
        tcell.onmouseover = function() { calendarHilightDay(this) };
        tcell.onmouseout = function() { calendarUnhilightDay(this) };
        tcell.onclick = function() { calendarSelectDay(this) };
        tcell.appendChild(text);
        day++;
      } else {
        var text = document.createTextNode(' ');
        tcell.className = 'inactive';
        tcell.appendChild(text);
      }

      trow.appendChild(tcell);
    }
    tbody.appendChild(trow);
  }

  table.appendChild(tbody);

  container.appendChild(table);
}

function calendarUpdate() {
  var box = document.getElementById('calendar-box');

  while (box.firstChild) {
    box.removeChild(box.firstChild);
  }

  if (month % 2 == 0) {
    month = month - 1;
  }

  calendarCreate(year,month,box);
  calendarCreate(year,month+1,box);    
}

function calendarSetLoading() {
    if (!loading) {
        document.getElementById('calendar-indicator').src = '/Images/loading.gif';
    }
    loading++;
}

function calendarClearLoading() {
    loading--;
    if (!loading) {
        document.getElementById('calendar-indicator').src = '/Images/spacer.gif';
    }
}
    
// Load data into the calendar object
function calendarLoadData(year, month) {
    if (month > 12) {
        month = 1;
        year++;
    }

    calendarSetLoading();

    new Ajax.Request('/ajax_month.py', {
        method:'get',
        parameters:{y:year, m:month},
        onSuccess: function(t) { 
            var text = t.responseText;
            var days = text.split('\n');
            for (var x=0; x<days.length; x++) {
                try {
                  var parts = days[x].split('\t');
                  var day = parts[0];
                  var name = parts[1];
                  var cell = document.getElementById('day-' + year + '-' + month + '-' + day);
                  cell.title = name;

                  if (month != current_month || year != current_year || day != current_day) {
                    cell.className = 'claimed';
                  }
                } catch (e) {}
            }
            calendarClearLoading();
        }
    });
}

// Change the month displayed on the calendar
//   change   1 or -1
//   delay    delay in milliseconds before updating again
//   c        unique click id (number

function calendarChangeMonth(change, delay, c) {
  // if the mouse is still down and we are on
  // the same click move update the calendars
  if (mouse_down && c == click) { 
    month += change;
    if (month < 1) {
      month = 11;
      year--;
    } else if (month > 12) {
      month = 1;
      year++;
    }
    calendarUpdate();
    if (delay > .005) delay = delay * 0.9;
    window.setTimeout('calendarChangeMonth(' + change + ',' + delay + ',' + c + ')', delay);
  }
}

// Call changeMonth to move forward a month
function calendarNext() {
  mouse_down = 1;
  click++;
  calendarChangeMonth(2,300,click);
  return true;
}

// call changeMonth to move back a month
function calendarPrevious() {
  mouse_down = 1;
  click++;
  calendarChangeMonth(-2,300,click);
  return true;
}

// clear the mouse and load info
function calendarClearMouse() {
  if (mouse_down) {
    mouse_down = 0;
    calendarLoadData(year, month);
    calendarLoadData(year, month+1);
  }
}

