function MouseHandler() {
  // adapted from legacy DragHandler() object
  var self = this;
  this.disabled = 0;
  this.disableDrag = function() {
    this.disabled = 1;
    this.mouseup();
    addEventHandler(document,'mouseup',this.enableDrag);
  }
  this.enableDrag = function() {
    self.disabled = 0;
    self.mouseup();
  }
  this.startDrag = function(o,e) {
    e = e?e:event;
    if (this.disabled) return false;
    if (typeof(o)=='event'||(!o && event)) {
      o = typeof(o)!='undefined'?o.target:(event?event.srcElement:null);
    }
    if ((e.target?e.target:e.srcElement).nodeName.toLowerCase()=='input') return false; // disallow drag on input fields
    if (o) self.setTarget(o);
    self.offX = e.clientX - self.o.offsetLeft;
    self.offY = e.clientY - self.o.offsetTop;
    // search bar hack
    if (o.id && o.id == 'container') self.offX -= 128;
    addEventHandler(document,'mousemove',self.mousemove);
    addEventHandler(document,'mouseup',self.mouseup);
  }
  this.mousemove = function(e) {
    e = e?e:event;
    self.o.style.left = e.clientX - self.offX+'px';
    self.o.style.top = e.clientY - self.offY+'px';
    self.stopBubbleHandler(e);
    return false;
  }
  this.mouseup = function() {
    removeEventHandler(document,'mousemove',self.mousemove);
    removeEventHandler(document,'mouseup',self.mouseup);
  }
  this.setTarget = function(o) {
    if (this.disabled) return false;
    this.o = o;
    this.o.onmouseover = this.stopBubbleHandler;
    this.o.onmouseout = this.o.onmouseover;
  }
  this.cancelBubble = function() {
    event.cancelBubble = true;
  }
  this.stopPropagation = function(e) {
    e.stopPropagation();
  }
/*
  this.getMouse = function(e) {
    self.mouse = e||event;
    removeEventHandler(document,'mousemove',self.getMouse);
  }
*/
  this.stopBubbleHandler = (navigator.appName.indexOf('Microsoft')?this.stopPropagation:this.cancelBubble);
  this.mouse = null;
  this.offX = 0;
  this.offY = 0;
  this.o = null;
  //addEventHandler(document,'mousemove',this.getMouse);
}

mouseHandler = new MouseHandler();
