function setupEditButton(editId, delay)
{
  if (delay == null)
    delay = 500;

  if (! $(editId).parentNode.style.position)
  {
    Element.makePositioned($(editId).parentNode);
  }

  new OverOut($(editId).parentNode,
    function(event)
    {
      this.timer = setTimeout(function()
      {
        $(editId).style.display = 'block';
      }, delay);
    },
    function(event)
    {
      clearTimeout(this.timer);
      $(editId).style.display = 'none';
    });
}

var OverOut = Class.create();
OverOut.prototype = {
  initialize: function(element, overFunction, outFunction)
  {
    this.element = $(element);
    this.over = false;
    this.onmouseover = overFunction;
    this.onmouseout = outFunction;

    var controller = this;
    Event.observe(element, 'mouseover', function(event)
      {
        var target = controller.getRelatedTarget(event);
        //console.log("over " + Event.element(event) + " from " + target);
        if ((Event.element(event) != controller.element && controller.isChild(target)) || controller.isChild(target)) return;

        controller.onmouseover(event);
      });
    Event.observe(element, 'mouseout', function(event)
      {
        var target = controller.getRelatedTarget(event);
        //console.log("out from " + Event.element(event).id + " to " + target.id);
        if (target == controller.element || controller.isChild(target)) return;

        controller.onmouseout(event);
      });
  },

  getRelatedTarget: function(event)
    {
      if (event.type == 'mouseover') return event.relatedTarget ? event.relatedTarget : event.fromElement;
      if (event.type == 'mouseout') return event.relatedTarget ? event.relatedTarget : event.toElement;
      return null;
    },

  isChild: function(child)
    {
      if (!child) return false;
      while (child && child != this.element)
      {
        child = child.parentNode;
      }
      return child == this.element;
    }
}