Function.prototype.proxy = function(thisObject) { return jQuery.proxy(this, thisObject); };

Array.prototype.remove = function(element) {
  var index = this.indexOf(element);
  if (index >= 0)
    this.deleteAtIndex(index);
};

Array.prototype.deleteAtIndex = function(index) { this.splice(index, 1); }

contains = function(collection, target) {
  return (collection.indexOf(target) >= 0);
};

bound = function(value, min, max) {
  return Math.max(min, Math.min(value, max));
}

now = function() { return (new Date()).getTime(); }

/*
 * Mimicks the DOM event listener API, enabling it for plain javascript classes.
 */
EventDispatcher = {
  _getListeners: function(eventName) {
    if (!this.listeners)
      this.listeners = {};
    return (this.listeners[eventName] = (this.listeners[eventName] || []));
  },

  addEventListener: function(eventName, callback) {
    var callbacks = this._getListeners(eventName);
    if (callbacks.indexOf(callback) == -1)
      callbacks.push(callback);
  },

  removeEventListener: function(eventName, callback) {
    this._getListeners(eventName).remove(callback);
  },

  dispatchEvent: function(event) {
    var callbacks = this._getListeners(event.type);
    for (var i = 0; i < callbacks.length; i++)
      callbacks[i].call(null, event);
  }
}

/*
 * Creates a new event. You can dispatch this event on DOM elements.
 */
var newEvent = function(eventType, bubbles, properties) {
  var event = document.createEvent("Event");
  event.initEvent(eventType, bubbles || false, /* cancelable*/ false);
  for (var key in properties)
    event[key] = properties[key];
  return event;
};

function hashToQueryString(hash) {
  var params = [];
  for (var key in hash)
    params.push(key + "=" + hash[key]);
  return params.join("&");
}
