(function($) {
    $.fn.extend({ boxen: function(url, options) {
        switch (typeof url) { case 'object': options = url; break; case 'string': options = $.extend({}, { url: url, urlAttribute: null }, options); break; }
        return this.click(function(e) { $.Boxen.open(this, options); return false; });
    } 
    }); $.Boxen = { defaults: { urlParams: {}, showTitleBar: true, showCloseButton: true, title: null, titleAttribute: 'title', closeButtonText: null, width: 600, height: 500, url: null, urlAttribute: 'href', overlayOpacity: 0.8, modal: false, postOpen: function(contentAreaElement) { }, postClose: function() { } }, bigIFrame: null, overlay: null, container: null, options: null, titleBar: null, closeButton: null, contentWindow: null, contentArea: null, ie6: false, setOptions: function(options) { this.options = $.extend({}, this.defaults, options || {}); return this; }, getFullUrl: function() { var url = this.options.url; url += url.indexOf('?') == -1 ? '?' : '&'; return url += $.param(this.options.urlParams); }, init: function() {
        _this = this; this.isIE6 = $.browser.msie && parseInt($.browser.version) < 7; if ($.browser.opera) { $.support.opacity = true; }
        $('#boxen_overlay, #boxen_container').remove(); this.overlay = $('<div>').attr('id', 'boxen_overlay').css({ opacity: this.options.overlayOpacity, display: 'none', position: 'absolute', top: 0, left: 0, zIndex: 10000 }); if (!this.options.modal) { this.overlay.click(function(e) { $.Boxen.close(); return false; }); }
        this.container = $('<div>').attr('id', 'boxen_container').width(this.options.width).height(this.options.height).css({ position: 'absolute', left: '50%', top: '50%', marginLeft: Math.round(this.options.width / -2) + 'px', marginTop: Math.round(this.options.height / -2) + 'px', display: 'none', zIndex: 10001 }); if (this.isIE6) { this.bigIFrame = $('<iframe>').attr('id', 'boxen_big_iframe').css({ zIndex: 9999, position: 'absolute', top: 0, left: 0, opacity: 0 }).appendTo('body'); this._sizeOverlay(); this._centreContent(); $(window).bind('scroll.Boxen', function(e) { _this._centreContent(); }).bind('resize.Boxen', function(e) { _this._sizeOverlay(); _this._centreContent(); }); } else { this.overlay.css({ position: 'fixed', width: '100%', height: '100%' }); this.container.css('position', 'fixed'); }
        this.overlay.appendTo('body'); this.container.appendTo('body'); this.contentWindow = $('<div>').attr('id', 'boxen_content').appendTo(this.container); if (this.options.showTitleBar) { this.titleBar = $('<div>').attr('id', 'boxen_titlebar').append($('<span>').attr('id', 'boxen_title').html(this.options.title)).appendTo(this.contentWindow); } else { this.titleBar = null; }
        if (this.options.showCloseButton) { this.closeButton = $('<a>').attr({ href: '#', id: 'boxen_close_button' }).click(function(e) { $.Boxen.close(); return false; }).appendTo(this.contentWindow); if (this.options.closeButtonText) { this.closeButton.append($('<span>').html(this.options.closeButtonText)); } } else { this.closeButton = null; }
        this.contentArea = $('<div>').attr('id', 'boxen_content_area').appendTo(this.contentWindow); return this;
    }, show: function(callback) {
        this.overlay.fadeIn('fast'); this.container.fadeIn('fast', function() {
            var _this = $.Boxen; if (null !== _this.options.url) { var iFrame = $('<iframe>').attr({ id: 'boxen_iframe_content_' + new Date().getTime(), width: _this.getContentAreaWidth(), height: _this.getContentAreaHeight(), frameborder: 0, src: _this.getFullUrl() }).appendTo(_this.contentArea); } else { _this.contentArea.width(_this.getContentAreaWidth()).height(_this.getContentAreaHeight()); }
            _this.options.postOpen(_this.getContentAreaElement());
        }); return this;
    }, close: function() {
        try {
            if (this.isIE6) { $(window).unbind('scroll.Boxen').unbind('resize.Boxen'); throw 'IE6'; }
            this.container.fadeOut('fast', function() { $(this).remove(); }); this.overlay.fadeOut('fast', function() { $(this).remove(); });
        }
        catch (e) { $('#boxen_big_iframe, #boxen_overlay, #boxen_container').remove(); }
        this.options.postClose(); return this;
    }, open: function(domElement, options) { this.setOptions(options); this.options.title = this.options.titleAttribute && $(domElement).attr(this.options.titleAttribute) || this.options.title; this.options.url = this.options.urlAttribute && $(domElement).attr(this.options.urlAttribute) || this.options.url; this.init().show(); return this; }, _centreContent: function() { if (this.options.height < $(window).height()) { var topMargin = Math.round(this.options.height / -2) + $(document).scrollTop(); this.container.css({ marginTop: topMargin + 'px' }); } }, _sizeOverlay: function() { this.bigIFrame.css({ width: ($(document).width() - 21) + 'px', height: ($(document).height() - 4) + 'px' }); this.overlay.css({ width: ($(document).width() - 21) + 'px', height: ($(document).height() - 4) + 'px' }); }, getContentAreaElement: function() { return this.contentArea.get(0); }, getContentAreaHeight: function() { return this.titleBar ? this.options.height - this.titleBar.outerHeight() : this.options.height; }, getContentAreaWidth: function() { return this.options.width; } 
    };
})(jQuery);
