// Based on http://www.ditchnet.org/hotspot/
var box;
var dX, dY;

function getX(node) {
    return node ? parseInt(node.offsetLeft) : false;
}

function getY(node) {
    return node ? parseInt(node.offsetTop) : false;
}

function setX(node,x) {
    node.style.left = x + "px";
}

function setY(node,y) {
    node.style.top = y + "px";
}

function Evt(evt) {
    this.evt = evt ? evt : window.event; 
    this.source = evt.target ? evt.target : evt.srcElement;
    this.x = evt.pageX ? evt.pageX : evt.clientX;
    this.y = evt.pageY ? evt.pageY : evt.clientY;
}

Evt.prototype.toString = function () {
    return "Evt [ x = " + this.x + ", y = " + this.y + " ]";
};

Evt.prototype.consume = function () {
    if (this.evt.stopPropagation) {
        this.evt.stopPropagation();
        this.evt.preventDefault();
    } else if (this.evt.cancelBubble) {
        this.evt.cancelBubble = true;
        this.evt.returnValue  = false;
    }
};

Evt.addEventListener = function (target,type,func,bubbles) {
    if (document.addEventListener) {
        target.addEventListener(type,func,bubbles);
    } else if (document.attachEvent) {
        target.attachEvent("on"+type,func,bubbles);
    } else {
        target["on"+type] = func;
    }
};

Evt.removeEventListener = function (target,type,func,bubbles) {
    if (document.removeEventListener) {
        target.removeEventListener(type,func,bubbles);
    } else if (document.detachEvent) {
        target.detachEvent("on"+type,func,bubbles);
    } else {
        target["on"+type] = null;
    }
};

function dragPress(evt,what) {
    evt = new Evt(evt);
	if(box = evt.source.parentNode) {
		// Safari is weird about this
		if(box.nodeName == "H1") box = box.parentNode;

		dX = evt.x - getX(box);
		dY = evt.y - getY(box);
		Evt.addEventListener(document,"mousemove",dragMove,false);
		Evt.addEventListener(document,"mouseup",dragRelease,false);
		// Prevent text selection while dragging
		document.body.ondrag = function () { return false ; }
		document.body.onselectstart = function () { return false ; }
		evt.consume();
	}
}

function dragMove(evt) {
    evt = new Evt(evt);
    setX(box,evt.x - dX);
    setY(box,evt.y - dY);
    evt.consume();
}

function dragRelease(evt) {
    evt = new Evt(evt);
    Evt.removeEventListener(document,"mousemove",dragMove,false);
    Evt.removeEventListener(document,"mouseup",dragRelease,false);
}
