(function($){
    $.fn.extend({
        "bubbleEffect": function(options){
            var defaults = {
                scale: 1.2,
                time: 500,
                lockcenter: true,
                transition: "easeOutQuad",
                zIndex: 5000,
                inflationHandler: "mouseover",
                deflationHandler: "mouseout"
            };
            var opts = $.fn.extend(defaults, options);
            
            return this.each(function(index, element){
                var position = $(element).position();
                var w = $(element).width();
                var h = $(element).height();
                var newWidth = Math.floor(w * opts.scale);
                var newHeight = Math.floor(h * opts.scale);
                var halfDiffX = Math.floor((newWidth - w) / 2);
                var halfDiffY = Math.floor((newHeight - h) / 2);
                $(element)
                    .data("originalWidth", w)
                    .data("originalHeight", h)
                    .data("originalLeft", position.left)
                    .data("originalTop", position.top)
                    .data("originalZindex", $(element).css("z-index"));
                
                $(element).bind(opts.inflationHandler, function(){
                    $(this).css("z-index", opts.zIndex);
                    $(this)
                        .stop()
                        .animate({
                            left: opts.lockcenter ? ($(this).data("originalLeft") - halfDiffX) + "px" : $(this).data("originalLeft"),
                            top: opts.lockcenter ? ($(this).data("originalTop") - halfDiffY) + "px" : $(this).data("originalTop")
                        }, opts.time, opts.transition);
                    $(this).find("img")
                        .stop()
                        .animate({
                            width: (newWidth) + "px" ,
                            height: (newHeight) + "px"
                        }, opts.time, opts.transition);
                });
                
                $(element).bind(opts.deflationHandler, function(){
                    $(this).css("z-index", $(this).data("originalZindex"))
                    $(this)
                        .stop()
                        .animate({
                            left: $(this).data("originalLeft"),
                            top: $(this).data("originalTop")
                        }, opts.time, opts.transition);
                    $(this).find("img")
                        .stop()
                        .animate({
                            width: ($(this).data("originalWidth")) + "px" ,
                            height: ($(this).data("originalHeight")) + "px"
                        }, opts.time, opts.transition);
                });
                
            });
        }
    });
})(jQuery);
