zarDrag = function (obj, pointer) {
	if (!pointer) pointer = obj;

	this.obj = document.getElementById (obj);
	this.pointer = document.getElementById (pointer);
	this.limitTop = 0;
	this.limitBottom = 0;
	this.limitLeft = 0;
	this.dragMode = false;
	this.zIndex = this.obj.style.zIndex;

	if ( !this.obj || !this.pointer ) return;

	var This = this;
	this.addEvent (this.pointer, "mousedown", function (event) { This.dragStart(event) });

	this.pointer.style.cursor = "move";
	if ( this.obj.style.position != "absolute" ) {
		if (!this.obj.style.left) this.obj.style.left = this.obj.offsetLeft;
		if (!this.obj.style.top) this.obj.style.top = this.obj.offsetTop;
		this.obj.style.position = "absolute";
	}
}

zarDrag.prototype.dragStart = function(ev) {
	ev = (window.event) ? window.event : ev;
	this.pointerX = ev.clientX - this.obj.offsetLeft + (document.body.scrollLeft || document.documentElement.scrollLeft);
	this.pointerY = ev.clientY - this.obj.offsetTop + (document.body.scrollTop || document.documentElement.scrollTop);
	this.dragMode = true;

	var This = this;
	this.addEvent (document.documentElement, "mousemove", function (event) { This.move(event) });
	this.addEvent (document.documentElement, "mouseup", function (event) { This.dragEnd(event) });
	this.addEvent (document.body, "scroll", function (event) { This.move(event) });
	// IE Only
	this.addEvent (document.documentElement, "dragstart", function (event) { return false });
	this.addEvent (document.documentElement, "selectstart", function (event) { return false });

	this.obj.style.zIndex = 999;
}

zarDrag.prototype.move = function(ev) {
	if (this.dragMode != true) return;

	ev = (window.event) ? window.event : ev;
	var moveX = (ev.clientX - this.pointerX) + 	(document.body.scrollLeft || document.documentElement.scrollLeft);
	var moveY = (ev.clientY - this.pointerY) + 	(document.body.scrollTop || document.documentElement.scrollTop);

	if (!this.limitBottom) this.limitBottom = (document.body.scrollHeight || document.documentElement.scrollHeight) - this.obj.offsetHeight;
	this.limitRight = (document.body.scrollWidth || document.documentElement.scrollWidth) - this.obj.offsetWidth;

	if (moveX > this.limitRight) moveX = this.limitRight;
	if (moveX < this.limitLeft) moveX = this.limitLeft;
	if (moveY > this.limitBottom) moveY = this.limitBottom;
	if (moveY < this.limitTop) moveY = this.limitTop;

	this.obj.style.left = moveX+"px";
	this.obj.style.top = moveY+"px";
	
}

zarDrag.prototype.dragEnd = function() {
	this.dragMode = false;

	// IE Only
	this.removeEvent (document.documentElement, "dragstart", function (event) { return false });
	this.removeEvent (document.documentElement, "selectstart", function (event) { return false });

	this.obj.style.zIndex = this.zIndex;
}

zarDrag.prototype.addEvent = function (object, event ,listener) {
		if (object.addEventListener) object.addEventListener (event, listener, false); 
		else if (object.attachEvent) object.attachEvent ('on' + event, listener); 
	}

zarDrag.prototype.removeEvent = function (object, event ,listener) {
		if (object.addEventListener) object.removeEventListener (event, listener, false); 
		else if (object.attachEvent) object.detachEvent ('on' + event, listener); 
}
