function showAbout() {
    var aboutContent = new Ext.Template(
        '<img src="{imagePath}/logo-gvcollege.png" />',
        '<p class="about-line">',
            '<b>GVcollege Versão {versao}</b>',
            '<br />&copy; 2004-{anoAtual} GVDASA Sistemas. Todos os direitos reservados. ',
            'GVcollege e logotipos GVcollege são marcas comerciais da GVDASA Sistemas. Todos os direitos reservados.',
        '</p>',
        '<h4>Bibliotecas utilizadas</h4>',
        '<p>',
            '<b>ADODB</b> - Biblioteca de abstração de dados',
            '<br />Licença <a href="http://www.gnu.org/licenses/gpl.html">GPL</a>',
        '</p>',
        '<p>',
            '<b>ExtJS</b> - Framework de desenvolvimento JavaScript',
            '<br />Licença <a href="http://extjs.com/license">Comercial</a>',
        '</p>',
        '<p>',
            '<b>FCKeditor</b> - Editor de textos para web',
            '<br />Licenças <a href="http://www.gnu.org/licenses/gpl.html">GPL 2+</a>, ',
            '<a href="http://www.gnu.org/licenses/lgpl.html">LGPL 2.1+</a> e <a href="http://www.mozilla.org/MPL/MPL-1.1.html">MPL 1.1+</a>',
        '</p>',
        '<p>',
            '<b>TCPDF</b> - Biblioteca para geração de PDF',
            '<br />Licença <a href="http://www.gnu.org/licenses/lgpl.html">LGPL 2.1</a>',
        '</p>',
        '<p>',
            '<b>Chart</b> - Biblioteca para exibição de gráficos com canvas',
            '<br />Licença <a href="http://eae.net/license/mit">MIT</a>',
        '</p>',
        '<p class="about-line">',
            '<b>webtoolkit</b> - Biblioteca JavaScript para funções diversas',
            '<br />Licença <a href="http://creativecommons.org/licenses/by/2.0/uk/">Creative Commons Attribution 2.0</a>',
        '</p>',
        '<p style="text-align: center;">',
            '<img src="{imagePath}/logo-gvdasa.png" style="margin-right: 22px;" />',
            '<img src="{imagePath}/logo-cmmi.png" style="margin-right: 20px;" />',
            '<img src="{imagePath}/logo-microsoft-gold.png" />',
        '</p>'
    );

    var aboutWindow = new Ext.Window({
        title      : 'Sobre o Sistema',
        layout     : 'fit',
        width      : 400,
        plain      : true,
		modal      : true,
		resizable  : false,
        closeAction: 'close',

        items: [{
            cls      : 'about-content',
            border   : false,
            bodyStyle: 'padding: 5px 8px; background-color: #fbffff;',
            html     : aboutContent.apply({
                imagePath: GVutils.basepath+'/resource/imagens',
                versao   : GVutils.version,
                anoAtual : (new Date()).getFullYear()
            })
        }],

        buttons: [{
           text     : 'Fechar',
           handler  : function(){
               aboutWindow.close();
           }
        }]
    });

    aboutWindow.show();
}

/**
 * Ao receber um retorno de um Ajax contendo a string que indica sessão encerrada,
 * redireciona o usuário para a página inicial/login do módulo correspondente
 * 
 * @param {Object} conn
 * @param {Object} response
 * @param {Object} options
 */
Ext.Ajax.on('requestcomplete', function(conn, response, options) {
    if ((typeof GVutils != 'undefined') && response.responseText.match('<!-- GVCOLLEGE_SESSION_EXPIRED -->')) {
        window.location.assign(GVutils.basepath+'?irModulo='+GVutils.modulo+'&session=0');
    }
});


/**
 * Utilidades...
 */
APSUtils = {
    MSGINFO: 0,
    MSGWARN: 1,
    MSGERRO: 2,
    MSGQUES: 3,

    /**
     * Máscara genérica a ser exibida durante requisições AJAX
     * a loadMask só é criada na primeira chamada, ou se o texto exibido for outro
     * 
     * TODO: transformar este objeto em uma classe Singleton
     */
    loadMask: {
        mask: null,
        show: function(message, target) {
            if (Ext.isEmpty(message)) message = 'Aguarde, por favor...';
            if (Ext.isEmpty(target )) target  = Ext.getBody();
            
            if (this.mask === null || message != this.mask.msg) {
                this.mask = new Ext.LoadMask(target, {msg: message});
            }
            
            this.mask.show();
            return this.mask;
        },
        hide: function() {
            if (this.mask !== null) this.mask.hide();
            return this.mask;
        }
    },

    /**
     * 
     * @param {String} msg
     * @param {Integer} type
     * @param {function} fn
     * @param {Ext.Component} scope
     */
    messageBox: function(msg, type, fn, scope) {
        var titulo, icone, botoes = Ext.Msg.OK;
        
        switch(type) {
            case this.MSGQUES:
                titulo = 'Confirmação';
                icone  = Ext.Msg.QUESTION;
                botoes = Ext.Msg.YESNO;
            break;
            case this.MSGERRO:
                titulo = 'Erro';
                icone  = Ext.Msg.ERROR;
            break;
            case this.MSGWARN:
                titulo = 'Atenção';
                icone  = Ext.Msg.WARNING;
            break;
            case this.MSGERRO:
            default:
                titulo = 'Informação';
                icone  = Ext.Msg.INFO;
            break;
        }
        
        Ext.Msg.show({
            title: titulo,
            icon: icone,
            msg: msg,
            buttons: botoes,
            fn: Ext.isEmpty(fn) ? Ext.emptyFn : fn,
            scope: Ext.isEmpty(scope) ? null : scope
        });
    }

};
