/** 
 * Project   : AMDA-NG
 * Name      : InteropModule.js
 * @class    amdaDesktop.InteropModule
 * @extends  amdaDesktop.AmdaModule
 * @brief    Interop Module controller definition 
 * @author   Benjamin RENARD
 * $Id: InteropModule.js 1870 2013-11-22 13:43:34Z elena $
 *****************************************************************************
 *    FT Id     :   Date   : Name - Description
 *******************************************************************************
 *  			 23/04/2012: BRE  - file creation
 */


Ext.define('amdaDesktop.InteropModule', {
	extend: 'amdaDesktop.AmdaModule',
	
	requires: [
        'amdaUI.InteropUI',
        'amdaDesktop.SampModule'
    ],
    
	contentId : 'interopUI',
	
    /**
     * @cfg {String} window definitions
     * @required
     */
	height:    580,
	width:     850,
	uiType :    'panelInterop',
	helpTitle :'Help on Interop Module',
	
	samp : null,
		 
	sampclientsStore : new Ext.data.SimpleStore({
		idProperty: 'id',
        fields: [
                   {name: 'id'},
                   {name: 'name'},
		           {name: 'descriptionText'},
		           {name: 'iconUrl'},
		           {name: 'acceptVOTable', type : 'boolean'},
		           {name: 'acceptFITS', type : 'boolean'}
		        ]
		    }),
	
	init : function() {	
    	this.launcher = {
    			text : this.title,
    			iconCls : this.icon,
    			handler : this.createWindow,
    			scope : this
		};
    },
    
    initSampConnector : function(successfn)
    {
	    var me = this;
	    if (!this.samp)
    	{
    		this.samp = Ext.create('amdaDesktop.SampModule',{
    			listeners : {
    				connected : function(o,success)
    				{
    					if (!success)
    						Ext.Msg.show( {
    							title : 'SAMP',
    							msg : 'Cannot connect AMDA to a hub',
    							modal : false,
    							icon : Ext.Msg.ERROR,
    							buttons : Ext.Msg.OK
    						});
    					me.updateStatus();
    					me.updateClients();
    				},
    				disconnected : function(o,success)
    				{
    					me.updateStatus();
    					me.sampclientsStore.removeAll();
    					me.updateClients();
    				},
    				clientregister : function(o,id)
    				{
    					me.updateClients();
    				},
    				clientunregister : function(o,id)
    				{
    					var record = me.sampclientsStore.getById(id);
    					if (record)
    					{
    						me.sampclientsStore.remove(record);
    						me.updateClients();
    					}
    				},
    				clientmetachange : function(o,id,data,subs)
    				{
    					var record = me.sampclientsStore.getById(id);
    					
    					if (!record)
    					{
    						me.sampclientsStore.add({id : id});
    						record = me.sampclientsStore.getById(id);
    					}
    					
    					if (record)
    					{
    						record.set('descriptionText',data['samp.description.text']);
    						record.set('iconUrl',data['samp.icon.url']);
    						record.set('name',data['samp.name']);
    						if (subs)
    						{
    							record.set('acceptVOTable',
    									me.samp.isSubscribed(subs,"table.load.votable"));
    							record.set('acceptFITS',
    									me.samp.isSubscribed(subs,"image.load.fits"));
    						}
    					}
    						
    					me.updateClients();
    				},
    				clientsubs : function(o,id,data)
    				{
    					var record = me.sampclientsStore.getById(id);
    					
    					if (!record)
    						return;
    					
    					if (record)
    					{
    						record.set('acceptVOTable',
    								me.samp.isSubscribed(data,"table.load.votable"));
    						record.set('acceptFITS',
    								me.samp.isSubscribed(data,"image.load.fits"));
    					}
    						
    					me.updateClients();
    				},
    				uploadfile : function(o,clientName,url,format)
    				{
    					myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.upload.id, true, function (module) {
		        			module.uploadNotification(url,format);
		        		});
    				}
    			}
    		});
    		this.samp.loadScript(function (s){
    			if (successfn)
    				successfn.call(me.samp);
    		});	
    	}
	    else
	    	this.samp.loadScript(function (s){
    			if (successfn)
    				successfn.call(me.samp);
    		});	
    },
    
    updateStatus : function()
    {
    	if (this.app && this.samp)
    	{
    		var desktop = this.app.getDesktop();
    		
    		var isConnected = this.samp.isConnected();
    		
    		if (desktop)
    		{
    			var win = desktop.getWindow(this.id);
    			if (win && win.isVisible)
    				win.items.items[0].updateStatus(isConnected);
    		
    			var taskbar = desktop.taskbar;
    			
    			if (taskbar)
    			{
    				var samptb = taskbar.getComponent('samptb');
    				if (samptb)
    					samptb.updateStatus(isConnected);
    			}
    		}
    	}
    },
    
    updateClients : function()
    {
    	if (this.app && this.samp)
    	{
    		var desktop = this.app.getDesktop();
    		
    		var isConnected = this.samp.isConnected();
    		
    		if (desktop)
    		{
    			var win = desktop.getWindow(this.id);
    		
    			var taskbar = desktop.taskbar;
    			
    			if (taskbar)
    			{
    				var samptb = taskbar.getComponent('samptb');
    				if (samptb)
    					samptb.updateClients(this.sampclientsStore);
    			}
    		}
    	}
    },
    
    sampConnected : function()
    {
    	if (!this.samp)
    		return false;
	    return this.samp.isConnected();
    },
    
    sendVOTable : function(file,clientId)
    {
    	if (!this.samp)
    		return false;
    	var href = window.location.href;
    	var baseurl = href.replace('desktop.php','');
    	this.samp.sendVOTable(baseurl+file,clientId);
    },
    
    sendAladinScript : function(script)
    {
    	if (!this.samp)
    		return false;
    	this.samp.sendAladinScript(script);
    },
    
    sendFITS : function(url,name)
    {
    	if (!this.samp)
    		return false;
    	this.samp.sendFITS(url,name);
    },
    
    generateAladinScript : function(urlList, scriptType)
	{
		/*var script="reset;"; //reset all views & all planes
        // first get files 
        var scriptHead='';
        //var script="#AJS;\n";
        //scriptHead+="trace 3;"; //
        for( var i=0; i < urlList.length; i++)
        {
            var url = urlList[i].url;
            var name = urlList[i].name;
            scriptHead += 'get File(' + url +','+name+');';
            scriptHead += 'sync;';
        }*/

        //scriptHead += 'sync;';

        /*for( var i=0; i < urlList.length; i++)
        {
            //then modify some fits values
            var name = urlList[i].name;
            scriptHead += 'set '+name+' FITS:CRVAL1=0;';
            scriptHead += 'set '+name+' FITS:CRVAL2=0;';
        }*/

        //scriptHead += 'sync;';
        
        // add som method specific lines
        /*switch( scriptType )
        {
            case( 'mosaic' ):
                // first insert the modeview
                script += "mview 16;";
                // then download the files
                script += scriptHead;
                //for( var i=0; i < urlList.length; i++){
                //    // we also shall position each image in the grid
                //    var gridCols = ["A", "B", "C", "D"];
                //    var colIndex = i%4;
                //    var lineIndex = 1+Math.floor(i/4);
                //    script += "cview "+i+" "+gridCols[colIndex]+lineIndex+";\n";
                //}
                break;

            case( 'movie' ):
                // download first
                script += scriptHead;
                script += 'blink ';
                for( var i=1; i < urlList.length; i++){
                    script += urlList[i].name+" ";
                }
                script += ';';
                break;

            case( 'diff' ):
                // download first
                script += scriptHead;
                for( var i=1; i < urlList.length; i++){
                    var diffName = 'diff' + i;
                    var currRawName = urlList[i].name;
                    var prevRawNum = i-1;
                    var prevRawName = urlList[prevRawNum].name;
                    script += diffName + ' = ' + currRawName + ' - ' + prevRawName + ';\n';
                }
                script += 'sync;';
                script += 'diff_movie = blink ';
                for( var i=1; i < urlList.length; i++){
                    script += 'diff'+i+' ';
                }
                script += ';';
                break;
        }
        //script += 'sync;';*/
    	
    	var script = 'reset;';
    	
    	for( var i=0; i < urlList.length; i++)
		{
			var url = urlList[i].url;
			var name = urlList[i].name;
			script += 'get File(' + url +','+name+');'; 
		}
    	
    	script += 'sync;';
    	
    	/*for( var i=0; i < urlList.length; i++)
        {
            //then modify some fits values
            var name = urlList[i].name;
            script += 'set '+name+' FITS:CRPIX1=100;';
            script += 'set '+name+' FITS:CRPIX2=0;';
        }*/
    	
    	switch( scriptType )
        {
            case('mosaic'):
            	{
            		
            		script += 'sync;mview 16';
            	}
            	break;
            case('movie'):
            	{
	            	script += 'blink ';
	                for( var i=1; i < urlList.length; i++){
	                    script += urlList[i].name+" ";
	                }
	                script += ';';
            	}
            break;
        }
    	
    	
    	
        return script;     	
	},
    
    switchSampConnect : function()
    {
    	var me = this;
    	//loadMask.show();
    	this.initSampConnector(function (s){
    		if (me.samp.isConnected())
    		{
    			me.samp.disconnect();
    		}
    		else
    		{
    			me.samp.connect();
    			//	loadMask.hide();
    		}
    	});
    	
    },

    forceSampDisconnect : function()
    {
    	if (!this.samp)
    		return;
    	
    	if (!this.samp.isConnected())
    		return;
    	
    	this.samp.disconnect();
    },
    
    getVOTableClients : function ()
    {
    	//return list of all clients that can receive a VOTable
    	if (!this.samp)
    		return [];
    	var result = new Array();
    	this.sampclientsStore.each(function (client){
    		if (client.get('acceptVOTable'))
    			result.push({id : client.get('id'), name : client.get('name'), icon : client.get('iconUrl')});
    			
    	},this);
    	return result;
    },
    
    getFITSClients : function ()
    {
    	//return list of all clients that can receive a FITS image
    	if (!this.samp)
    		return [];
    	var result = new Array();
    	this.sampclientsStore.each(function (client){
    		if (client.get('acceptFITS'))
    			result.push({id : client.get('id'), name : client.get('name'), icon : client.get('iconUrl')});
    			
    	},this);
    	return result;
    	
    },
 // arguments from launcher : CONFIG (OBJECT!!!)    
	createWindow : function(config){         
    	var me = this;
	var baseId = null;
	
    	if (!Ext.isObject(config)) {
	  baseId = config;
	}
	    var desktop = this.app.getDesktop();
	    var win = desktop.getWindow(this.id);
           
            activeTab = 1;
	   
	    if(!win)
	    {
	        win = desktop.createWindow({		  
	            id: this.id,
	            title:this.title, 
		    layout: 'anchor',
		    width:600,
	            height:550,  
	            modal: true,
		    minimizable: false,
	            iconCls: this.icon,
	            animCollapse:false,
	            constrainHeader:true,
	            bodyPadding : 5,
		    stateful : true,
		    stateId  : this.id,
		    stateEvents: ['move','show','resize'],
	            items : [
	              {
	            	  xtype: 'panelInterop',
	            	  clientsStore : this.sampclientsStore,
			  activeTab : activeTab, 
			  baseId : baseId,
	            	  onSwitchConnect : function ()
	            	  {
	            	  	me.switchSampConnect();
	            	  }
	              }
	            ]
	        });
	    } 
	    
	    if (me.samp && me.samp.ready)
	    	this.updateStatus();
	    
	    win.show();
	    return win;
	}

});