(function($){ var isMouseDown = false; var currentElement = null; var dropCallbacks = {}; var dragCallbacks = {}; var bubblings = {}; var lastMouseX; var lastMouseY; var lastElemTop; var lastElemLeft; var dragStatus = {}; var holdingHandler = false; $.getMousePosition = function(e){ var posx = 0; var posy = 0; if (!e) var e = window.event; if (e.pageX || e.pageY) { posx = e.pageX; posy = e.pageY;}
else if (e.clientX || e.clientY) { posx = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; posy = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;}
return { 'x': posx, 'y': posy };}; $.updatePosition = function(e) { var pos = $.getMousePosition(e); var spanX = (pos.x - lastMouseX); var spanY = (pos.y - lastMouseY); $(currentElement).css("top", (lastElemTop + spanY)); $(currentElement).css("left", (lastElemLeft + spanX));}; $(document).mousemove(function(e){ if(isMouseDown && dragStatus[currentElement.id] != 'false'){ $.updatePosition(e); if(dragCallbacks[currentElement.id] != undefined){ dragCallbacks[currentElement.id](e, currentElement);}
return false;}
}); $(document).mouseup(function(e){ if(isMouseDown && dragStatus[currentElement.id] != 'false'){ isMouseDown = false; if(dropCallbacks[currentElement.id] != undefined){ dropCallbacks[currentElement.id](e, currentElement);}
return false;}
}); $.fn.ondrag = function(callback){ return this.each(function(){ dragCallbacks[this.id] = callback;});}; $.fn.ondrop = function(callback){ return this.each(function(){ dropCallbacks[this.id] = callback;});}; $.fn.dragOff = function(){ return this.each(function(){ dragStatus[this.id] = 'off';});}; $.fn.dragOn = function(){ return this.each(function(){ dragStatus[this.id] = 'on';});}; $.fn.setHandler = function(handlerId){ return this.each(function(){ var draggable = this; bubblings[this.id] = true; $(draggable).css("cursor", ""); dragStatus[draggable.id] = "handler"; $("#"+handlerId).css("cursor", "move"); $("#"+handlerId).mousedown(function(e){ holdingHandler = true; $(draggable).trigger('mousedown', e);}); $("#"+handlerId).mouseup(function(e){ holdingHandler = false;});});}
$.fn.easydrag = function(allowBubbling){ return this.each(function(){ if(undefined == this.id || !this.id.length) this.id = "easydrag"+(new Date().getTime()); bubblings[this.id] = allowBubbling ? true : false; dragStatus[this.id] = "on"; $(this).css("cursor", "move"); $(this).mousedown(function(e){ if((dragStatus[this.id] == "off") || (dragStatus[this.id] == "handler" && !holdingHandler))
return bubblings[this.id]; $(this).css("position", "absolute"); $(this).css("z-index", parseInt( new Date().getTime()/1000 )); isMouseDown = true; currentElement = this; var pos = $.getMousePosition(e); lastMouseX = pos.x; lastMouseY = pos.y; lastElemTop = this.offsetTop; lastElemLeft = this.offsetLeft; $.updatePosition(e); return bubblings[this.id];});});};})(jQuery); 
