Ext.ns('InnateImmunity');

InnateImmunity.SampleSelector = function() {

    // private variables
    var rootComponent = null;
    var currentDataSetGridId = "sampleSelectGrid_Thunder"; 
    var datasets = null;
    var selectedRecords = [];

    var dataSetsStore = new Ext.data.ArrayStore({
        fields: [
            {name: 'displayName', type: 'string'},
            {name: 'componentId', type: 'string'}
        ]
    });
    var DataSetStoreRecord = Ext.data.Record.create({name: 'displayName'}, {name: 'componentId'});

    var sampleSelectStore = new Ext.data.ArrayStore({
        fields: [
            {name: 'id', type: 'string'},
            {name: 'sampleName', type: 'string'},
            {name: 'cd', type: 'string'},
            {name: 'mem', type: 'string'},
            {name: 'replicate', type: 'string'},
        ]
    });

    var SampleRecord = Ext.data.Record.create({name: 'id'}, {name: 'sampleName'}, {name: 'cd'}, {name: 'mem'}, {name: 'replicate'});

    var sampleSelectGrid = new Ext.grid.GridPanel({
        id: "sampleSelectGrid_Thunder",
        store: sampleSelectStore,
        columns: [{
            id: "sampleNameCol",
            header: "Sample Name",
            sortable: true,
            width: 160,
            dataIndex: "sampleName"
        },{
            id: "cdCol",
            header: "CD",
            sortable: true,
            width: 30,
            dataIndex: "cd"
        },{
            id: "memCol",
            header: "MEM",
            sortable: true,
            width: 100,
            dataIndex: "mem"
        },{
            id: "replicateCol",
            header: "Replicate",
            sortable: true,
            width: 71,
            dataIndex: "replicate"
        }],

        viewConfig: {
            forceFit: true
        },
        sm: new Ext.grid.RowSelectionModel({
            singleSelect: false,
            listeners: {
                selectionchange: setSampleSelection                                
            }
        }),
        stripeRows: true,
        border: false,
        tbar: [
            new Ext.Button({
                id: "showDataSetChangeWindowButton",
                text: "Select Dataset",
                handler: showDataSetChangeWindow,
                icon: '../../images/icons/application_view_list.png'
            })
        ]
    });





    // private methods
    function onDatasetChange() {
        var datasetSelectGrid = Ext.getCmp("datasetSelectGrid");
        var selectedDatasetRecord = datasetSelectGrid.getSelectionModel().getSelected();
        var componentId = selectedDatasetRecord.get("componentId");
        var newCmp = Ext.getCmp(componentId);
        currentDataSetGridId = componentId;
        if (newCmp) {
            // replace the 'sampleSelectorComponent' items with the new grid
            var sampleSelectorComponent = Ext.getCmp("sampleSelectorComponent");
            sampleSelectorComponent.removeAll(false);
            sampleSelectorComponent.add(newCmp);
        }

        Ext.getCmp("changeDatasetWindow").close();
    }

    function setSampleSelection() {
        // get the current displayed dataset and get its selection
        var grid = Ext.getCmp(currentDataSetGridId);
        var selectedDatasetRecords = grid.getSelectionModel().getSelections();
        // fill selected records with the ids of the samples
        selectedRecords = [];
        for(var i=0; i<selectedDatasetRecords.length; i++) {
            if(selectedDatasetRecords[i]) {
                selectedRecords[i] = selectedDatasetRecords[i].get("id");
            }
        }        
    }

    function showDataSetChangeWindow() {
        var win = new Ext.Window({
            id: "changeDatasetWindow",
            title: "Select Dataset",
            modal: true,
            width: 250,
            height: 325,
            items: [
                new Ext.grid.GridPanel({
                    id: "datasetSelectGrid",
                    store: dataSetsStore,
                    columns: [{
                        id: "dataSetDisplayNameCol",
                        header: "Dataset Name",
                        sortable: true,
                        dataIndex: "displayName"
                    }],
                    viewConfig: {
                        forceFit: true
                    },
                    sm: new Ext.grid.RowSelectionModel({singleSelect: true}),
                    stripeRows: true,
                    height: 325,
                    autoWidth: true,
                    border: false,
                    listeners: {
                        rowclick: onDatasetChange
                    }
                })
            ]
        });
        win.show();
    };

    function loadDataSets() {
        // load Thunder dataset
        dataSetsStore.add(new DataSetStoreRecord({displayName:'Thunder Mutant Data', componentId: 'sampleSelectGrid_Thunder'}));
        if (InnateImmunityMetadata && InnateImmunityMetadata.ThunderData && InnateImmunityMetadata.ThunderData.metadata && InnateImmunityMetadata.ThunderData.colToIndex) {
            var colToIndex = InnateImmunityMetadata.ThunderData.colToIndex;
            for (var i = 0; i < InnateImmunityMetadata.ThunderData.metadata.length; i++) {
                var row = InnateImmunityMetadata.ThunderData.metadata[i];                               
                sampleSelectStore.add(new SampleRecord({
                    id: row[colToIndex['id']],
                    sampleName: row[colToIndex['sampleName']],
                    cd: row[colToIndex['cd']],
                    mem: row[colToIndex['mem']],
                    replicate: row[colToIndex['replicate']]}));
            }
        }
    }


    function resetPrivateMemberVariables() {
        rootComponent = null;
    }

    function returnEmptyComponent() {
        return mainPanel = new Ext.Panel({
            autoWidth: true,
            height: 200,
            border: false
        });
    }


    // public
    return {
        // public properties

        // public methods
        getComponent: function() {
            if (rootComponent) {
                return rootComponent;
            } else {
                return returnEmptyComponent();
            }
        },

        getSelectedSamples: function() {
            return selectedRecords;
        },

        init: function(callbackFcn) {
            resetPrivateMemberVariables();

            loadDataSets();

            // select dataset
            rootComponent = new Ext.Panel({
                title: "Step 1. Select Samples to View",
                height: 200,
                autoWidth: true,
                border: false,
                id: "sampleSelectorComponent",
                layout: 'fit',
                items: [
                    sampleSelectGrid
                ]
            });

            callbackFcn();
        }
    };
}();














