(function($){	
	var object = {deltaX:0, deltaY:0, status:null, element:null, callback:null};
	
	$.finish = function(){
		if(object.status){
			if(object.callback){
				object.callback();
			}
			object.status = null;	
		}
	}
		
	$.getXY = function(event){		
		var mouse = {x:0,y:0};		
		if(event.pageX || event.pageY){
			mouse.x = event.pageX;
			mouse.y = event.pageY;
		}else if(event.clientX || event.clientY){
			mouse.x = event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
			mouse.y = event.clientY + document.body.scrollTop  + document.documentElement.scrollTop;
		}		
		return mouse;
	}
	
	$(document).mousemove(function(event){								   
		if(object.status){
			var mouse = $.getXY(event);			
			var left = (mouse.x - object.deltaX);
			var top = (mouse.y - object.deltaY);	
			$(object.element).css({'top':top, 'left':left});			
		}
	});
	
	$(document).mouseup(function(event){							   					 
		if(object.status){$.finish();}
	});

	$.fn.dragdrop = function(root, callback){
		return this.each(function(){
			if($.browser.msie){
				this.unselectable = "on";
			}else{
				this.style.MozUserSelect = 'none';
				this.style.KhtmlUserSelect = 'none';
				this.style.userSelect = 'none';
			}
			
			$(this).css("cursor", "move");			
			$(this).mousedown(function(event){				
				var mouse = $.getXY(event);								
				object.callback = callback || null;
				object.element 	= (root)? $(root)[0] : this;
				object.deltaY  	= mouse.y - object.element.offsetTop;
				object.deltaX 	= mouse.x - object.element.offsetLeft;
				object.status 	= true;								
			});				
			$(this).mouseup(function(){$.finish();});				
			$(this).mouseleave(function(){$.finish();});
		});		
	};

})(jQuery);

