(function($) {
    
if (typeof window.Aino == 'undefined') {
    JSTOOLS.raise('Aino not defined');
    return;
}

var modal   = $('<div id="aino-modal">').hide().css('z-index',999999);
var overlay = $('<div id="aino-overlay">').css({
    position: 'fixed',
    top: 0,
    left: 0,
    width: '100%',
    height: '100%'
}).appendTo(modal);
var box = $('<div id="aino-modal-box">').css({
    top: '50%',
    left: '50%',
    position: 'absolute',
    zIndex: 1000000
}).appendTo(modal);
var content = $('<div id="aino-modal-content">').appendTo(box);
var close = $('<a id="aino-modal-close" href="#"></a>').bind('click', function(e) {
    e.preventDefault();
    Aino.modal.hide();
}).html('&#215;').appendTo(box).hide();

Aino.modal = {
    
    set: function(add, options) {
        this.setOptions(options);
        content.empty().append(add);
        return this;
    },
    
    show: function(options) {
        this.setOptions(options);
        box.show().css('left',-10000);
        modal.show();
        var height = box.outerHeight(true);
        var width = box.outerWidth(true);
        var scroll = $(document).scrollTop();
        var o = this.options;
        var self = this;
        content.css('opacity',0);
        box.css({
            left: '50%',
            marginLeft: width/2*-1 + 20,
            marginTop: height/2*-1 + scroll + 20,
            width: width - 40,
            height: height - 40
        }).animate({
            width: width,
            height: height,
            marginLeft: width/2*-1,
            marginTop: height/2*-1 + scroll
        },
        {
            duration: this.options.duration,
            complete:function() {
                content.css('opacity',1);
                if (o.focus) {
                    Aino.modal.focus();
                }
                close.show();
                o.complete.call( self );
                if (o.clickOutside) {
                    overlay.bind('click', function(e) {
                        e.preventDefault();
                        overlay.unbind('click', arguments.callee);
                        Aino.modal.hide();
                    });
                }
                $(document).bind('keyup', function(e) {
                    $(document).unbind('keyup', arguments.callee);
                    var key = e.keyCode || e.which;
                    if (key == 27) {
                        Aino.modal.hide();
                    }
                });
            }
        });
        
        return this;
    },
    
    focus: function() {
        content.find('input:visible,textarea:visible').eq(0).focus();
    },
    
    hide: function() {
        content.empty();
        close.hide();
        box.removeAttr('class').removeAttr('style').css({
            top: '50%',
            left: '50%',
            position: 'absolute',
            zIndex: 1000000
        }).hide();
        overlay.fadeOut(200, function() {
            modal.hide();
            overlay.show();
        });
    },
    
    setOptions: function(options) {
        if (options) {
            this.options = $.extend({
                opacity:.8,
                className: '',
                clickOutside: false,
                duration: 300,
                focus: true,
                complete: function(){}
            }, options);
            this.applyOptions();
        }
        return this;
    },
    
    applyOptions: function() {
        overlay.css('opacity', this.options.opacity)
        box.addClass(this.options.className);
    }
}

Aino.modal.setOptions(true);

$(document).ready(function() {
    modal.appendTo(document.body);
})

})(jQuery);
