function createCheckboxLink(parent, text, f, cssclass)
{
  cssclass = cssclass || "checkable";
  var li = new Element("li");
  parent.appendChild(li);
  var a = new Element("a", { href: "#" }).update(text);
  a.checkClass = cssclass;
  li.appendChild(a);
  a.observe("click", f);
}

function addCheckboxactionsEvents()
{
  /* The "checkboxactions" element contains links to run functions that
   * check/uncheck a bunch of checkboxes.  It should be hidden and
   * only made visible on browsers where it will do something.  The
   * links are also missing the onclick event handlers. */
  var div;
  if (div = $("checkboxactions"))
  {
    div.innerHTML = "Check: ";
    var ul = new Element("ul", { "class": "inlinelist" });
    div.appendChild(ul);
    if (div.hasClassName("checkall"))
    {
      createCheckboxLink(ul, "All", checkAll);
    }
    if (div.hasClassName("checknone"))
    {
      createCheckboxLink(ul, "None", checkNone);
    }
    if (div.hasClassName("checkoverdue"))
    {
      createCheckboxLink(ul, "Overdue", checkAll, "itemoverdue");
    }
    if (div.hasClassName("checkcomplete"))
    {
      createCheckboxLink(ul, "Completed", checkAll, "itemcomplete");
    }
  }
}

function addShowAllCheckbox()
{
  var div;
  if (div = $("showall"))
  {
    var checkbox = new Element("input", { type: "checkbox" });
    div.appendChild(checkbox);
    checkbox.observe("click", showHideCompleted);
    var label = new Element("label").update(" Show completed");
    div.appendChild(label);
  }
}

function addShowNotesCheckbox()
{
  var div;
  if (div = $("shownotes"))
  {
    var checkbox = new Element("input", { type: "checkbox", checked: true });
    div.appendChild(checkbox);
    checkbox.observe("click", showHideNotes);
    var label = new Element("label").update(" Show notes");
    div.appendChild(label);
  }
}

function revealJsHidden()
{
  var els;
  if (els = $$(".jshidden"))
  {
    addCheckboxactionsEvents();
    addShowAllCheckbox();
    addShowNotesCheckbox();
    
    els.each(function(e) { e.style.visibility = "visible"; });
  }
}

Event.observe(document, "dom:loaded", revealJsHidden);

var _numCheckableChecked = 0;
var _checkableActions = [];
function checkableChanged()
{
  if (this.checked)
  {
    _numCheckableChecked++;
  }
  else
  {
    _numCheckableChecked--;
  }
  checkableUpdateButtons();
}

function checkableUpdateButtons()
{
  _checkableActions.each(function(button) { checkableUpdateThisButton(button[0], button[1], button[2]); });
}

function checkableUpdateThisButton(e, min, max)
{
  if (_numCheckableChecked >= min && (max == -1 || _numCheckableChecked <= max))
  {
    e.disabled = false;
  }
  else
  {
    e.disabled = true;
  }
}

function addCheckableAction(buttonId, min, max)
{
  max = max || -1;
  var e = $(buttonId);
  if (e == null)
  {
    alert("No element with ID \"" + buttonId + "\"");
  }
  _checkableActions.push([ e, min, max ]);
  checkableUpdateThisButton(e, min, max);
}

Event.observe(document, "dom:loaded", function() {
  $$(".checkable").each(function(e) { e.observe("click", checkableChanged)});
});

//-----------------------------------------------------------------------

function checkAll(event)
{
  var els;
  cssclass = event.element().checkClass || "checkable";
  if (cssclass != "checkable")
  {
    $$(".checkable").each(function(e) { e.checked = false; });
    els = $$("." + cssclass + " .checkable").reject(function(e) { return e.up("tr").hasClassName("itemarchive"); });
  }
  else
  {
    els = $$(".checkable");
  }
  els.each(function(e) { e.checked = true; });
  _numCheckableChecked = els.length;
  checkableUpdateButtons();
  event.stop();
}

function checkNone(event)
{
  $$(".checkable").each(function(e) { e.checked = false; });
  _numCheckableChecked = 0;
  checkableUpdateButtons();
  event.stop();
}

function showHideCompleted(event)
{
  $$(".itemcomplete").each(function(e) { e.toggleClassName("itemarchive"); });
}

function showHideNotes(event)
{
  $$(".notes").each(function(e) { e.toggleClassName("hidden"); });
}

//-----------------------------------------------------------------------

function replaceSignoutButton()
{
  var button, form;
  if ((button = $("signout")) && (form = $("signout").up("form")))
  {
    var link = new Element("a", { href: "#" }).update("Sign Out");
    form.appendChild(link);
    link.observe("click", function(event) { form.submit(); event.stop(); });
    button.remove();
  }
}

//-----------------------------------------------------------------------

function showHideHotlist(event)
{
  var e = $("hotlistdetails");
  $("hotlistflipper").toggleClassName("flipperopen");
  if (e.hasClassName("hidden"))
  {
    Effect.BlindDown("hotlistdetails", { duration: 0.5 });
  }
  else
  {
    Effect.BlindUp("hotlistdetails", { duration: 0.5 });
  }
  e.toggleClassName("hidden");
  event.stop();
  new Ajax.Request("/lists", {
    method: "get",
    parameters: { hotlist: e.hasClassName("hidden") ? "0" : "1" }
  });
}

//-----------------------------------------------------------------------

function showHideDaysOfWeek()
{
  if ($F("recurrence_simple_kind") == "1")
  {
    $("daysofweek").show();
  }
  else
  {
    $("daysofweek").hide();
  }
}

function toggleRepeatShowHide(event)
{
  var e = $("recurrence");
  e.toggleClassName("hidden");
  if (e.hasClassName("hidden"))
  {
    $("repeatshowhide").innerHTML = "(show)";
  }
  else
  {
    $("repeatshowhide").innerHTML = "(hide)";
  }
  event.stop();
}
