define(function(require, module, exports) {
    main.consumes = ["Plugin"];
    main.provides = ["dialog.alert"];
    return main;
    
    function main(options, imports, register) {
        var Plugin = imports.Plugin;
        
        var plugin = new Plugin("Ajax.org", main.consumes);
        var emit = plugin.getEmitter();
        
        var alertInternal;
        
        function show(title, header, msg, onhide, options) {
            if (alertInternal)
                return alertInternal.show(title, header, msg, onhide, options);
            
            alert(title
                + (header ? "\n\n" + header : "")
                + (msg ? "\n\n" + msg : ""));
            onhide && onhide();
        }
        
        function hide() {
            if (alertInternal)
                alertInternal.hide.apply(alertInternal, arguments);
        }
        
        /***** Register *****/
        
        /**
         *
         */
        plugin.freezePublicAPI({
            /**
             * @readonly
             */
            get dontShow() { 
                return alertInternal && alertInternal.dontShow;
            },
            
            get aml() {
                return alertInternal && alertInternal.aml;
            },
            
            /**
             * Show an alert dialog.
             * 
             * @param {String} [title]     The title to display
             * @param {String} header      The header to display
             * @param {String} [msg]       The message to display
             * @param {Function} [onhide]  The function to call after it's closed.
             */
            show: show,
            
            /**
             * Hide an alert dialog.
             */
            hide: hide,
            
            /**
             * @internal
             */
            get alertInternal() { return alertInternal; },
            
            /**
             * @internal
             */
            set alertInternal(value) {
                alertInternal = value;
                alertInternal.on("show", function(e) {
                    emit("show", e);
                });
                alertInternal.on("hide", function(e) {
                    emit("hide", e);
                });
                alertInternal.on("draw", function(e) {
                    emit.sticky("draw", e);
                });
            },
                
            _events: [
                /**
                 * Fires when the form is drawn.
                 * @event draw
                 */
                "draw",
                /**
                 * Fires when the form becomes visible. This happens when
                 * it's attached to an HTML element using the {@link #attachTo}
                 * method, or by calling the {@link #method-show} method.
                 * @event show
                 */
                "show",
                /**
                 * Fires when the form becomes hidden. This happens when
                 * it's detached from an HTML element using the {@link #detach}
                 * method, or by calling the {@link #method-hide} method.
                 * @event hide
                 */
                "hide"
            ],
        });
        
        register("", {
            "dialog.alert": plugin
        });
    }
});