jQuery.fn.imageZoom = function (conf) {
    var config = jQuery.extend({
        speed: 200,
        dontFadeIn: 1,
        hideClicked: 1,
        imageMargin: 15,
        className: 'jquery-image-zoom',
        loading: 'Loading...'
    }, conf);
    config.doubleSpeed = config.speed / 4;
    return this.click(function (e) {
        var clickedElement = jQuery(e.target);
        var clickedLink = clickedElement.is('a') ? clickedElement : clickedElement.parents('a');
        clickedLink = (clickedLink && clickedLink.is('a') && clickedLink.attr('href').search(/(.*)\.(jpg|jpeg|gif|png|bmp|tif|tiff)$/gi) != -1) ? clickedLink : false;
        var clickedImg = (clickedLink && clickedLink.find('img').length) ? clickedLink.find('img') : false;
        if (clickedLink) {
            clickedLink.oldText = clickedLink.text();
            clickedLink.setLoadingImg = function () {
                if (clickedImg) {
                    clickedImg.css({
                        opacity: '0.5'
                    })
                } else {
                    clickedLink.text(config.loading)
                }
            };
            clickedLink.setNotLoadingImg = function () {
                if (clickedImg) {
                    clickedImg.css({
                        opacity: '1'
                    })
                } else {
                    clickedLink.text(clickedLink.oldText)
                }
            };
            var displayImgSrc = clickedLink.attr('href');
            if (jQuery('div.' + config.className + ' img[src="' + displayImgSrc + '"]').length) {
                return false
            }
			
            var preloadOnload = function () {
                    clickedLink.setNotLoadingImg();
                    var dimElement = clickedImg ? clickedImg : clickedLink;
                    var hideClicked = clickedImg ? config.hideClicked : 0;
                    var offset = dimElement.offset();
                    var imgzoomBefore = {
                        width: dimElement.outerWidth(),
                        height: dimElement.outerHeight(),
                        left: offset.left,
                        top: offset.top
                    };
                    var imgzoomScreen = jQuery('<div class="jquery-image-zoom-screen"></div>').appendTo(document.body);
                    var imgzoom = jQuery('<div title="Click to close"><img src="' + displayImgSrc + '" alt="Enlarged image"/></div>').css('position', 'absolute').appendTo(document.body);
                    var imgzoomAfter = {
                        width: imgzoom.outerWidth(),
                        height: imgzoom.outerHeight()
                    };
                    var windowDim = {
                        width: jQuery(window).width(),
                        height: jQuery(window).height()
                    };
                    if (imgzoomAfter.width > (windowDim.width - config.imageMargin * 2)) {
                        var nWidth = windowDim.width - config.imageMargin * 2;
                        imgzoomAfter.height = (nWidth / imgzoomAfter.width) * imgzoomAfter.height;
                        imgzoomAfter.width = nWidth
                    }
                    if (imgzoomAfter.height > (windowDim.height - config.imageMargin * 2)) {
                        var nHeight = windowDim.height - config.imageMargin * 2;
                        imgzoomAfter.width = (nHeight / imgzoomAfter.height) * imgzoomAfter.width;
                        imgzoomAfter.height = nHeight
                    }
                    imgzoomAfter.left = (windowDim.width - imgzoomAfter.width) / 2 + jQuery(window).scrollLeft();
                    imgzoomAfter.top = (windowDim.height - imgzoomAfter.height) / 2 + jQuery(window).scrollTop();
					var imgTitle = clickedLink.find('img').attr('title');
                    var closeButton = jQuery('<a href="#" title="Close">Close</a>').appendTo(imgzoom).hide();
                    if (hideClicked) {
                        clickedLink.css('visibility', 'hidden')
                    }
                   
                        var imgTitleContent = jQuery('<div><p>' +imgTitle+ '</p></div>').appendTo(imgzoom).hide();
                    
                    imgzoom.addClass(config.className).css(imgzoomBefore).animate(imgzoomAfter, config.speed, function () {
                        closeButton.fadeIn(config.doubleSpeed)
						if (imgTitle) {
							imgTitleContent.fadeIn(config.doubleSpeed)
						}
                    });
                    var hideImgzoom = function () {
                            closeButton.fadeOut(config.doubleSpeed, function () {
                                imgzoom.animate(imgzoomBefore, config.speed, function () {
                                    clickedLink.css('visibility', 'visible');
                                    imgzoomScreen.remove();
                                    imgzoom.remove();
                                })
                            });
                            return false
                        };
                    imgzoom.click(hideImgzoom);
                    closeButton.click(hideImgzoom)
                };
            var preload = new Image();
            preload.src = displayImgSrc;
            if (preload.complete) {
                preloadOnload()
            } else {
                clickedLink.setLoadingImg();
                preload.onload = preloadOnload
            }
            return false
        }
    })
};
$(document).keydown(function (e) {
    if (e.keyCode == 27) {
        $('div.jquery-image-zoom a').click()
    }
});
