/**
 * @author SHarper
 */
Ext.ns('DD');
var global;
DD.FMEServerFormPanel = Ext.extend(Ext.FormPanel, {

    initComponent: function(){
        Ext.apply(this, {
            title: '',
            labelWidth: 180,
            labelAlign: 'left',
            layout: 'form',
            width: 450,
            padding: 10,
            fmeWorkspaceManager: null,
            items: [this.buildFormItems()]
        
        
        });
        
        //This could be improved and made cleareer
        
        this.fmeWorkspaceManager = new fmeWorkspaceManager(url + '/fmerest/repositories/Samples/easyTranslator/parameters.xml?token=' + tokenId);
        
        this.parametersStore = this.fmeWorkspaceManager.createParametersStore();
        
        this.parametersStore.on('load', function(){
            this.fmeWorkspaceManager.generateFormItems(this.parametersStore);
            
            this.add(new Ext.Button({
                text: 'Download Data',
                iconCls: 'orderData',
                scale: 'large',
                handler: this.sendRequest.createDelegate(this)
            }));
            this.doLayout();
            
        }
.createDelegate(this));
        
        DD.FMEServerFormPanel.superclass.initComponent.call(this);
    },
    
    buildFormItems: function(){
    
        return [{
            xtype: 'fieldset',
            checkboxToggle: false,
            title: 'Step 1: Upload Data to be Translated',
            autoHeight: true,
            collapsed: false,
            id: 'upload-fieldset',
            labelWidth: 100,
            
            items: []
        }, {
            xtype: 'fieldset',
            checkboxToggle: false,
            title: 'Step 2: Set Parameters',
            autoHeight: true,
            defaultType: 'textfield',
            collapsed: false,
            id: 'parameters-fieldset',
            items: []
        }, {
            xtype: 'fieldset',
            title: 'Step 3: Email Results of Translation',
            autoHeight: true,
            defaultType: 'textfield',
            id: 'email-fieldset',
            items: [{
                xtype: 'textfield',
                anchor: '100%',
                id: 'email-address',
                allowBlank: false,
                fieldLabel: 'Email address'
            }],
            listeners: {
                collapse: function(){
                
                    Ext.getCmp('email-address').disable();
                },
                
                expand: function(){
                    Ext.getCmp('email-address').enable();
                }
            }
        }]
        
    },
    
    
    sendRequest: function(){
        if (this.getForm().isValid()) {
            var runWorkspace = function(inUploadObject){
            
                var storeItemsUpload = inUploadObject.storeItemsUpload;
                
                //Run translation
                
                
                //Dynamically generate a list of params
                var keyPairValues = Ext.getCmp('fmeserverformpanel').getForm().items;
                var paramArray = [];
                var data = {};
                var records = null;
                //Gets each item in the grid
                var itemsInGrid = Ext.getCmp('uppanel').store.each(function(record){
                
                    //using the file name do a regular expression to extract the coreesponding records from the response
                    var regex = new RegExp('(.+?)(.[^.]*$|$)');
                    var fileTidied = regex.exec(record.data.fileName);
                    
                    records = storeItemsUpload.query('name', fileTidied[1]);
                    
                }, this);
                
                
                for (var i = 0, len = records.getCount(); i < len; i++) {
                    if (i == 0) {
                        if (records.getCount() == 1) {
                            data[records.items[i].data.paramField] = '' + records.items[i].data.paramValue + '';
                        }
                        else {
                            data[records.items[i].data.paramField] = '""' + records.items[i].data.paramValue + '"';
                        }
                    }
                    else 
                        if (i == (len - 1)) {
                        
                            data[records.items[i].data.paramField] += ' "' + records.items[i].data.paramValue + '""';
                        }
                        else {
                            data[records.items[i].data.paramField] += ' "' + records.items[i].data.paramValue + '"';
                        }
                    
                }
                
                
                keyPairValues.each(function(f){
                    if (f.isVisible()) {
                    
                        if (f.paramField != undefined) {
                            data[f.paramField] = f.getValue();
                        }
                        
                        
                    }
                    
                });
                
                // Create async request with email if required
                
                data['opt_servicemode'] = 'async';
                data['opt_requesteremail'] = Ext.getCmp('email-address').getValue();
                
                // loop through all items in form and extract values
                //?COORDSYS=
                this.processingMask = new Ext.LoadMask('fmeserverformpanel', {
                    msg: "Translating Data...."
                });
                this.processingMask.show();
                
                Ext.Ajax.request({
                    scope: this,
                    timeout: 180000,
                    url: url + '/fmerest/repositories/Samples/easyTranslator.fmw/fmedatadownload/run.json?token=' + tokenId,
                    success: function(resp){
                        this.parseFMEServerResult(resp);
                        this.processingMask.hide();
                    },
                    failure: function(resp){
                        this.processingMask.hide();
                        this.parseFMEServerResult(resp);
                    },
                    params: data
                }, this);
                
                
            }.createDelegate(this)
            
            Ext.getCmp('uppanel').on('nofilestoupload', function(inUploadObject){
                if (!this.uploadedOnce) {
                    runWorkspace(inUploadObject);
                    this.uploadedOnce = true;
                }
            }, this);
            
            // Use response to extract path values and load into the data object
            Ext.getCmp('uppanel').on('allfinished', function(inUploadObject){
                if (!this.uploadedOnce) {
                    runWorkspace(inUploadObject);
                    this.uploadedOnce = true;
                }
            }, this);
            
            this.uploadedOnce = false;
            
            this.processingMask = new Ext.LoadMask('fmeserverformpanel', {
                msg: "Uploading Data...."
            });
            this.processingMask.show();
            // Upload data
            Ext.getCmp('uppanel').onUpload();
        }
    },
    
    parseFMEServerResult: function(resp){
        try {
            var jsonResp = Ext.decode(resp.responseText).serviceResponse;
            var textResp;
            
            if (jsonResp.statusInfo.mode === "async") {
            
                textResp = ddHtmlTemplates.emailResponseTemplate(jsonResp);
            }
            else {
            
                var numFeatures = parseInt(jsonResp.fmeTransformationResult.fmeEngineResponse.numFeaturesOutput);
                
                if ((jsonResp.fmeTransformationResult.fmeServerResponse.jobStatus === "SUCCESS") && (numFeatures > 0)) {
                
                    textResp = ddHtmlTemplates.successResponseTemplate(jsonResp);
                }
                else 
                    if (numFeatures === 0) {
                        textResp = ddHtmlTemplates.noResultsResponseTemplate();
                    }
                    else {
                        textResp = ddHtmlTemplates.failedResponseTemplate(jsonResp.statusInfo.message);
                        
                    }
                
            }
            
            Ext.getCmp('main-tab-panel').add({
                xtype: 'panel',
                title: 'Result',
                html: textResp,
                closable: true
            }).show();
        } 
        catch (e) {
            Ext.Msg.show({
                title: 'Translation Failed',
                maxWidth: 400,
                msg: 'Translation has timed out. Please choose to email the results in Step 3 instead.',
                buttons: Ext.Msg.OK,
                animEl: 'elId',
                icon: Ext.MessageBox.WARNING
            });
        }
        
        
    },
    
    getFormatResponse: function(){
    
        return {
            xtype: 'xmlStore',
            
            initComponent: function(){
            
                Ext.apply(this, {});
                
                DD.store.FMEServerJSONStore.superclass.initComponent.call(this);
            },
            
            setUrl: function(inMethodType){
                this.proxy.setUrl()
            }
        }
    }
});

Ext.reg('fmeserverformpanel', DD.FMEServerFormPanel);

