Ext.app.App = function(cfg){
   
Ext.apply(this, cfg);
   
this.addEvents({
       
'ready' : true,
       
'beforeunload' : true
   
});

   
Ext.onReady(this.initApp, this);
};

Ext.extend(Ext.app.App, Ext.util.Observable, {
    isReady
: false,
    startMenu
: null,
    modules
: null,

    getStartConfig
: function(){

   
},

    initApp
: function(){
       
this.startConfig = this.startConfig || this.getStartConfig();

       
this.desktop = new Ext.Desktop(this);

               
this.launcher = this.desktop.taskbar.startMenu;

               
this.modules = this.getModules();
       
if(this.modules){
           
this.initModules(this.modules);
       
}

       
this.init();

       
Ext.EventManager.on(window, 'beforeunload', this.onUnload, this);
               
this.fireEvent('ready', this);
       
this.isReady = true;
   
},

    getModules
: Ext.emptyFn,
    init
: Ext.emptyFn,

    initModules
: function(ms){
               
for(var i = 0, len = ms.length; i < len; i++){
           
var m = ms[i];
           
this.launcher.add(m.launcher);
            m
.app = this;
       
}
   
},

    getModule
: function(name){
       
var ms = this.modules;
       
for(var i = 0, len = ms.length; i < len; i++){
               
if(ms[i].id == name || ms[i].appType == name){
                       
return ms[i];
                       
}
       
}
       
return '';
   
},

    onReady
: function(fn, scope){
       
if(!this.isReady){
           
this.on('ready', fn, scope);
       
}else{
            fn
.call(scope, this);
       
}
   
},

    getDesktop
: function(){
       
return this.desktop;
   
},

    onUnload
: function(e){
       
if(this.fireEvent('beforeunload', this) === false){
            e
.stopEvent();
       
}
   
}
});