/* Ajax spinner implementation */
Ext.Ajax.on('beforerequest', function(connection, options){
    
    Spinner.show();
    
})

/* Ajax messagestack implementation */
Ext.Ajax.on('requestcomplete', function(connection, response, options){
    
    Spinner.hide();
    
    if (!isJSON(response.responseText))
        return;
        
    var obj = Ext.decode(response.responseText);
    
    if ((obj.silent && obj.silent == true) || !obj.messages)
        return;
        
    if (typeof obj.messages == 'object' && obj.messages.length !== 0)
        MessageStack.init(obj.messages).render();
})

var Spinner = {
    show: function()
    {
        if ($('#mask').length)
            return;
        $(document.body).append('<div id="mask" style=""></div>');
        $('#mask').css({
            zIndex: 20000,
            position: 'absolute',
            width: '81px',
            height: '35px',
            top: '40%',
            left: '48%'
        })
        Ext.get('mask').mask("Loading", "x-mask-loading");
    },
    
    hide: function()
    {
        $('#mask').remove();
    }
}

var MessageStack = {
    _target: '#inside-box',
    _stack: [],
    _sortOrder: ['error', 'warning', 'notice', 'success'],
    
    init: function(messages)
    {
        this.clear();
        this._toString(messages);
        return this;
    },
    
    render: function()
    {
        $(this._target).prepend('<div id="messages"></div>');
        for (var i in this._stack) {
            if (typeof this._stack[i] != 'string' || this._stack[i] == '')
                continue;
            $('#messages', this._target).append(this._stack[i]);
        }
    },
    
    clear: function()
    {
        this._stack = [];
        $('#messages', this._target).remove();
    },
    
    hide: function(e)
    {
        $(e).fadeOut();
    },
    
    _toString: function(messages)
    {
        /* first read important messages */
        for (var i in this._sortOrder) {
            if (!messages[this._sortOrder[i]] || !messages[this._sortOrder[i]].length)
                continue;
            
            this._fillStack(this._sortOrder[i], messages[this._sortOrder[i]]); 
            
            /* delete processed messages */
            delete messages[this._sortOrder[i]]; 
        }
        
        /* read everything else */
        for (var i in messages) {
            if (!messages[i] || !messages[i].length || typeof messages[i] == 'function') 
                continue;
                
            this._fillStack(i, messages[i]);
                
            /* delete processed messages */
            delete messages[i]; 
        }
    },
    
    _fillStack: function(type, messages)
    {
        this._stack[type] = 
            '<ul class="' + type + '-msg" title="' + type + '" onclick="MessageStack.hide(this)">' +
                this._parse(messages) + 
            '</ul>';
    },
    
    _parse: function(object)
    {
        if (typeof object == 'string')
            return object;
        
        var parsed = '';
            
        for (var i in object) {
            if (typeof object[i] == 'function')
                continue;
            parsed += '<li>' + object[i] + '</li>';
        }
        return parsed; 
    }
    
}

function isJSON(str) {
    if (str == '') return false;
    str = str.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '');
    return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str);
}