/**
* EasyDrag 1.4 - Drag & Drop jQuery Plug-in
*
* Thanks for the community that is helping the improvement
* of this little piece of code.
*
* For usage instructions please visit http://fromvega.com
*/

(function($) {

    // to track if the mouse button is pressed
    var isMouseDown = false;
    var holdingHandler;
    // to track the current element being dragged
    var currentElement = null;

    // callback holders
    var dropCallbacks = {};
    var dragCallbacks = {};

    // global position records
    var lastMouseX;
    var lastMouseY;
    var lastElemTop;
    var lastElemLeft;

    // track element dragStatus
    var dragStatus = {};

    // returns the mouse (cursor) current position
    $.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 };
    };

    // updates the position of the current element being dragged
    $.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));
    };

    // when the mouse is moved while the mouse button is pressed
    $(document).mousemove(function(e) {
        if (isMouseDown && dragStatus[currentElement.id] != 'false') {
            // update the position and call the registered function
            $.updatePosition(e);
            if (dragCallbacks[currentElement.id] != undefined) {
                dragCallbacks[currentElement.id](e, currentElement);
            }

            return false;
        }
    });

    // when the mouse button is released
    $(document).mouseup(function(e) {
        if (isMouseDown && dragStatus[currentElement.id] != 'false') {
            isMouseDown = false;
            if (dropCallbacks[currentElement.id] != undefined) {
                dropCallbacks[currentElement.id](e, currentElement);
            }

            return false;
        }
    });

    // register the function to be called while an element is being dragged
    $.fn.ondrag = function(callback) {
        return this.each(function() {
            dragCallbacks[this.id] = callback;
        });
    };

    // register the function to be called when an element is dropped
    $.fn.ondrop = function(callback) {
        return this.each(function() {
            dropCallbacks[this.id] = callback;
        });
    };

    // stop the element dragging feature
    $.fn.dragOff = function() {
        return this.each(function() {
            dragStatus[this.id] = 'off';
        });
    };


    $.fn.dragOn = function() {
        return this.each(function() {
            dragStatus[this.id] = 'on';
        });
    };

    // set a child element as a handler
    $.fn.setHandler = function(handlerId) {
        return this.each(function() {
            var draggable = this;
            $(draggable).css("cursor", "");
            dragStatus[draggable.id] = "handler";

            $("#" + handlerId).css("cursor", "move");

            $("#" + handlerId).mousedown(function(e) {
                holdingHandler = true;
                //$(draggable).mousedown(e);
            });

            $("#" + handlerId).mouseup(function(e) {
                holdingHandler = false;
            });
        });
    }

    // set an element as draggable - allowBubbling enables/disables event bubbling
    $.fn.easydrag = function(allowBubbling) {

        return this.each(function() {

            // if no id is defined assign a unique one
            if (undefined == this.id || !this.id.length) this.id = "easydrag" + (new Date().getTime());

            // set dragStatus 
            dragStatus[this.id] = "on";

            // change the mouse pointer
            $(this).css("cursor", "move");

            // when an element receives a mouse press
            $(this).mousedown(function(e) {

                // just when "on" or "handler"
                if ((dragStatus[this.id] == "off") || (dragStatus[this.id] == "handler" && !holdingHandler))
                    return allowBubbling ? true : false;

                // set it as absolute positioned
                $(this).css("position", "absolute");

                // set z-index
                $(this).css("z-index", parseInt(new Date().getTime() / 1000));

                // update track variables
                isMouseDown = true;
                currentElement = this;

                // retrieve positioning properties
                var pos = $.getMousePosition(e);
                lastMouseX = pos.x;
                lastMouseY = pos.y;

                lastElemTop = this.offsetTop;
                lastElemLeft = this.offsetLeft;

                $.updatePosition(e);

                return allowBubbling ? true : false;
            });
        });
    };

    $.fn.initeasydrag = function(top, left) {

        return this.each(function() {

            // if no id is defined assign a unique one
            if (undefined == this.id || !this.id.length) this.id = "easydrag" + (new Date().getTime());

            // set dragStatus 
            dragStatus[this.id] = "on";

            // change the mouse pointer
            $(this).css("cursor", "move");

            // when an element receives a mouse press


            // set it as absolute positioned
            $(this).css("position", "absolute");

            // set z-index
            $(this).css("z-index", "10000");
            $(this).css("top", top + document.body.scrollTop + document.documentElement.scrollTop);
            $(this).css("left", left + document.body.scrollLeft + document.documentElement.scrollLeft);

        });
    };

})(jQuery);

function seteasydrag(objID, title) {
    var obj = '#' + objID.toString();
    if ($(obj).length == 0) return;
    var objhandle = objID.toString() + '_handle';
    var objclose = obj + '_close';
    $(obj).prepend("<div class='easydrag_handle' id='" + objhandle + "'><a href='javascript:' class='easydrag_close' id='" + objID.toString() + "_close'><img src=/image/tb_delete.gif /></a>" + title + "</div>");
    if ($.browser.msie)
        $(obj).prepend('<iframe id="ediframe" frameborder=0></iframe>'); // iframe for IE select box z-index issue
    $(objclose).click(function() { $($(this).parent().parent()).hide(); });
}

function showeasydrag(objID, top, left) {
    var obj = '#' + objID.toString();
    var objhandle = objID.toString() + '_handle';
    top = top ? top : (window.screen.height - $(obj).height() - 150) / 2;
    left = left ? left : (window.screen.width - $(obj).width()) / 2;
    $(obj).initeasydrag(top, left);
    $(obj).easydrag(true);
    $(obj).setHandler(objhandle);
    $(obj).show();
}