(function($){
$.fn.overlayZoom = function(options){

    var settings    = {
                        speed : 500,
                        close : "",
                        start : "center",
                        leftRelation : ""
                      };
    $.extend(settings, options || {});

    return this.each(
        function()
        {
            $(this).click(showOverlay);
        }
    );

    function showOverlay(e)
    {
        var current             = $(this);
        var overlayIdSelector   = current.attr("href");
        var overlay             = $(overlayIdSelector);
        var x                   = window.pageXOffset || (window.document.documentElement.scrollLeft || window.document.body.scrollLeft);
        var y                   = window.pageYOffset || (window.document.documentElement.scrollTop || window.document.body.scrollTop);

        if(overlay.length > 0)
        {
            var overlayId       = overlay.attr("id");

            if(!overlay.parent().is("#" + overlayId + "-container"))
            {
                overlay.wrap("<div id='" + overlayId + "-container' style='background:#ffffff;float:left;'></div>");
            }
            
            var overlayContainer    = $("#" + overlayId + "-container");

            if(overlayContainer.is(":hidden"))
            {
                var windowWidth     = $(window).width();
                var windowHeight    = $(window).height();
                var overlayWidth    = overlay.outerWidth() || overlayContainer.outerWidth();
                var overlayHeight   = overlay.outerHeight() || overlayContainer.outerHeight();

                var startTop        = windowHeight / 2; //e.pageY;
                var startLeft       = windowWidth /2; //e.pageX;
                if(settings.start && settings.start == "click")
                {
                    startTop        = e.pageY;
                    startLeft       = e.pageX;
                }

                var newTop          = Math.max((windowHeight/2) - (overlayHeight/2) + y, 0);
                var newLeft         = (windowWidth/2) - (overlayWidth/2);

                if(settings.leftRelation && settings.leftRelation != "")
                {
                    var leftRelation    = $(settings.leftRelation).eq(0);

                    if(leftRelation.length > 0)
                    {
                        var leftRelationOffset  = leftRelation.offset();
                        newLeft     = leftRelationOffset.left;
                    }
                }

                overlay.hide();

                overlayContainer.hide().css({
                        position    : 'absolute',
                        overflow    : 'hidden',
                        top		: startTop,
                        left	: startLeft,
                        width       : 1,
                        height      : 1
                });
                
                overlayContainer.animate({
                          top     : newTop,
                          left    : newLeft,
                          opacity : "show",
                          width   : overlayWidth,
                          height  : overlayHeight
                        }, settings.speed, function()
                                {
                                    overlay.fadeIn("fast");
                                });

                if(settings.close != "")
                {
                    var closeLink   = overlayContainer.find(settings.close);

                    if(closeLink.length > 0 && !closeLink.eq(0).hasClass("zoom-overlay-close"))
                    {
                        closeLink.addClass("zoom-overlay-close").click( function()
                                                                        {
                                                                            overlay.fadeOut("fast", function()
                                                                                                    {
                                                                                                        overlayContainer.animate({
                                                                                                                                      top     : startTop,
                                                                                                                                      left    : startLeft,
                                                                                                                                      opacity : "hide",
                                                                                                                                      width   : 1,
                                                                                                                                      height  : 1
                                                                                                                                    }, settings.speed, function()
                                                                                                                                                        {
                                                                                                                                                            overlayContainer.hide().css({
                                                                                                                                                                        width       : overlayWidth,
                                                                                                                                                                        height      : overlayHeight
                                                                                                                                                                    });
                                                                                                                                                        });
                                                                                                    });
                                                                              return false;
                                                                        });
                    }
                }
            }
        }
        
        return false;
    }
}
})(jQuery);
