(function() {
  var observe = Event.observe;
  Event.observe = function(element, eventName, handler) {
    observe(element, eventName, function(event) {
      try {
        handler(event);
      } catch (e) {
        alert(e.toString() + "\n\n" + e.stack);
        Event.stop(event);
      }
    });
  };
})();

// seo objects to display:none, thus this
Element.Methods.show = function(element) {
  element = $(element);
  if (element.hasClassName('hide')) {
    element.removeClassName('hide');
  } else {
    element.style.display = '';
  }
}

Element.Methods.hide = function(element) {
  element = $(element);
  element.addClassName('hide');
}

Element.Methods.positivelyVisible = function(element) {
  element = $(element);
  if (element.hasClassName('hide')) {
    var display = element.style.display;
    return display == 'block' || display == 'inline';
  } else {
    return element.visible();
  }
}

// we could use refresh here but for performance reasons, assume prototype patches are loaded before any js runs
// (which should always be the case) and just copy new element methods into Element
Element.show = Element.Methods.show;
Element.hide = Element.Methods.hide;
Element.positivelyVisible = Element.Methods.positivelyVisible;

// prototype extensions

Function.prototype.bindAsEventHandler = function(object) {
    var __method = this, args = $A(arguments), object = args.shift();
    return function(event) {
      event = event || window.event;
      event.stop();
      return __method.apply(object, [event].concat(args));
    }
};
