//Ajax javascript file, rebuilds the calendar table using new data


//Our XMLHTTPRequest should have already been defined in another file, and should already exist
//If not, fail

if (!window.XMLHttpRequest) {
  alert ("No XMLHttpRequest Available");

}

function showCalendar(Month, Year) {

  var oXMLHttpRequest = new XMLHttpRequest;
  url = "http://www.aviary.org/calendar/calxmlnew.php";
  url = url+"?Month="+Month+"&Year="+Year;
  oXMLHttpRequest.open("GET",url,true);
  oXMLHttpRequest.onreadystatechange = function() {
        if (this.readyState == XMLHttpRequest.DONE) {
	  var xmlDoc = oXMLHttpRequest.responseXML;
	  insert_calendar(xmlDoc);
	    }
  }

  oXMLHttpRequest.send(null);

}

function insert_calendar(xmlDoc) {
    var calendar = build_calendar(xmlDoc);
  if (calendar == "bad data") {
    return;
  }

    if(document.getElementById("calendar_table") == null) {
      cal_div = document.getElementById("calendar");
      cal_div.appendChild(calendar);
    }
    else {
      var oldtable = document.getElementById("calendar_table");

      document.getElementById("calendar").replaceChild(calendar, oldtable);
    }
}


function build_calendar(xml_data) {
  if (!xml_data) {
    return "bad data";
  }

  var calendar_table = document.createElement("table");
  calendar_table.id = "calendar_table";
  var cal_header = document.createElement("tr");
  var thead = document.createElement("thead");
  var tbody = document.createElement("tbody");

  //Calendar header
  var th = document.createElement("th");
  th.className = "calheader";
  th.colSpan = "5";
  th.valign = "right";

  //Previous Button
  var className = "button";
  var prev = xml_data.getElementsByTagName("prev");

  if(xml_data.getElementsByTagName("prev").length > 0)  {

    var image = "<img src=\"http://www.aviary.org/image/cal_prev.gif\"  alt=\"Prev\" />";

    var PrevMonth = prev[0].getElementsByTagName("month")[0].firstChild.data;
    var PrevYear = prev[0].getElementsByTagName("year")[0].firstChild.data;

    var prev_button = build_button("Prev", PrevMonth, PrevYear, image, className);
    if (prev_button == null) {
    //We didn't get the data we needed for this to work, going to attempt to silently fail.
    return null;
    }

    cal_header.appendChild(prev_button);
    }
    else  {
      th.colSpan = "6";
    }


  //Current Month and Year Header
  var Month = xml_data.getElementsByTagName("current")[0].getElementsByTagName("month")[0].firstChild.data - 1;
  var Month_Name = xml_data.getElementsByTagName("current")[0].getElementsByTagName("month_name")[0].firstChild.data;
  var Year = xml_data.getElementsByTagName("current")[0].getElementsByTagName("year")[0].firstChild.data;
  th.innerHTML = Month_Name + " " + Year;
  cal_header.appendChild(th);



  //Next Button
  var image = "<img src=\"http://www.aviary.org/image/cal_next.gif\"  alt=\"Next\" />";

  link = xml_data.getElementsByTagName("next");
  var NextMonth = link[0].getElementsByTagName("month")[0].firstChild.data;
  var NextYear = link[0].getElementsByTagName("year")[0].firstChild.data;

  var next_button = build_button("Next", NextMonth, NextYear, image, className);
  if (next_button == null) {
    //We didn't get the data we needed for this to work, going to attempt to silently fail.
    return null;
  }

  cal_header.appendChild(next_button);
  thead.appendChild(cal_header);

  //Append the table head to the table
  calendar_table.appendChild(thead);
  var events = xml_data.getElementsByTagName("data")[0];
  var days = xml_data.getElementsByTagName("current")[0].getElementsByTagName("days")[0].firstChild.data;

  var weekdays = [ "Su", "Mo", "Tu", "We", "Th", "Fr", "Sa" ];


  var cal_body = build_rows(events, findStartday(Month, Year), days, Month+1, Year, weekdays);

  calendar_table.appendChild(cal_body);

  return calendar_table;

}

function build_button(Name, Month, Year, link, className) {
  //Build one of the header buttons, (Prev|Next).

  if(!Name | !Month | !Year | !link) {
    return null;
  }

  var button_td = document.createElement("td");
  button_td.innerHTML = link;
  button_td.className = className;
  button_td.onclick =function() {
    showCalendar(Month, Year);
  }

  return button_td;
}

function findStartday (month, year) {
  //Find what day of the week the current month begins on.
  //If bad values are passed in, just find the start of the current month.
  month = Number(month);
  year = Number(year);

  var date_obj = new Date();

  if(month == Number.Nan | year == Number.Nan) {
    date_obj.setDate(1);
    return date_obj.getDay();
  }

  date_obj.setFullYear(year);
  date_obj.setMonth(month);
  date_obj.setDate(1);
  return date_obj.getDay();

}

function event_everyday (event) {
  //Determine if an event occurs on specific days of the week, or if it occurs everyday.

  if(!event) {
    return false;
  }
  var weekdays = event.getElementsByTagName("weekdays")[0].firstChild.data;

  for (var i = 0; i <= weekdays.length - 1; i++) {
    if (weekdays.charAt(i) == 1)
      return false;
  }

  return true;

}

function build_events_object(events) {

  var date_obj = new Object();
  if (!events) {
    return events_obj;
  }

  var event_list = events.getElementsByTagName("Event");
  var events_obj = new Array(event_list.length);

  for(var event = 0; event < event_list.length; event++) {
    var event_obj = new Object();
    var split_start = event_list.item(event).getElementsByTagName("start_date")[0].firstChild.data.split("-");
    var split_end = event_list.item(event).getElementsByTagName("end_date")[0].firstChild.data.split("-");

    event_obj.start_year = split_start[0];
    event_obj.start_month = split_start[1];
    event_obj.start_day = split_start[2];

    event_obj.end_year = split_end[0];
    event_obj.end_month = split_end[1];
    event_obj.end_day = split_end[2];

    event_obj.weekdays = event_list.item(event).getElementsByTagName("weekdays")[0].firstChild.data;
    event_obj.title = event_list.item(event).getElementsByTagName("title")[0].firstChild.data;
    event_obj.everyday = event_everyday(event_list.item(event));
    if(event_list.item(event).getElementsByTagName("time")[0].firstChild != null) {
      event_obj.time = event_list.item(event).getElementsByTagName("time")[0].firstChild.data;
    }


    events_obj[event] = event_obj;

  }

  return events_obj;
}

function check_event_day(event_obj, day_of_week) {

  if(!event_obj || day_of_week > 6 || day_of_week < 0) {
    return false;
  }
  var check = event_obj.weekdays.charAt(day_of_week);
  if (check == "0")
    return false;
  else if (check == "1")
    return true;


}


function build_rows(events, startday, month_length, month, year, weekdays) {
  //Create a table body element, then build the rows for the calendar and return
  //the new table body element



  var event_list = build_events_object(events);


  if (startday == Number.Nan | !events | !month_length) {
    //Fail if our passed arguments are bogus for some reason
    return null;
  }

  var tbody = document.createElement("tbody");
  var tr = document.createElement("tr");
  var row_position = 0;

  //Build Week Days
  for(var i = 0; i < weekdays.length; i++) {
    var day_td = document.createElement("td");
    day_td.className = "weekday";
    day_td.innerHTML = weekdays[i];
    tr.appendChild(day_td);
  }

  tbody.appendChild(tr);
  tr = document.createElement("tr");

  //Build blank spaces
  for(var position = 0; position < startday; position++) {
    row_position++;

    var day_td = document.createElement("td");
    day_td.className = "blankday";
    day_td.innerHTML = "&nbsp;";
    tr.appendChild(day_td);

  }

  //Build normal cells
  for(var day = 1; day <= month_length; day++ ) {

    var day_td = document.createElement("td");
    var daily_events = new Array();

    for(var i = 0; i < event_list.length; i++) {

      //Check if our event occurs on this day
      var start_date_check = (event_list[i].start_year < year)
	|| (event_list[i].start_year <= year && event_list[i].start_month < month) ||
	(event_list[i].start_year <= year && event_list[i].start_month <= month && event_list[i].start_day <= day);

       var end_date_check = (event_list[i].end_year > year)
	|| (event_list[i].end_year >= year && event_list[i].end_month > month) ||
	(event_list[i].end_year >= year && event_list[i].end_month >= month && event_list[i].end_day >= day);


      var specific_day_check = check_event_day(event_list[i], row_position);
      var everyday_check = event_list[i].everyday;
      var check = (start_date_check && end_date_check) && (specific_day_check || everyday_check);

      if (check) {
	if(event_list[i].time != undefined) {

	  daily_events.push(event_list[i].time + "--" + event_list[i].title);
	}
	else {
	  daily_events.push(event_list[i].title);
	}

	day_td.className = "special";
	day_td.innerHTML =  "<a href=\"http://www.aviary.org/vis/specEv.php\">" + day + "</a>";
      }
    }

    if (day_td.className == "special") {


      var popup_val = "";
      for (var i = 0; i < daily_events.length; i++) {
	popup_val = popup_val + daily_events[i] + "<br />";
      }

      day_td.onmouseover = popup_closure(popup_val);
      day_td.onmouseout = function() {
	kill();
      };

    }

    if(day_td.innerHTML == "") {
          day_td.innerHTML = day;
	  day_td.className = "normal";
    }


    tr.appendChild(day_td);



    row_position++;



    if (row_position == 7 && (day < month_length )) {
      tbody.appendChild(tr);
      tr = document.createElement("tr");
      row_position = 0;
    }


    }

  if (row_position < 7) {
    while (row_position < 7) {
      row_position++;
      var day_td = document.createElement("td");
      day_td.className = "blankday";
      day_td.innerHTML = "&nbsp;";
      tr.appendChild(day_td);
      }
    }
  tbody.appendChild(tr);

  return tbody;


}

function popup_closure (popup_val) {
  return function () {
    popup(popup_val, '#ccbedb');
  }
}

