/**
 * o3EnlargeBox  v1.0.0
 * requires jQuery 1.4.x or greater
 * author: Donald Van Raalte (http://www.donaldsbrain.com)
 * copyright: 2011, Ozone Solutions, Inc.
 * licensed under: MIT License (http://www.opensource.org/licenses/mit-license.php)
 */
(function($){
    $.fn.o3EnlargeBox = function(options) {        
        node = $(this);        
        var settings = {
            modal: true,
            shrinkImageToFitWindow: true,
            shrinkEnlargeBoxToFitContents: true,
            closeOnClickEnlargeBox: true,
            closeOnClickModal: true,
            marginTop: 25,
            marginRight: 25,
            marginBottom: 25,
            marginLeft: 25,
            paddingTop: 25,
            paddingRight: 25,
            paddingBottom: 25,
            paddingLeft: 25,
            closeButton: $('<div class="o3-closeButton">close</div>'),
            closeButtonPositionFromX: 'right',
            closeButtonPositionFromY: 'top',
            closeButtonPositionX: 8,
            closeButtonPositionY: 5,
            onOpenCallback: function(){},
            onCloseCallback: function(){}            
        }
        if (options) {
            $.extend(settings, options);
        }        
        return this.each(function(){
            
            var $this = $(this);
            if (settings.modal) {
                var modalDiv = getModalDiv();                
            }
            var enlargeBox = getEnlargeDiv();             
            enlargeBox.append(node);
            prepareNode();
            if (settings.shrinkImageToFitWindow) {
                shrinkImage()
            }            
            if (settings.shrinkEnlargeBoxToFitContents) {
                shrinkEnlargeDiv();
            }            
            centerEnlargeDiv();
            if (settings.closeButton)
                initializeCloseButton();
            if (settings.onOpenCallback instanceof Function) {
                settings.onOpenCallback();
            }
            
            
            function prepareNode() {
                node.css('position', 'absolute')
                    .css('top', settings.paddingTop+'px')
                    .css('left', settings.paddingLeft+'px');
            }
            function getModalDiv() {
                var modalWidth = $(window).width()+'px';
                var modalHeight = Math.max($(document.body).height(), $(window).height())+'px';
                return $('<div class="o3-modal"></div>')                
                    .css('position', 'absolute')
                    .css('left','0px')
                    .css('top', '0px')
                    .css('width', modalWidth)
                    .css('height', modalHeight) 
                    .click(function(){
                        if (settings.closeOnClickModal)
                            closeBox()
                    })
                    .appendTo(document.body);                    
                return modalDiv;
            }
            function getEnlargeDiv() {
                return $('<div class="o3-enlargeBox"></div>')
                    .css('position', 'fixed')
                    .css('left', settings.marginLeft+'px')
                    .css('top', settings.marginTop+'px')
                    .css('width', ($(window).width() - (settings.marginLeft + settings.marginRight))+'px')
                    .css('height', ($(window).height() - (settings.marginTop + settings.marginBottom))+'px') 
                    .click(function(){
                        if (settings.closeOnClickEnlargeBox)
                            closeBox()
                    })
                    .appendTo(document.body);                    
            }
            function shrinkImage() {
                if (node[0].nodeName.toLowerCase() !== 'img')
                    return;
                var maxWidth = enlargeBox.width() - (settings.paddingLeft + settings.paddingRight);
                var maxHeight = enlargeBox.height() - (settings.paddingTop + settings.paddingBottom);                
                var currentWidth = node.width();
                var currentHeight = node.height();
                var ratio = Math.min(maxWidth / currentWidth, maxHeight / currentHeight);                
                if (ratio < 1) {
                    node.css('width', (ratio * currentWidth)+'px');                                                          
                    node.css('height', (ratio * currentHeight)+'px');
                }                
            }
            function shrinkEnlargeDiv() {
                enlargeBox.css('width', node.width() + settings.paddingRight + settings.paddingLeft)
                    .css('height', node.height() + settings.paddingTop + settings.paddingBottom)
                ;
            }
            function centerEnlargeDiv() {
                var spaceX = $(window).width() - (settings.marginLeft + settings.marginRight);
                var spaceY = $(window).height() - (settings.marginTop + settings.marginBottom);
                
                enlargeBox.css('left', (settings.marginLeft + (spaceX - enlargeBox.width())/2)+'px');
                enlargeBox.css('top', (settings.marginTop + (spaceY - enlargeBox.height())/2)+'px');
            }
            function initializeCloseButton() {
                settings.closeButton.css('position', 'absolute')
                    .css(settings.closeButtonPositionFromX, settings.closeButtonPositionX)
                    .css(settings.closeButtonPositionFromY, settings.closeButtonPositionY)
                    .click(function(){ closeBox() })
                    .appendTo(enlargeBox);
            }
            function closeBox() {
                if (settings.modal)
                    modalDiv.remove();                
                enlargeBox.remove();
                if (settings.onCloseCallback instanceof Function) {
                    settings.onCloseCallback();
                }
            }
        });
    }
})(jQuery);
