/*
 * Ext JS Library 2.2.1
 * Copyright(c) 2006-2009, Ext JS, LLC.
 * licensing@extjs.com
 * 
 * http://extjs.com/license
 */

Ext.Desktop = function(app){
	this.id = 'main-desktop';
	this.taskbar = new Ext.ux.TaskBar(app);
	var taskbar = this.taskbar;
	this.miniSizes = {
		'nfp' : 100,
		'ISBP' : 60,
		'ISSP' : 40,
		'RSFAFPortlet' : 40,
		'ICEAbroadPortlet' : 40,
		'CBIRatesPortlet' : 30,
		'BankRatesPortlet' : 40,
		'ReiborPortlet' : 40,
		'CP' : 40
	};
	var portletCount = 0;
	var desktopEl = Ext.get('x-desktop');
    var taskbarEl = Ext.get('ux-taskbar');
    var shortcuts = Ext.get('x-shortcuts');
    var portalEl = Ext.get('portal');
    var firstPortalColumnEl = Ext.get('portal-column-0');
    var secondPortalColumnEl = Ext.get('portal-column-1');
    var thirdPortalColumnEl = Ext.get('portal-column-2');
    
    this.windows = new Ext.WindowGroup(); 
    var windows = this.windows; 
    var activeWindow;
		
    function minimizeWin(win){
        win.minimized = true;
        win.hide();
    }
    function maximizeWin(win) {
    	win.maximized = true;
    }
    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');
        }
    }

    this.removeWin = function(win){
        taskbar.removeTaskButton(win.taskButton);
        layout();
    }
    this.addTaskButton = function(win) {
    	win.taskButton = this.taskbar.addTaskButton(win.taskButton);
    	layout();
    }
    this.buttonExists = function(win) {
    	return taskbar.taskButtonExists(win);
    }
    this.hideTaskButton
    
    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(Ext.getBody());
    	win.render(Ext.get('main-portal'));
        win.taskButton = taskbar.addTaskButton(win);
        win.on('move',function(){
			if(this.getPosition()[1] <= 108) {
				this.suspendEvents();
				this.setPosition(win.getPosition()[0],108);
				this.resumeEvents();
			}
		},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: this.removeWin
        	},
        	'maximize' : {
        		fn: maximizeWin
        	}
        });
        /*
        Ext.Ajax.request({
    		url: window.location.protocol+"//"+window.location.hostname+"/"+basePath+"keldaconnect/notify",
    		success:Ext.emptyFn,
    		failure:Ext.emptyFn,
    		params:{
    			ObjectName:win.title,
    			Action:'new_window'
    		}
    	});
    	*/
        layout();
        return win;
    };
    this.createStandAloneWin = function(config,cls) {
    	var win = new Ext.Window(config);
            //win.render(Ext.getBody());
        	win.render(Ext.get('main-portal'));
            win.on('move',function(){
    			if(this.getPosition()[1] <= 108) {
    				this.suspendEvents();
    				this.setPosition(win.getPosition()[0],108);
    				this.resumeEvents();
    			}
    		},win);
            win.cmenu = new Ext.menu.Menu({
                items: [
                        
                ]
            });
            layout();
            return win;
    };
    this.createStandAloneIWin = function(config,cls) {
    	var win = new Ext.ux.ManagedIFrame.Window(config);
            //win.render(Ext.getBody());
        	win.render(Ext.get('main-portal'));
            win.on('move',function(){
    			if(this.getPosition()[1] <= 108) {
    				this.suspendEvents();
    				this.setPosition(win.getPosition()[0],108);
    				this.resumeEvents();
    			}
    		},win);
            win.cmenu = new Ext.menu.Menu({
                items: [
                        
                ]
            });
            layout();
            return win;
    };
    //phone home ?
    this.createPortlet = function(portletRegId,title,hcfg,items,cnr) {
    	var portal = Ext.getCmp('main-portal');
    	var newItems;
    	if(items)newItems = items;
    	else
    		newItems = {xtype:portletRegId+"_Child"
    					//,id:portletRegId+"_"+portletCount+"_Child"
    					};  
    	var newPortlet = {
    		xtype:portletRegId,
    		id:portletRegId+'_'+(Math.random()*1000),
    		//stateId:portletRegId+"_"+Math.random()*100,
    		//title:title.toUpperCase(),
    		header:true,
    		name:title,
    		//id:portletRegId+"_"+portletCount,
    		headerCfg:hcfg,
    		items : newItems
    	};
    	portletCount++;
    	
    	var mini = 0;
    	var desktopprev = Ext.getCmp('desktopprev');
    	if(cnr >= 0 && cnr < 3) {
    		portal.items.items[cnr].add(newPortlet);
    		mini = cnr;
    	}else {
    		//put it in the column which has the fewest rows.
        	var len_0 = portal.items.items[0].items.length;
        	var hei_0 = portal.items.items[0].getSize().height;
        	var len_1 = portal.items.items[1].items.length;
        	var hei_1 = portal.items.items[1].getSize().height;
        	var len_2 = portal.items.items[2].items.length;
        	var hei_2 = portal.items.items[2].getSize().height;
        	if(hei_1 < hei_0 && hei_1 <= hei_2) {
        		portal.items.items[1].add(newPortlet);
        		mini = 1;
        	}
        	else if(hei_2 < hei_0 && hei_2 <= hei_1) {
        		portal.items.items[2].add(newPortlet);
        		mini = 2;
        	}
        	else {
        		portal.items.items[0].add(newPortlet);
        		mini = 0;
        	}
    	}
    	
    	if(desktopprev) {
    		desktopprev.items.items[mini].add({
    			id:newPortlet.id+'_mini',
    			xtype:'panel',
    			plugins:[Ext.ux.PortletMiniPlugin],
    			header:true,
    			bodyCssClass:'portlet-mini-body',
    			title:title,
    			tools:[{
    				id:'close',
    				qtip:keldan_lang_text('close'),
    				handler: function(e, target, panel){
    					panel.ownerCt.remove(panel, true);
    					var parent = Ext.getCmp(panel.id.substring(0,panel.id.length-5));
    					parent.ownerCt.remove(parent,true);
	            	}
    			}],
    			height:this.miniSizes[newPortlet.xtype]
    			
    		});
    		desktopprev.doLayout();
    	}
    	
        portal.doLayout();
    };
    
    
    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();
                }
            }
        });
    }
};