$.fn.popup = function(options) {
    var defaults = {
        prefix: 'popup',
        param: 'popup'
    };

    var options = $.extend(defaults, options);
    var ie6 = $.browser.msie && $.browser.version <= 6;
    var overlayName = options['prefix'] + '_overlay';
    var windowName = options['prefix'] + '_window';
    var contentName = options['prefix'] + '_content';
    var imageName = options['prefix'] + '_image';
    var loaded = false;
    var $overlay;
    var $window;
    var $content;
    var overflow;

    return this.each(function() {
        $this = $(this);
        var href = $this.attr('href');
        if (!href) {
            return;
        }

        $this.click(function() {
        	$overlay = $('<div id="' + overlayName + '"></div>');
        	$window = $('<div id="' + windowName + '"></div>');
            $content = $('<div id="' + contentName + '"></div>');
			
            $window.append($content);
        	$window.css('left', -10000);

            loaded = false;
			if (href.match(/\.(jpg|gif|png)$/)) {
				var $image = $('<img src="' + href + '" alt="" class="' + imageName + '">');
				$content.append($image);
				$image.load(function() {
					loaded = true;
					layout();
     		    });
			} else {
				var params = {};
				params[options['param']] = '';
				$content.load(href, params, function() {
					loaded = true;
					layout();
				});
			}
			
        	$('body').append($overlay).append($window);

            if (ie6) {
                overflow = $('html').css('overflow');
                $('html').css('overflow', 'hidden');
            }

	        $('#' + overlayName + ', #' + windowName).click(function() {
                close();
            });
	
        	$(document).keydown(function(event) {
		        if (event.keyCode == 27 || event.keyCode == 13) {
			        close();
                }
            });
            $(window).resize(layout);

            layout();
            return false;
        });
	});

    function layout() {
        var windowWidth = document.documentElement.clientWidth || $(window).width();
        var windowHeight = document.documentElement.clientHeight || $(document).height();

        $overlay.height($('#page').height());
        var pageWidth = $('#page').width();
        $overlay.width(windowWidth > pageWidth ? windowWidth : pageWidth);

        if (loaded) {
            $content.width($content.width()); // IE6 hack

            var popupHeight = $window.get(0).offsetHeight;
            if (popupHeight >= windowHeight - 40) {
                var diff = $window.get(0).offsetHeight - $content.height();
                popupHeight = windowHeight - 40;
                $content.height(popupHeight - diff);
                $content.css('overflow', 'scroll');
                var width = $content.width();
                $content.get(0).scrollLeft = 10000;
                var diff = $content.get(0).scrollLeft;
                $content.width(width + diff);
                $content.css('overflow-x', 'hidden');
            }

            var popupWidth = $window.get(0).offsetWidth;
            var popupHeight = $window.get(0).offsetHeight;

            var left = (windowWidth - popupWidth) / 2;
            var top = (windowHeight - popupHeight) / 2;

            if (ie6) {
                left += document.documentElement.scrollLeft;
                top += document.documentElement.scrollTop;
            }

            $window.css('left', left);
            $window.css('top', top);
        }
    }

    function close() {
        $overlay.remove();
        $window.remove();
        $(document).unbind('keydown');
        $(window).unbind('resize');
        if (ie6) {
            $('html').css('overflow', overflow);
        }
    }
};
