AlertBox = Class.create({
    initialize: function(messageToDisplay,options)
    {
        if($('alertBox_overlay'))
            $('alertBox_overlay').remove();

        if($('alertBox_container'))
            $('alertBox_container').remove();

        if($('alertBox_okButton'))
            $('alertBox_okButton').remove();

        this.options =
        {
            alertType: 'Warning',
            callBack: null,
            appearEffect: null,
            appearOptions: null,
            disappearEffect: null,
            disappearOptions: null
        };
        Object.extend(this.options, options || {});

        this.messageToDisplay = messageToDisplay;

        this.showMe();
    },

    showMe: function()
    {
        var dim = document.viewport.getDimensions();
        var offsets = document.viewport.getScrollOffsets();
        // On ajoute un div d'overlay
        new Insertion.Top(document.body, '<div id="alertBox_overlay" style="display:none;"></div>');

        $('alertBox_overlay').setStyle(
        {
            width: dim.width+'px',
            height: dim.height+'px',
            left: offsets[0]+'px',
            top: offsets[1]+'px'
        });
        $('alertBox_overlay').addClassName('alertBox_overlay');
        $('alertBox_overlay').show();

        var str = '<div id="alertBox_container" style="display:none">';
        str += '<div class="alertBox_content">';
        str += '<div class="alertBox_image alertBox_' + this.options.alertType + '_Image"></div>';
        str += '<div class="alertBox_message">'+this.messageToDisplay+'</div>';
        str += '<div class="alertBox_buttonHolder"><a href="javascript:void(0);" id="alertBox_okButton" class="alertBox_okButton"><span>OK</span></a></div>';
        str += '</div></div>';

        new Insertion.Top(document.body, str);

        $('alertBox_container').addClassName('alertBox_' + this.options.alertType);
        $('alertBox_container').setStyle(
        {
            left: ((dim.width - $('alertBox_container').getWidth())/2)+'px',
            top:(((dim.height - $('alertBox_container').getHeight())/2)+offsets[1])+'px'
        });

        if(this.options.appearEffect)
            this.options.appearEffect('alertBox_container',this.options.appearOptions);
        else
            $('alertBox_container').show();

        if(this.options.okButtonClass)
            $('alertBox_okButton').addClassName(this.options.okButtonClass);

        Event.observe('alertBox_okButton', "click", this.okPressed.bind(this), false);
    },

    okPressed: function()
    {
        if(this.options.callBack)
        {
            console.warn('callback is deprecated, please use onButtonPressed');
            this.options.callBack();
        }
        if(this.options.onButtonPressed)
            this.options.onButtonPressed();
        this.hide();
    },

    hide: function()
    {
        if(this.options.disappearEffect)
        {
            this.options.disappearEffect('alertBox_overlay', this.disappearOptions);
            this.options.disappearEffect('alertBox_container', this.disappearOptions);
        }
        else
        {
            $('alertBox_overlay').remove();
            $('alertBox_container').remove();
        }
        if(this.options.onHide)
            this.options.onHide();
    }
});

Object.extend(AlertBox,
{
    _timer: null,
    _current: null,
    _closeIn: null,

    _alert: function(level, message, autoclose)
    {
        if(this._timer)
        {
            clearTimeout(this._timer);
            this._timer = null;
        }
        this._current = new AlertBox(message, {alertType: level, onHide: this._alertHidden.bind(this)});
        if(autoclose)
        {
            this._closeIn = autoclose;
            this._autoClose();
        }
    },

    _autoClose: function()
    {
        this._timer = null;
        if(this._closeIn <= 0)
        {
            this._current.hide();
        }
        else
        {
            $('alertBox_okButton').down().update('OK (' + this._closeIn + ')');
            this._closeIn--;
            this._timer = setTimeout(this._autoClose.bind(this), 1000);
        }
    },

    _alertHidden: function()
    {
        this._current = null;
        if(this._timer)
            clearTimeout(this._timer);
        this._timer = null;
    },

    info: function(message, autoclose)
    {
        this._alert('Info', message, autoclose);
    },

    warn: function(message, autoclose)
    {
        this._alert('Warning', message, autoclose);
    },

    error: function(message, autoclose)
    {
        this._alert('Error', message, autoclose);
    },

    form: function(level, title, autoclose, containerForm, showError, validators)
    {
        var str = title + '<ol>';
        validators.each(function(v){
           str += '<li>' + v.options.message + '</li>';
        });
        str += '</ol>';
        this[level](str, autoclose);
    }
}
);
