(function($) {
    $.fn.draggable = function(options) {
        return this.each(function() {
            var mouseDown = false;
            var data = {};
            var element = $(this);
            element.addClass('solid-draggable');
            var handle = element;
            if (options && options.handle) {
                handle = element.find(options.handle);
            }
            var moveCallback = function(event) {
                if (!mouseDown) return;
                event.preventDefault();
                event.stopImmediatePropagation();
                element.offset({
                    top: event.clientY - data.mouseOffset.top,
                    left: event.clientX - data.mouseOffset.left
                });
            };
            var upCallback = function(event) {
                if (!mouseDown) return;
                event.preventDefault();
                event.stopImmediatePropagation();
                mouseDown = false;
                $('body').off('mousemove', moveCallback).off('mouseup', upCallback);
            };
            handle.on('mousedown', function(event) {
                if(event.which !== 1) return; // Allow drag only for "first" mouse button ..
                if (mouseDown) return; // Mouse-up out of window ?
                if(event.target !== this) {
                    // The 'mousedown' event was triggered on one of its child elements.
                    // Make sure it is not an input-element ..
                    if ($(event.target).is(':input')) {
                        return;
                    }
                }
                event.preventDefault(); // Prevent from selecting elements while dragging ..
                mouseDown = true;
                var dialogOffset = element.offset();
                data.mouseOffset = {
                    top: event.clientY - dialogOffset.top,
                    left: event.clientX - dialogOffset.left
                };
                $('body').on('mousemove', moveCallback).on('mouseup mouseleave', upCallback);
            });
        });
    }
})(jQuery);