function getAbsPosition(target) {
    var pos = {x:0, y:0};

    while (target != null) {
        pos.x += target.offsetLeft;
        pos.y += target.offsetTop;
        target = target.offsetParent;
    }

    return pos;
}

var EventManager = {
	"attachEvent" : function (oTarget, sType, fHandle, bUseCapture) {
		bUseCapture = (bUseCapture===true);
		if (oTarget.addEventListener)
		{
			oTarget.addEventListener(sType, fHandle, bUseCapture);
		} else if (oTarget.attachEvent)
		{
			oTarget.attachEvent("on"+sType, fHandle);
		} else {
			throw new Error("EventManager.attachEvent() fail.");
		}
	},
	"detachEvent" : function (oTarget, sType, fHandle, bUseCapture) {
		bUseCapture = (bUseCapture===true);
		if (oTarget.removeEventListener)
		{
			oTarget.removeEventListener(sType, fHandle, bUseCapture);
		} else if (oTarget.detachEvent)
		{
			oTarget.detachEvent("on"+sType, fHandle);
		} else {
			throw new Error("EventManager.detachEvent() fail.");
		}
	},
    "preventDefault" : function (e) {
        if(e.preventDefault) {
            e.preventDefault();
        } else {
            e.returnValue = false;
        }
    }
};


function Draggable() {}

Draggable.prototype.bindDragNote = function (dn, fn) {
    dn = (typeof(dn) === "string") ? document.getElementById(dn) : dn;
    fn = (typeof(fn) === "string") ? document.getElementById(fn) : (typeof(fn) === "undefined" ? dn : fn);

	EventManager.attachEvent(fn, "mouseover", function () {
			fn.style.cursor = "move";
	});
	EventManager.attachEvent(fn, "mousedown", function (e) {
		e = e || window.event;
		var absPos = getAbsPosition(dn),
			deltaX = e.clientX - absPos.x,
			deltaY = e.clientY - absPos.y;

        fn.style.cursor = "auto";
        //dn.style.zIndex = self.constructor.zIndex++;
		EventManager.attachEvent(document, "mousemove", moveHandler);
		EventManager.attachEvent(document, "mouseup", upHandler);
		EventManager.preventDefault(e);

		function moveHandler(e2) {
			e2 = e2 || window.event;
			var	left = e2.clientX - deltaX,
				top = e2.clientY - deltaY;

			fn.style.cursor = "auto";

			dn.style.left = left + "px";
			dn.style.top = top + "px";
			EventManager.preventDefault(e2);

		}
		function upHandler() {
			fn.style.cursor = "move";
			EventManager.detachEvent(document, "mousemove", moveHandler);
			EventManager.detachEvent(document, "mouseup", upHandler);
		}
	});
	EventManager.attachEvent(window, "upload", function () {
		dn = null;
		fn = null;
	});

};
