Ext.Desktop = function(app){
       
this.taskbar = new Ext.ux.TaskBar(app);
       
var taskbar = this.taskbar;
       
       
var desktopEl = Ext.get('x-desktop');
   
var taskbarEl = Ext.get('ux-taskbar');
   
var shortcuts = Ext.get('x-shortcuts');

   
var windows = new Ext.WindowGroup();
   
var activeWindow;
               
   
function minimizeWin(win){
        win
.minimized = true;
        win
.hide();
   
}

   
function markActive(win){
       
if(activeWindow && activeWindow != win){
            markInactive
(activeWindow);
       
}
        taskbar
.setActiveButton(win.taskButton);
        activeWindow
= win;
       
Ext.fly(win.taskButton.el).addClass('active-win');
        win
.minimized = false;
   
}

   
function markInactive(win){
       
if(win == activeWindow){
            activeWindow
= null;
           
Ext.fly(win.taskButton.el).removeClass('active-win');
       
}
   
}

   
function removeWin(win){
        taskbar
.removeTaskButton(win.taskButton);
        layout
();
   
}

   
function layout(){
        desktopEl
.setHeight(Ext.lib.Dom.getViewHeight()-taskbarEl.getHeight());
   
}
   
Ext.EventManager.onWindowResize(layout);

   
this.layout = layout;

   
this.createWindow = function(config, cls){
       
var win = new (cls||Ext.Window)(
           
Ext.applyIf(config||{}, {
                manager
: windows,
                minimizable
: true,
                maximizable
: true
           
})
       
);
        win
.render(desktopEl);
        win
.taskButton = taskbar.addTaskButton(win);

        win
.cmenu = new Ext.menu.Menu({
            items
: [

           
]
       
});

        win
.animateTarget = win.taskButton.el;
       
        win
.on({
               
'activate': {
                        fn
: markActive
               
},
               
'beforeshow': {
                        fn
: markActive
               
},
               
'deactivate': {
                        fn
: markInactive
               
},
               
'minimize': {
                        fn
: minimizeWin
               
},
               
'close': {
                        fn
: removeWin
               
}
       
});
       
        layout
();
       
return win;
   
};

   
this.getManager = function(){
       
return windows;
   
};

   
this.getWindow = function(id){
       
return windows.get(id);
   
}
   
   
this.getWinWidth = function(){
               
var width = Ext.lib.Dom.getViewWidth();
               
return width < 200 ? 200 : width;
       
}
               
       
this.getWinHeight = function(){
               
var height = (Ext.lib.Dom.getViewHeight()-taskbarEl.getHeight());
               
return height < 100 ? 100 : height;
       
}
               
       
this.getWinX = function(width){
               
return (Ext.lib.Dom.getViewWidth() - width) / 2
       
}
               
       
this.getWinY = function(height){
               
return (Ext.lib.Dom.getViewHeight()-taskbarEl.getHeight() - height) / 2;
       
}

    layout
();

   
if(shortcuts){
        shortcuts
.on('click', function(e, t){
           
if(t = e.getTarget('dt', shortcuts)){
                e
.stopEvent();
               
var module = app.getModule(t.id.replace('-shortcut', ''));
               
if(module){
                    module
.createWindow();
               
}
           
}
       
});
   
}
};