//Return the number of days in the month for the given date
//Called by writeCalendar
//Parameter: date - Javascript Date object
function numDays(date)
{ var year = date.getFullYear();
  switch(date.getMonth())
  { case 1:
      if(year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
      { return 29;
      } else
        { return 28;
        }
    case 3:
      return 30;
    case 5:
      return 30;
    case 8:
      return 30;
    case 10:
      return 30;
    default:
      return 31;
  }
}

//Function called when selecting a particular month from the month menu of the calendar
//Parameter: m - Zero-based month value (0=January, 1=February, . . . , 11=December)
function changeMonth(m)
{ $("#monthPosition2").slideUp();
  var monthDivInner = document.getElementById("monthDivInner");
  monthDivInner.innerHTML = document.getElementById(m).innerHTML
  monthDivInner.value = m;
  writeCalendar(document.getElementById("yearDivInner").innerHTML,m);
}

//Function called when selecting a particular year from the year menu of the calendar
//Parameter: y - Four-digit year
function changeYear(y)
{ $("#yearPosition2").slideUp();
  document.getElementById("yearDivInner").innerHTML = y;
  writeCalendar(y,document.getElementById("monthDivInner").value);
}

//writeCalendar called directly from calendarDivs.txt right after calling setEvents (see eventsfunctions.js)
//Assumes events array has been set up (done by setEvents in eventsfunctions.js when page loads first time)
//Parameters: y - Four-digit year
//            m - Zero-based month value (0=January, 1=February, . . . , 11=December)
function writeCalendar(y,m)
{ var displaymonth = new Date();
  var today = displaymonth.getFullYear()+"."+(displaymonth.getMonth()+1)+"."+displaymonth.getDate();
  displaymonth.setFullYear(y,m,1);
  var selectedmonth = document.getElementById("monthDivInner");
  selectedmonth.value = m;
  var selectedyear = document.getElementById("yearDivInner");
  selectedmonth.innerHTML = document.getElementById(m).innerHTML;
  selectedyear.innerHTML = y;
  var currentday = 1;
  var numdays = numDays(displaymonth);
  var newcaltable = "<table id='calendar' border='0px' cellspacing='1px' cellpadding='3px'><tr><td id='su' class='dayName'>Su</td><td id='mo' class='dayName'>Mo</td><td id='tu' class='dayName'>Tu</td><td id='we' class='dayName'>We</td><td id='th' class='dayName'>Th</td><td id='fr' class='dayName'>Fr</td><td id='sa' class='dayName'>Sa</td></tr><tr>";
//FIRST EMPTY CELLS
  if(displaymonth.getDay() > 0)
  { for(var i=0; i<displaymonth.getDay(); i++)
    { newcaltable += "<td class='calDayNoDate'>&nbsp;</td>";
    }
  }
//REST OF FIRST ROW
  for(var i=displaymonth.getDay(); i<7; i++)
  { var eventmonth = displaymonth.getMonth()+1;
    var eventdate = displaymonth.getFullYear()+"."+eventmonth+"."+currentday;
    if(events[eventdate] != null)
    { newcaltable += "<td class='eventDay' onclick='window.location=\"events.shtml\"' value=\"";
      for(var j=0; j<events[eventdate].length-1; j++)
      { newcaltable += events[eventdate][j][1].replace(/\"/g,"\\\"")+"<br><br>";
      }
      newcaltable += events[eventdate][events[eventdate].length-1][1].replace(/\"/g,"\\\"")+"\"";
    } else
      { newcaltable += "<td class='calDay'";
      }
    if(eventdate == today)
    { newcaltable += " style='text-decoration:underline;'";
    }
    newcaltable += ">"+currentday+"</td>";
    currentday++;
  }
  newcaltable += "</tr>";
//MAIN CALENDAR ROWS
  while(currentday+7 <= numdays)
  { newcaltable += "<tr>";
    for(var i=0; i<7; i++)
    { var eventmonth = displaymonth.getMonth()+1;
      var eventdate = displaymonth.getFullYear()+"."+eventmonth+"."+currentday;
      if(events[eventdate] != null)
      { newcaltable += "<td class='eventDay' onclick='window.location=\"events.shtml\"' value=\"";
        for(var j=0; j<events[eventdate].length-1; j++)
        { newcaltable += events[eventdate][j][1].replace(/\"/g,"\\\"")+"<br><br>";
        }
        newcaltable += events[eventdate][events[eventdate].length-1][1].replace(/\"/g,"\\\"")+"\"";
      } else
        { newcaltable += "<td class='calDay'";
        }
      if(eventdate == today)
      { newcaltable += " style='text-decoration:underline;'";
      }
      newcaltable += ">"+currentday+"</td>";
      currentday++;
    }
    newcaltable += "</tr>";
  }
//LAST ROW
  displaymonth.setDate(numdays);
  newcaltable += "<tr>";
  for(var i=0; i<=displaymonth.getDay(); i++)
  { var eventmonth = displaymonth.getMonth()+1;
    var eventdate = displaymonth.getFullYear()+"."+eventmonth+"."+currentday;
    if(events[eventdate] != null)
    { newcaltable += "<td class='eventDay' onclick='window.location=\"events.shtml\"' value=\"";
      for(var j=0; j<events[eventdate].length-1; j++)
      { newcaltable += events[eventdate][j][1].replace(/\"/g,"\\\"")+"<br><br>";
      }
      newcaltable += events[eventdate][events[eventdate].length-1][1].replace(/\"/g,"\\\"")+"\"";
    } else
      { newcaltable += "<td class='calDay'";
      }
    if(eventdate == today)
    { newcaltable += " style='text-decoration:underline;'";
    }
    newcaltable += ">"+currentday+"</td>";
    currentday++;
  }
//LAST EMPTY CELLS
  if(displaymonth.getDay() % 7 < 6)
  { for(var i = displaymonth.getDay()+1 % 7; i<7; i++)
    { newcaltable += "<td class='calDayNoDate'>&nbsp;</td>";
    }
  }
//WEEKLY EVENTS ROW
  newcaltable += "</tr><tr><td class='weekly' style='cursor:pointer;' onmouseover='this.className=\"weeklyHighlight\"; window.status=\"http://cpnaz.org/events.shtml#weekly\"' onmouseout='this.className=\"weekly\"; window.status=\"\"' onclick='window.location=\"events.shtml#weekly\"' colspan='7'>Weekly Events</td></tr></table>";
  var calcell = document.getElementById("calcell");
  calcell.innerHTML = newcaltable;
  var daynames = new Array(document.getElementById("su"), document.getElementById("mo"), document.getElementById("tu"), document.getElementById("we"), document.getElementById("th"), document.getElementById("fr"),document.getElementById("sa"));
  var maxdaywidth = maxDayWidth(daynames);
  document.getElementById("calendar").style.width = 7*(maxdaywidth+1)+1+"px";
  for(var i=0; i<daynames.length; i++)
  { daynames[i].style.width = maxdaywidth+"px";
  }
  $("td.eventDay").hover(showEvents,hideEvents);  //jQuery - bind hover actions to "eventDay" td class
}

//Function to change the month on the calendar by one
//Called when user clicks left or right arrows/triangles on the calendar
//Parameter: plusminus - 1 to go forward one month, -1 to go back one month
function adjMonth(plusminus)
{ var selectedmonth = document.getElementById("monthDivInner");
  var selectedyear = document.getElementById("yearDivInner");
  var newmonth = (parseInt(selectedmonth.value) + 12 + plusminus) % 12;
  selectedmonth.innerHTML = document.getElementById(newmonth).innerHTML;
  selectedmonth.value = newmonth;
  if((newmonth==0 && plusminus==1) || (newmonth==11 && plusminus==-1))
  { selectedyear.innerHTML = parseInt(selectedyear.innerHTML) + plusminus;
  }
  writeCalendar(parseInt(selectedyear.innerHTML),parseInt(selectedmonth.value));
}

//Used by writeCalendar to make sure all columns are the same width
function maxDayWidth(arrayobj)
{ var tempmax = 0;
  for(var i=0; i<arrayobj.length; i++)
  { tempmax = Math.max(tempmax, arrayobj[i].offsetWidth);
  }
  return tempmax;
}

//Works with jQuery to show month/year menu when user mouses over one
function showMYMenu(event)
{ var oParentMenu = $(event.relatedTarget).parents("div.selectedMY");
  var nParentMenu = $(event.currentTarget).parents("div.selectedMY");
  var nMenu = nParentMenu.find("div.MYPosition2");
  if(nMenu.length > 0)
  { if((oParentMenu.attr("id") != nParentMenu.attr("id")) && (event.currentTarget.className == "selectedMYInner"))
    { nMenu.stop(true,true);
      nMenu.delay("fast").slideDown();
    }
  }
}

//Works with jQuery to hide month/year menu when user mouses off one
function hideMYMenu(event)
{ var oParentMenu = $(event.currentTarget).parents("div.selectedMY");
  var nParentMenu = $(event.relatedTarget).parents("div.selectedMY");
  if(oParentMenu.attr("id") != nParentMenu.attr("id"))
  { var oParentSubMenu = oParentMenu.find("div.MYPosition2");
    if(oParentSubMenu.length > 0)
    { if(oParentSubMenu.queue().length > 1)  //Try to account for the delay function on the queue (there may be other situations where length>1)
      { oParentSubMenu.stop(true,true);
      }
      oParentSubMenu.slideUp();
    }
  }
}

//Works with jQuery to show event description when user mouses over a highlighted calendar day
function showEvents()
{ window.status="http://cpnaz.org/events.shtml";
  var eventsDivInner = document.getElementById("eventsDivInner");
  if(eventsDivInner.innerHTML != "")
  { $("#eventsDivInner").stop(true,true);
  }
  $("#eventsDivInner").html($(this).attr("value")).fadeIn("normal");
}

//Works with jQuery to hide event description when user mouses off a highlighted calendar day
function hideEvents()
{ window.status="";
  $("#eventsDivInner").fadeOut(100,clearText);
}

//Works with jQuery when hiding event description
function clearText()
{ var eventsDivInner = document.getElementById("eventsDivInner");
  eventsDivInner.innerHTML = "";
}