(function ($) {
$.fn.fancyZoom = function (options) {
    var options = options || {};
    var zooming = false;

    if ($('#zoom').length == 0) {
        var html = '<div id="zoom" style="display:none;"> \
				<div id="zoom_content"></div> \
				<a href="#" title="Close" id="zoom_close" style="position:absolute; top:-15px; left:-15px;"> \
					<img src="/img/icons/closebox.png" alt="Close" /> \
				</a> \
            </div>';

        $('body').append(html);

        $('html').click(function (e) {
            if ($(e.target).parents('#zoom:visible').length == 0) hide();
        });
        $(document).keyup(function (event) {
            if (event.keyCode == 27 && $('#zoom:visible').length > 0) hide();
        });

        $('#zoom_close').click(hide);
    }

    var zoom = $('#zoom');
    var zoom_close = $('#zoom_close');
    var zoom_content = $('#zoom_content');

    this.each( function (i) {
        $(this).click(show);
    });

    return this;

    function show (e) {
        if ( zooming ) {
        	return false;
        }

        zooming = true;

        var img = new Image();
        img.src = $(this).attr("href");

        $(img).load(function () {
            var content_div = $(this);

            var width = window.innerWidth || (window.document.documentElement.clientWidth || window.document.body.clientWidth);
            var height = window.innerHeight || (window.document.documentElement.clientHeight || window.document.body.clientHeight);
            var x = window.pageXOffset || (window.document.documentElement.scrollLeft || window.document.body.scrollLeft);
            var y = window.pageYOffset || (window.document.documentElement.scrollTop || window.document.body.scrollTop);
            var window_size = {
                'width': width,
                'height': height,
                'x': x,
                'y': y
            }

            var width = content_div[0].width;
            var height = content_div[0].height;
            var d = window_size;

            // ensure that newTop is at least 0 so it doesn't hide close button
            var newTop = Math.max((d.height / 2) - (height / 2) + y, 0);
            var newLeft = (d.width / 2) - (width / 2);
            var curTop = e.pageY;
            var curLeft = e.pageX;

            zoom_close.attr('curTop', curTop);
            zoom_close.attr('curLeft', curLeft);

            $('#zoom').hide().css({
                position: 'absolute',
                top: curTop + 'px',
                left: curLeft + 'px',
                width: '1px',
                height: '1px'
            });

            zoom_close.hide();

            zoom_content.html('');

            $('#zoom').animate({
                top: newTop + 'px',
                left: newLeft + 'px',
                opacity: "show",
                width: width,
                height: height
            }, 500, null, function () {
                zoom_content.html(content_div[0]);
                zoom_close.show();
                zooming = false;
            })
        });

        return false;
    }

    function hide() {
        if ( zooming ) {
        	return false;
        }

        zooming = true;

        $('#zoom').unbind('click');

		zoom_content.html('');

        zoom_close.hide();

        $('#zoom').animate({
            top: zoom_close.attr('curTop') + 'px',
            left: zoom_close.attr('curLeft') + 'px',
            opacity: "hide",
            width: '1px',
            height: '1px'
        }, 500, null, function () {

            zooming = false;
        });

        return false;
    }
}
})(jQuery);
