(function($) {

    $.modal = {
        defaults: {

            succuess: {

            },
            error: {

            },
            confirm: {

            }
        }
    }

    $.modal.alert = function() {

    }

    $.close = function() {
        $('#alert').close();
    },

    $.alert = function(param) {
        var options = $.extend(true, {
            message: '',
            type: 'alert',
            className: 'error',
            buttons: ['ok'],
            onOk: function(element, cmd) {
                return true;
            },
            onCancel: function(element, cmd) {
                return true;
            },
            onYes: function(element, cmd) {
                return true;
            },
            onNo: function(element, cmd) {
                return true;
            }
        }, param || {});

        // element
        var window = $('#alert');

        // trigger
        function trigger() {
            console.debug(options);

            var cmd    = $(this).val();
            var cb     = 'on' + cmd.charAt(0).toUpperCase() + cmd.substr(1);
            var func   = $(options).attr(cb);

            if ($.isFunction(func)) {
                var result = func.bind(options)(window, cmd);

                if (result) {
                    $(window).close();
                }
            } else {
                $(window.close);
            }
        }

        // button click event handling
        $('div.buttons button', window).click(trigger);

        $(window).one('windowClose', function() {
            $('div.buttons button', window).unbind('click', trigger);
        });

        // show/hide buttons
        $('div.buttons button', window).hide();
        $(options.buttons).each(function (i, value) {
            $('div.buttons .' + value, window).show();
        });

        // set styles
        window.removeAttr('class')
              .addClass('window-' + options.className)
              .addClass('window-' + options.type)
              .addClass('window');

        // define message
        $('div.message', window).html(options.message);

        window.open(options);
    };

    $.confirm = function(message, options) {
        if ($.isObject(message)) {
            options = message;
            message = options.message;
        }
        
        options = $.extend({}, {
            message: message,
            type:      'confirm',
            className: 'confirm',
            buttons:   ['cancel', 'ok']
        }, options || {});

        $.alert(options);
    };

    $.success = function(message, options) { // based on $.alert()
        if ($.isObject(message)) {
            options = message;
        } else if (message) {
            options = options || {};
            options.message = message;
        }

        $.alert($.extend({
            message:   'Process successfully completed.',
            type:      'alert',
            className: 'success'
        }, options || {}));
    };

    $.error = function(message, options) { // based on $.alert()
        if (message && $.isObject(message)) {
            options = message;
        } else if (message) {
            options = options || {};
            options.message = message;
        }

        $.alert($.extend({
            message:   'An error occurred.',
            type:      'alert',
            className: 'error'
        }, options || {}));
    };

})(jQuery);
