(function($){  

$.fn.smfbox = function(options) {
        
    var constants = {
        box: '#smfbox',
        close: '#smfclose',
        content: '#smfcontent',
        html: '<div id="smfoverlay" style="display:none"></div><div id="smfwrapper"><div id="smfbox" style="display:none"><a id="smfclose" href="#">Close</a><div id="smfcontent"></div></div></div>',
        trigger: $(this),
        overlay: '#smfoverlay',
        wrapper: '#smfwrapper'

    },
    defaults = {
        afterRender: null,
        beforeLoad: null,
        beforeRender: null,
        boxClass: 'default',
        content: null,
        data: null,
        onClose: null,
        overlayOpacity: 0.75
    },
    defaultcontent = false;
    settings = $.extend({}, defaults, options);

    function boxExistsCheck() {
        var overlay = $(constants.overlay, 'body'),
            wrapper = $(constants.wrapper, 'body');

        if (overlay.length > 0) {
            wrapper.remove();
            overlay.remove();
        }
    }
    
    function boxClose(overlay, wrapper) {
        overlay.fadeOut();
        wrapper.fadeOut('fast',boxExistsCheck);

        if (defaultcontent) {
            settings.content = null;
        };

        if(settings.onClose) {
            settings.onClose();
        }
    }
    
    function boxLaunch() {
            
        if (!settings.content) {
            alert('Missing parameter \'content\'');
            return this;
        }
        
        boxExistsCheck();
        $('body').append(constants.html);
        
        
        var smfoverlay = $(constants.overlay, 'body'),
            smfwrapper = $(constants.wrapper),
            smfbox = $(constants.box, smfwrapper),
            smfcontent = $(constants.content, smfbox),
            smfclose = $(constants.close, smfbox);
        
        smfcontent.load(settings.content,settings.data,function(){
        
            if(settings.beforeRender) {
                settings.beforeRender();
            }

            smfbox.addClass(settings.boxClass); 
            smfoverlay.css('opacity',settings.overlayOpacity);
            smfoverlay.fadeIn('fast',function(){
                smfbox.fadeIn('fast');

                if(settings.afterRender) {
                    settings.afterRender();
                }
                
            });
        });
        
        smfclose.click(function(){
            boxClose(smfoverlay, smfwrapper);
            return false;
        });
        
        smfoverlay.click(function(){
            boxClose(smfoverlay, smfwrapper);
        });
    }//boxLaunch
    
    constants.trigger.click(function(){
        $this = $(this);
        
        if (!settings.content) {
            settings.content = $this.attr('href'),
            defaultcontent = true;
        }
        
        if(settings.beforeLoad) {
            settings.beforeLoad();
        }
        
        boxLaunch();
        return false;
    });

}

})(jQuery);  