var BodyController = new Class({
    options: {
        'flashHolder': $('flashes'),
        'flashDuration': 5000,

        'grabHtmlFlashes': true
    },
    Implements: Options,
    flashes: {},

    initialize: function(options) {
        this.setOptions(options);
        
        if(this.options.grabHtmlFlashes) {
            this.processHtmlFlashes( );
        }
    },

    processHtmlFlashes: function(element) {
        if(!element) {
            element = $$('body')[0];
        }

        var flashes = element.getElements(".flash");
        flashes.each(function(el) {
            el.removeClass("flash");
            this.addFlash(el.get('class'), el.get('html'), true, false);
            el.dispose();
        }.bind(this));
    },

    addStatusFlash: function(html, show, no_hide) {
        return this.addFlash('status', html, show, !no_hide);
    },
    addWarningFlash: function(html, show, no_hide) {
        return this.addFlash('warning', html, show, !no_hide);
    },
    addErrorFlash: function(html, show, no_hide) {
        return this.addFlash('error', html, show, !no_hide);
    },
    addFlash: function(type, html, show, autohide) {
        var div = new Element('div', {'class': type+" flash", 'html': html});
        this.flashes[div] = type;
        if(show) this.showFlash(div);
        if(autohide) {
            (function( ) { this.hideFlash(div); }.bind(this)).delay(
                this.options.flashDuration);
        }
        return div;
    },
    showFlash: function(div, autohide) {
        var flash = this.flashes[div];
        if(flash) {
            if(!div.retrieve('shown', false)) {
                if(this.options.flashHolder) {
                    div.inject(this.options.flashHolder);
                    div.setOpacity(0);
                    div.tween('opacity', 1);
                    div.store('shown', true);
                }
            }
        }
    },
    hideFlash: function(div) {
        var flash = this.flashes[div];
        if(flash) {
            if(div.retrieve('shown', false)) {
                if(this.options.flashHolder) {
                    div.tween('opacity', 0);
                    var opts = div.get('tween').options;
                    (function( ) { div.dispose(); }).delay(opts.duration);
                    div.store('shown', false);
                }
            }
        }
    }
});

var bodyController = null;

window.addEvent("domready", function(ev) {
    bodyController = new BodyController({
        'flashHolder': $$('body')[0].getElement("#flashes")
    });
    $$('body')[0].store('controller', bodyController);    
});

