
var jd_dragObj = null;
var jd_x = 0;
var jd_y = 0;
var jd_initX = 0;
var jd_initY = 0;

function jd_startDrag(e) {
	jd_dragObj = $(this);
	jd_initX = jd_x = e.pageX;
	jd_initY = jd_y = e.pageY;
	$(document).bind('mousemove',jd_moveDrag);
	return false;
}
	
function jd_endDrag(e) {
	jd_moveDrag(e);
	$(document).unbind('mousemove', jd_moveDrag);
	jd_dragObj = null;
	return false;				
}

function jd_moveDrag(e) {
	if(jd_dragObj == null) return false;
	var delta = {
		x: e.pageX - jd_x,
		y: e.pageY - jd_y
	}; 
	var deltaTotal = {
		x: e.pageX - jd_initX,
		y: e.pageY - jd_initY
	};
	var mouse = {
		x: e.pageX,
		y: e.pageY
	};
	jd_x = e.pageX;
	jd_y = e.pageY;
	if(jd_dragObj.get(0) != null && jd_dragObj.get(0).jd_dragCallback != null) jd_dragObj.get(0).jd_dragCallback(delta, deltaTotal, mouse);
	return false; 
}

jQuery.fn.extend({
	drag: function(callback) {
		if(typeof(callback) != 'undefined') {
			$(this).each(function(){ $(this).get(0).jd_dragCallback = callback; });
		}
		else if(callback === false) {
			(this).jd_dragCallback = null;
			$(this).unbind('mousedown',jd_startDrag);
			$(document).unbind('mouseup', jd_endDrag);
			return;
		}
		else return;
		
		$(this).bind('mousedown',jd_startDrag);
		$(document).bind('mouseup', jd_endDrag);
	}	
});