//-event------------------------------------------------------------------------
var Event = new Object();
Event.observe = function() {
  if ( window.addEventListener ) {
    return function(el, type, fn) {
      el.addEventListener(type, fn, false);
    };
  } else if ( window.attachEvent ) {
    return function(el, type, fn) {
      var f = function() {
        fn.call(el, window.event);
      };
      el.attachEvent('on'+type, f);
    };
  } else {
    return function(el, type, fn) {
      element['on'+type] = fn;
    }
  }
}();
Event.stop = function(e) {
  if (!e) e = window.event;
  if (e.stopPropagation) {
    e.stopPropagation();
  } else {
    e.cancelBubble = true;
  }
}
Event.cancel = function(e) {
  if (!e) e = window.event;
  if (e.preventDefault) {
    e.preventDefault();
  } else {
    e.returnValue = false;
  }
}
Event.delegate = function(e) {
  if (!e) e = window.event;
  return e.target || e.srcElement;
}
Event.receive = function(e) {
  if (!e) e = window.event;
  if (e.currentTarget) {
    return e.currentTarget;
  } else {
    return false;
  }
}
Event.position = function(e) {
  if (!e) var e = window.event;
  var position = new Object();
  position.x = e.screenX;
  position.y = e.screenY;
  if (e.pageX || e.pageY) {
    position.left = e.pageX;
    position.top = e.pageY;
  } else if (e.clientX || e.clientY) {
    position.left = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
    position.top = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
  }
  return position;
}
Event.key = function(e) {
  var code = null;
  if (e.keyCode) {
    code = e.keyCode;
  } else if (e.which) {
    code = e.which;
  }
  return code;
}

function callback(instance, method) {
  return function() {
    method.apply(instance, arguments);
  }
}

