From 13f28b15f9ba78eb63448d632f05fa25ae8202d7 Mon Sep 17 00:00:00 2001
From: Hacene SI HADJ MOHAND <hacene.si-hadj-mohand@akka.eu>
Date: Wed, 21 Aug 2019 14:43:27 +0200
Subject: [PATCH] rm_7054 in progress

---
 js/app/views/CatalogUI.js | 2022 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 1 file changed, 1010 insertions(+), 1012 deletions(-)

diff --git a/js/app/views/CatalogUI.js b/js/app/views/CatalogUI.js
index 3d9ec32..cc79298 100644
--- a/js/app/views/CatalogUI.js
+++ b/js/app/views/CatalogUI.js
@@ -8,1039 +8,1037 @@
  */
 
 Ext.define('amdaUI.CatalogUI', {
-	extend: 'Ext.container.Container',
-	alias: 'widget.panelCatalog',
-
-	requires: [
-    'Ext.ux.grid.menu.RangeMenu',
-    'Ext.ux.grid.FiltersFeature',
-		'Ext.ux.grid.filter.DateFilter',
-		'Ext.ux.grid.filter.NumericFilter',
-    'Ext.ux.grid.filter.StringFilter',
-		'Ext.grid.plugin.BufferedRenderer',
-    'amdaUI.StatisticalPlug'
-	],
-
-	isCatalog : true,
-                   statics: {
-		COL_TO_HIDE_DURATION : 'colToHideDuration'
-	},
-
-	constructor: function(config) {
-		this.init(config);
-		this.callParent(arguments);
-		this.toReconfigure = true;
-
-		if (this.object) {
-			this.loadObject();
-		}
-	},
-
-	setObject : function (object, toReconfigure) {
-		if (toReconfigure)
-			this.toReconfigure = true;
-		// set object
-		this.object = object;
-		// load object into view
-		this.loadObject();
-                                         // show the default duration column
-		this.TTGrid.headerCt.getGridColumns();
-
-		Ext.Array.each(this.TTGrid.headerCt.getGridColumns(), function(item,index,all){
-			// if item is the default duration column
-			if ( item.id == amdaUI.CatalogUI.COL_TO_HIDE_DURATION+'2' ) {
-				// show this column
-				item.show();
-			}
-		});
-                                         // fire the refresh event (to statistical plugin)
-                                         this.fireEvent("refresh");
-                                        // global event
-                                        myDesktopApp.EventManager.fireEvent("refresh");
-	},
-
-	/**
-	 * set params description into this.object
-	 */
-	setParamInfo : function(parameters) {
-		var params = [];
-		Ext.Array.each(parameters, function(item, index) {
-			params[index] = item;
-		}, this);
-
-		this.object.set('parameters', params);
-		this.object.set('nbParameters', params.length);
-	},
-
-	/**
-	 * update this.object from form
-	 */
-	updateObject : function(){
-	// get the basic form
-		var basicForm = this.formPanel.getForm();
-		var updateStatus = true;
-
-		var fieldsWithoutName = basicForm.getFields().items;
-		Ext.Array.each(fieldsWithoutName, function(item, index,allItems){
-			if(item !== this.fieldName) {
-				if (!item.isValid()) {
-					// set update isn't allowed
-					updateStatus = false;
-				}
-			}
-		}, this);
-			// if the update is allowed
-		if (updateStatus) {
-		/// real object update
-		// update TimeTable object with the content of form
-			basicForm.updateRecord(this.object);
-		}
-		// return the update status
-		return updateStatus;
-	},
-
-	addInterval : function(start, stop) {
-		var row = this.TTGrid.getStore().getTotalCount();
-		var me = this;
-		this.TTGrid.getSelectionModel().deselectAll();
-                AmdaAction.addCacheInterval({'start' : start, 'stop' : stop, 'index' : row, 'isCatalog' : true},function (result, e) {
-			this.status = result.status;
-			if (!this.TTGrid.getStore().loading) {
-			this.TTGrid.getStore().reload({
-				callback : function(records, options, success) {
-					me.TTGrid.getView().bufferedRenderer.scrollTo(row, false, function() {
-						me.TTGrid.getView().select(row);
-					}, me);
-				}
-			});
+    extend: 'Ext.container.Container',
+    alias: 'widget.panelCatalog',
+
+    requires: [
+        'Ext.ux.grid.menu.RangeMenu',
+        'Ext.ux.grid.FiltersFeature',
+        'Ext.ux.grid.filter.DateFilter',
+        'Ext.ux.grid.filter.NumericFilter',
+        'Ext.ux.grid.filter.StringFilter',
+        'Ext.grid.plugin.BufferedRenderer',
+        'amdaUI.StatisticalPlug'
+    ],
+
+    isCatalog: true,
+    statics: {
+        COL_TO_HIDE_DURATION: 'colToHideDuration'
+    },
+
+    constructor: function (config) {
+        this.init(config);
+        this.callParent(arguments);
+        this.toReconfigure = true;
+
+        if (this.object) {
+            this.loadObject();
+        }
+    },
+
+    setObject: function (object, toReconfigure) {
+        if (toReconfigure)
+            this.toReconfigure = true;
+        // set object
+        this.object = object;
+        // load object into view
+        this.loadObject();
+        // show the default duration column
+        this.TTGrid.headerCt.getGridColumns();
+
+        Ext.Array.each(this.TTGrid.headerCt.getGridColumns(), function (item, index, all) {
+            // if item is the default duration column
+            if (item.id == amdaUI.CatalogUI.COL_TO_HIDE_DURATION + '2') {
+                // show this column
+                item.show();
+            }
+        });
+        // fire the refresh event (to statistical plugin)
+        this.fireEvent("refresh");
+        // global event
+        myDesktopApp.EventManager.fireEvent("refresh");
+    },
+
+    /**
+     * set params description into this.object
+     */
+    setParamInfo: function (parameters) {
+        var params = [];
+        Ext.Array.each(parameters, function (item, index) {
+            params[index] = item;
+        }, this);
+
+        this.object.set('parameters', params);
+        this.object.set('nbParameters', params.length);
+    },
+
+    /**
+     * update this.object from form
+     */
+    updateObject: function () {
+        // get the basic form
+        var basicForm = this.formPanel.getForm();
+        var updateStatus = true;
+
+        var fieldsWithoutName = basicForm.getFields().items;
+        Ext.Array.each(fieldsWithoutName, function (item, index, allItems) {
+            if (item !== this.fieldName) {
+                if (!item.isValid()) {
+                    // set update isn't allowed
+                    updateStatus = false;
                 }
-                }, this);
-	},
-
-	updateCount : function() {
-		this.object.set('nbIntervals',this.TTGrid.getStore().getTotalCount());
-		this.formPanel.getForm().findField('nbIntervals').setValue(this.object.get('nbIntervals'));
-	},
-	generateTT : function(){
-                       if(this.fclose()){
-                        Ext.Msg.confirm('Generate TT', 'Current Catalog has been modified.\nDo you want to save it to include these changes in the generated Time Table ?' ,
-                        function (btn, text){
-                         if (btn == 'yes'){
-                          // mark this.closed as true before the call to close() as that will fire the beforeclose event again
-                          if(this.object.get('id') ==""){
-                              // case of creation of catalog
-                          this.saveCatalog(true,true);
-                      }else{
-                          // casse existing catalog
-                          this.saveProcess(false,true,true);
-                      }
-                          return;
-                          }
-                           }, this);
-
-            }else{
-                this.createTT(this.object.get('id'));
-                return;
             }
+        }, this);
+        // if the update is allowed
+        if (updateStatus) {
+            /// real object update
+            // update TimeTable object with the content of form
+            basicForm.updateRecord(this.object);
+        }
+        // return the update status
+        return updateStatus;
+    },
+
+    addInterval: function (start, stop) {
+        var row = this.TTGrid.getStore().getTotalCount();
+        var me = this;
+        this.TTGrid.getSelectionModel().deselectAll();
+        AmdaAction.addCacheInterval({'start': start, 'stop': stop, 'index': row, 'isCatalog': true}, function (result, e) {
+            this.status = result.status;
+            if (!this.TTGrid.getStore().loading) {
+                this.TTGrid.getStore().reload({
+                    callback: function (records, options, success) {
+                        me.TTGrid.getView().bufferedRenderer.scrollTo(row, false, function () {
+                            me.TTGrid.getView().select(row);
+                        }, me);
+                    }
+                });
+            }
+        }, this);
+    },
+
+    updateCount: function () {
+        this.object.set('nbIntervals', this.TTGrid.getStore().getTotalCount());
+        this.formPanel.getForm().findField('nbIntervals').setValue(this.object.get('nbIntervals'));
+    },
+    generateTT: function () {
+        if (this.fclose()) {
+            Ext.Msg.confirm('Generate TT', 'Current Catalog has been modified.\nDo you want to save it to include these changes in the generated Time Table ?',
+                    function (btn, text) {
+                        if (btn == 'yes') {
+                            // mark this.closed as true before the call to close() as that will fire the beforeclose event again
+                            if (this.object.get('id') == "") {
+                                // case of creation of catalog
+                                this.saveCatalog(true, true);
+                            } else {
+                                // casse existing catalog
+                                this.saveProcess(false, true, true);
+                            }
+                            return;
+                        }
+                    }, this);
+
+        } else {
+            this.createTT(this.object.get('id'));
+            return;
+        }
+    },
+    createTT: function (catId) {
+        var ttObj = Ext.create('amdaModel.TimeTable');
+        var timeTabNode = Ext.create('amdaModel.TimeTableNode', {leaf: true});
+        ttObj.set('relatedCatalogId', catId)
+        creatDate = new Date(this.object.get('created'));
+        date = Ext.Date.format(creatDate, 'Y-m-d\\TH:i:s');
+        descr = 'Generated by CDPP/Amda Catalog Module \n' + 'From Catalog: ' + this.object.get('name') + '\nOn: ' + date + '\n';
+        ttObj.set('description', descr + this.object.get('description'));
+        timeTabNode.set('object', ttObj);
+        var explorerTree = Ext.getCmp(amdaUI.ExplorerUI.RESRC_TAB.TREE_ID);
+        var ttRootNode = explorerTree.getRootNode().findChild('id', 'timeTable-treeRootNode', true);
+        amdaModel.InteractiveNode.preloadNodes(ttRootNode.getRootNode(),
+                function ()
+                {
+                    // edit newNode into Parameter Module with node as contextNode
+                    timeTabNode.editInModule();
+                });
+    },
+    onAfterInit: function (result, e)
+    {
+        var me = this;
+        if (!result) {
+            myDesktopApp.errorMsg(e.message);
+            Ext.defer(function () {
+                Ext.Msg.toFront()
+            }, 10);
+
+            return;
+        } else if (!result.success)
+        {
+            if (result.message)
+                myDesktopApp.errorMsg(result.message);
+            else
+                myDesktopApp.errorMsg('Unknown error during catalog cache initialisation');
+
+            Ext.defer(function () {
+                Ext.Msg.toFront()
+            }, 10);
+            return;
+        }
+
+        if (me.toReconfigure)
+        {
+            // clear filters
+            if (me.TTGrid.filters) {
+                me.TTGrid.getStore().clearFilter(true);
+                me.TTGrid.filters.clearFilters();
+                me.TTGrid.filters.destroy();
+            }
+
+            var fieldsConfig = [
+                {
+                    name: 'start',
+                    type: 'date',
+                    dateFormat: 'Y-m-d\\TH:i:s',
+                    convert: function (value, rec) {
+                        if (!Ext.isDate(value)) {
+                            var valueString = new String(value);
+                            return new Date(valueString.replace(/\-/g, '\/').replace(/[T|Z]/g, ' '));
+                        }
+                        return value;
+                    }
+                },
+                {
+                    name: 'stop',
+                    type: 'date',
+                    dateFormat: 'Y-m-d\\TH:i:s',
+                    convert: function (value, rec) {
+                        if (!Ext.isDate(value)) {
+                            var valueString = new String(value);
+                            return new Date(valueString.replace(/\-/g, '\/').replace(/[T|Z]/g, ' '));
+                        }
+                        return value;
+                    }
+                },
+                {
+                    name: 'durationHour',
+                    type: 'float',
+                    convert: function (value, rec) {
+                        if (rec.get('stop') && rec.get('start') && (rec.get('stop') - rec.get('start')) >= 0) {
+                            return (rec.get('stop') - rec.get('start')) / 3600000.0;
+                        }
                     },
-                    createTT : function(catId){
-                             var ttObj = Ext.create('amdaModel.TimeTable');
-                              var timeTabNode = Ext.create('amdaModel.TimeTableNode',{leaf : true});
-                              ttObj.set('relatedCatalogId', catId)
-                              creatDate=new Date(this.object.get('created'));
-                              date=Ext.Date.format(creatDate,'Y-m-d\\TH:i:s');
-                              descr='Generated by CDPP/Amda Catalog Module \n'+ 'From Catalog: '+this.object.get('name')+'\nOn: '+date+'\n';
-                              ttObj.set('description', descr+this.object.get('description'));
-                              timeTabNode.set('object',ttObj);
-                              var explorerTree = Ext.getCmp(amdaUI.ExplorerUI.RESRC_TAB.TREE_ID);
-                                        var ttRootNode = explorerTree.getRootNode().findChild('id', 'timeTable-treeRootNode', true);
-                                        amdaModel.InteractiveNode.preloadNodes(ttRootNode.getRootNode(),
-			function()
-			{
-				// edit newNode into Parameter Module with node as contextNode
-				timeTabNode.editInModule();
-			});
+                    persist: false
+                },
+                {
+                    name: 'durationMin',
+                    type: 'float',
+                    convert: function (value, rec) {
+                        if (rec.get('stop') && rec.get('start') && (rec.get('stop') - rec.get('start')) >= 0) {
+                            return (rec.get('stop') - rec.get('start')) / 60000.0;
+                        }
                     },
-	onAfterInit:  function(result, e)
-	{
-		var me = this;
-		if (!result) {
-			myDesktopApp.errorMsg(e.message);
-			Ext.defer(function(){Ext.Msg.toFront()},10);
-
-			return;
-		}
-		else if (!result.success)
-		{
-			if (result.message)
-				myDesktopApp.errorMsg(result.message);
-			else
-				myDesktopApp.errorMsg('Unknown error during catalog cache initialisation');
-
-			Ext.defer(function(){Ext.Msg.toFront()},10);
-			return;
-		}
-
-		if (me.toReconfigure)
-		{
-                                                            // clear filters
-                                                            if (me.TTGrid.filters) {
-                                                              me.TTGrid.getStore().clearFilter(true);
-                                                              me.TTGrid.filters.clearFilters();
-                                                              me.TTGrid.filters.destroy();
-                                                            }
-
-			var fieldsConfig =  [
-				{
-					name : 'start',
-					type : 'date',
-					dateFormat: 'Y-m-d\\TH:i:s',
-					convert: function(value,rec) {
-						if (!Ext.isDate(value)){
-							var valueString = new String(value);
-							return new Date(valueString.replace(/\-/g,'\/').replace(/[T|Z]/g,' '));
-						}
-						return value;
-					}
-				},
-				{
-					name : 'stop',
-					type : 'date',
-					dateFormat: 'Y-m-d\\TH:i:s',
-					convert: function(value,rec) {
-						if (!Ext.isDate(value)){
-							var valueString = new String(value);
-							return new Date(valueString.replace(/\-/g,'\/').replace(/[T|Z]/g,' '));
-						}
-						return value;
-					}
-				},
-				{
-					name:'durationHour',
-					type: 'float',
-					convert: function(value, rec){
-						if (rec.get('stop') && rec.get('start') && (rec.get('stop')-rec.get('start'))>=0) {
-							return (rec.get('stop') - rec.get('start'))/3600000.0;
-						}
-					},
-					persist: false
-				},
-				{
-					name: 'durationMin',
-					type: 'float',
-					convert: function(value, rec){
-						if (rec.get('stop') && rec.get('start') && (rec.get('stop')-rec.get('start'))>=0) {
-							return (rec.get('stop') - rec.get('start'))/60000.0;
-						}
-					},
-					persist: false
-				},
-				{
-					name: 'durationSec',
-					type: 'float',
-					convert: function(value, rec){
-						if (rec.get('stop') && rec.get('start') && (rec.get('stop')-rec.get('start'))>=0) {
-							return (rec.get('stop') - rec.get('start'))/1000.0;
-						}
-					},
-					persist: false
-				},
-				{ name: 'cacheId', type : 'int'},
-				{ name: 'isNew', type : 'boolean', defaultValue: false },
-				{ name: 'isModified', type : 'boolean', defaultValue: false}
-			];
-
-                        var updateDurationColumnsVisibility = function(columns, visibleId) {
-				Ext.Array.each(columns, function(item,index){
-					// if item is a column to hide automatically
-					if ( Ext.util.Format.substr(item.id, 0, amdaUI.CatalogUI.COL_TO_HIDE_DURATION.length) == amdaUI.CatalogUI.COL_TO_HIDE_DURATION ) {
-						// if item isn't the column which is being declared and is not hidden
-						if ( item.id != visibleId && !item.isHidden() ){
-							// hide this column
-							item.hide();
-						}
-					}
-				});
-			};
-
-			var columnsConfig = [
-				{
-					xtype: 'rownumberer',
-					width: 50,
-					renderer: function(value, metaData, record){
-						var msg = record.index + 1;
-						if (record.get('isNew') || record.get('isModified')) {
-							msg += ' *';
-							metaData.style = 'font-weight: bold'
-						}
-						return msg;
-					}
-				},
-				{
-					xtype: 'datecolumn',
-					text: 'Start Time',
-					format: 'Y-m-d\\TH:i:s',
-					sortable : true,
-					dataIndex: 'start',
-					width : 120,
-					menuDisabled: false,
-					editor : {
-						xtype:'datefield',
-						allowBlank:false,
-						hideTrigger: true,
-						format : 'Y-m-d\\TH:i:s'
-					},
-          filter: { type: 'date',  dateFormat: 'Y-m-d' }
-				},
-				{
-					xtype: 'datecolumn',
-					text: 'Stop Time',
-					format: 'Y-m-d\\TH:i:s',
-					sortable : true,
-					dataIndex: 'stop',
-					width : 120,
-					menuDisabled: false,
-					editor : {
-						xtype:'datefield',
-						allowBlank:false,
-						hideTrigger: true,
-						format : 'Y-m-d\\TH:i:s'
-					},
-          filter: { type: 'date',  dateFormat: 'Y-m-d' }
-				},
-				{
-					xtype: 'gridcolumn',
-					text: 'Duration (hour)',
-					sortable : true,
-					dataIndex: 'durationHour',
-					width : 120,
-					menuDisabled: false,
-					hidden:true,
-					id: amdaUI.CatalogUI.COL_TO_HIDE_DURATION+'1',
-					renderer: function(value) {
-						return Ext.util.Format.number(value,'0.00');
-					},
-					listeners: {
-						beforeshow : function(){
-							updateDurationColumnsVisibility(this.ownerCt.getGridColumns(), amdaUI.CatalogUI.COL_TO_HIDE_DURATION+'1');
-						}
-					},
-          filter: { type: 'numeric'}
-				},
-				{
-					xtype: 'gridcolumn',
-					text: 'Duration (Min)',
-					sortable : true,
-					dataIndex: 'durationMin',
-					width : 120,
-					menuDisabled: false,
-					hidden:false,
-					id: amdaUI.CatalogUI.COL_TO_HIDE_DURATION+'2',
-					renderer: function(value) {
-						return Ext.util.Format.number(value,'0.00');
-					},
-					listeners: {
-						beforeshow : function(){
-							updateDurationColumnsVisibility(this.ownerCt.getGridColumns(), amdaUI.CatalogUI.COL_TO_HIDE_DURATION+'2');
-						}
-					},
-          filter: { type: 'numeric'}
-				},
-				{
-					xtype: 'gridcolumn',
-					text: 'Duration (Sec)',
-					sortable : true,
-					dataIndex: 'durationSec',
-					width : 120,
-					menuDisabled: false,
-					hidden:true,
-					id: amdaUI.CatalogUI.COL_TO_HIDE_DURATION+'3',
-					renderer: function(value) {
-						return Ext.util.Format.number(value,'0.00');
-					},
-					listeners: {
-						beforeshow : function(){
-							updateDurationColumnsVisibility(this.ownerCt.getGridColumns(), amdaUI.CatalogUI.COL_TO_HIDE_DURATION+'3');
-						}
-					},
-          filter: { type: 'numeric'}
-				}
-			];
-     var pramColumnWidth =120*(1-0.7*(1-1/result.parameters.length));
-      Ext.Array.each(result.parameters, function(obj, index) {
-				var field = {
-					name: obj.id
-				};
-				var column = {
-					text: obj.name,
-					sortable : true,
-					dataIndex: obj.id,
-					menuDisabled: false
-				};
-				switch (obj.type) {
-          case 0: //double
-            field = Ext.apply({}, field, {
-              type: 'string'
-            });
-            column = Ext.apply({}, column, {
-              xtype: 'gridcolumn',
-              width : pramColumnWidth *  parseInt(obj.size),
-              editor: 'textfield',
-              filter: { type: 'numeric'}
-            });
-            break;
-            case 1: //dateTime
-                    field = Ext.apply({}, field, {
-                            type : 'date',
+                    persist: false
+                },
+                {
+                    name: 'durationSec',
+                    type: 'float',
+                    convert: function (value, rec) {
+                        if (rec.get('stop') && rec.get('start') && (rec.get('stop') - rec.get('start')) >= 0) {
+                            return (rec.get('stop') - rec.get('start')) / 1000.0;
+                        }
+                    },
+                    persist: false
+                },
+                {name: 'cacheId', type: 'int'},
+                {name: 'isNew', type: 'boolean', defaultValue: false},
+                {name: 'isModified', type: 'boolean', defaultValue: false}
+            ];
+
+            var updateDurationColumnsVisibility = function (columns, visibleId) {
+                Ext.Array.each(columns, function (item, index) {
+                    // if item is a column to hide automatically
+                    if (Ext.util.Format.substr(item.id, 0, amdaUI.CatalogUI.COL_TO_HIDE_DURATION.length) == amdaUI.CatalogUI.COL_TO_HIDE_DURATION) {
+                        // if item isn't the column which is being declared and is not hidden
+                        if (item.id != visibleId && !item.isHidden()) {
+                            // hide this column
+                            item.hide();
+                        }
+                    }
+                });
+            };
+
+            var columnsConfig = [
+                {
+                    xtype: 'rownumberer',
+                    width: 50,
+                    renderer: function (value, metaData, record) {
+                        var msg = record.index + 1;
+                        if (record.get('isNew') || record.get('isModified')) {
+                            msg += ' *';
+                            metaData.style = 'font-weight: bold'
+                        }
+                        return msg;
+                    }
+                },
+                {
+                    xtype: 'datecolumn',
+                    text: 'Start Time',
+                    format: 'Y-m-d\\TH:i:s',
+                    sortable: true,
+                    dataIndex: 'start',
+                    width: 120,
+                    menuDisabled: false,
+                    editor: {
+                        xtype: 'datefield',
+                        allowBlank: false,
+                        hideTrigger: true,
+                        format: 'Y-m-d\\TH:i:s'
+                    },
+                    filter: {type: 'date', dateFormat: 'Y-m-d'}
+                },
+                {
+                    xtype: 'datecolumn',
+                    text: 'Stop Time',
+                    format: 'Y-m-d\\TH:i:s',
+                    sortable: true,
+                    dataIndex: 'stop',
+                    width: 120,
+                    menuDisabled: false,
+                    editor: {
+                        xtype: 'datefield',
+                        allowBlank: false,
+                        hideTrigger: true,
+                        format: 'Y-m-d\\TH:i:s'
+                    },
+                    filter: {type: 'date', dateFormat: 'Y-m-d'}
+                },
+                {
+                    xtype: 'gridcolumn',
+                    text: 'Duration (hour)',
+                    sortable: true,
+                    dataIndex: 'durationHour',
+                    width: 120,
+                    menuDisabled: false,
+                    hidden: true,
+                    id: amdaUI.CatalogUI.COL_TO_HIDE_DURATION + '1',
+                    renderer: function (value) {
+                        return Ext.util.Format.number(value, '0.00');
+                    },
+                    listeners: {
+                        beforeshow: function () {
+                            updateDurationColumnsVisibility(this.ownerCt.getGridColumns(), amdaUI.CatalogUI.COL_TO_HIDE_DURATION + '1');
+                        }
+                    },
+                    filter: {type: 'numeric'}
+                },
+                {
+                    xtype: 'gridcolumn',
+                    text: 'Duration (Min)',
+                    sortable: true,
+                    dataIndex: 'durationMin',
+                    width: 120,
+                    menuDisabled: false,
+                    hidden: false,
+                    id: amdaUI.CatalogUI.COL_TO_HIDE_DURATION + '2',
+                    renderer: function (value) {
+                        return Ext.util.Format.number(value, '0.00');
+                    },
+                    listeners: {
+                        beforeshow: function () {
+                            updateDurationColumnsVisibility(this.ownerCt.getGridColumns(), amdaUI.CatalogUI.COL_TO_HIDE_DURATION + '2');
+                        }
+                    },
+                    filter: {type: 'numeric'}
+                },
+                {
+                    xtype: 'gridcolumn',
+                    text: 'Duration (Sec)',
+                    sortable: true,
+                    dataIndex: 'durationSec',
+                    width: 120,
+                    menuDisabled: false,
+                    hidden: true,
+                    id: amdaUI.CatalogUI.COL_TO_HIDE_DURATION + '3',
+                    renderer: function (value) {
+                        return Ext.util.Format.number(value, '0.00');
+                    },
+                    listeners: {
+                        beforeshow: function () {
+                            updateDurationColumnsVisibility(this.ownerCt.getGridColumns(), amdaUI.CatalogUI.COL_TO_HIDE_DURATION + '3');
+                        }
+                    },
+                    filter: {type: 'numeric'}
+                }
+            ];
+            var pramColumnWidth = 120 * (1 - 0.7 * (1 - 1 / result.parameters.length));
+            Ext.Array.each(result.parameters, function (obj, index) {
+                var field = {
+                    name: obj.id
+                };
+                var column = {
+                    text: obj.name,
+                    sortable: true,
+                    dataIndex: obj.id,
+                    menuDisabled: false
+                };
+                switch (obj.type) {
+                    case 0: //double
+                        field = Ext.apply({}, field, {
+                            type: 'string'
+                        });
+                        column = Ext.apply({}, column, {
+                            xtype: 'gridcolumn',
+                            width: pramColumnWidth * parseInt(obj.size),
+                            editor: 'textfield',
+                            filter: {type: 'numeric'}
+                        });
+                        break;
+                    case 1: //dateTime
+                        field = Ext.apply({}, field, {
+                            type: 'date',
                             dateFormat: 'Y-m-d\\TH:i:s',
-                            convert: function(value,rec) {
-                                    if (!Ext.isDate(value)){
-                                            var valueString = new String(value);
-                                            return new Date(valueString.replace(/\-/g,'\/').replace(/[T|Z]/g,' '));
-                                    }
-                                    return value;
+                            convert: function (value, rec) {
+                                if (!Ext.isDate(value)) {
+                                    var valueString = new String(value);
+                                    return new Date(valueString.replace(/\-/g, '\/').replace(/[T|Z]/g, ' '));
+                                }
+                                return value;
                             }
 
-                    });
-                    column = Ext.apply({}, column, {
+                        });
+                        column = Ext.apply({}, column, {
                             xtype: 'datecolumn',
-                            width : 120,
-                            editor : {
-                                    xtype:'datefield',
-                                    allowBlank:false,
-                                    hideTrigger: true,
-                                    format : 'Y-m-d\\TH:i:s'
+                            width: 120,
+                            editor: {
+                                xtype: 'datefield',
+                                allowBlank: false,
+                                hideTrigger: true,
+                                format: 'Y-m-d\\TH:i:s'
                             },
-                    filter: { type: 'date',  dateFormat: 'Y-m-d' }
-                    });
-                    break;
-          case 2: //string
-            field = Ext.apply({}, field, {
-              type: 'string'
-            });
-            column = Ext.apply({}, column, {
-              xtype: 'gridcolumn',
-              width : pramColumnWidth *  parseInt(obj.size),
-              editor: 'textfield',
-              filter: { type: 'string'}
-          });
-            break;
-          case 3: //int
-            field = Ext.apply({}, field, {
-              type: 'string'
+                            filter: {type: 'date', dateFormat: 'Y-m-d'}
+                        });
+                        break;
+                    case 2: //string
+                        field = Ext.apply({}, field, {
+                            type: 'string'
+                        });
+                        column = Ext.apply({}, column, {
+                            xtype: 'gridcolumn',
+                            width: pramColumnWidth * parseInt(obj.size),
+                            editor: 'textfield',
+                            filter: {type: 'string'}
+                        });
+                        break;
+                    case 3: //int
+                        field = Ext.apply({}, field, {
+                            type: 'string'
+                        });
+                        column = Ext.apply({}, column, {
+                            xtype: 'gridcolumn',
+                            width: pramColumnWidth * parseInt(obj.size),
+                            editor: 'textfield',
+                            filter: {type: 'numeric'}
+                        });
+                        break;
+                    default:
+                        field = Ext.apply({}, field, {
+                            type: 'string'
+                        });
+                        column = Ext.apply({}, column, {
+                            xtype: 'gridcolumn',
+                            width: pramColumnWidth * parseInt(obj.size),
+                            editor: 'textfield',
+                            filter: {type: 'string'}
+                        });
+                }
+                fieldsConfig.push(field);
+                columnsConfig.push(column);
             });
-            column = Ext.apply({}, column, {
-              xtype: 'gridcolumn',
-              width : pramColumnWidth *  parseInt(obj.size),
-              editor: 'textfield',
-              filter: { type: 'numeric'}
+
+            var store = Ext.create('Ext.data.Store', {
+                fields: fieldsConfig,
+                autoDestroy: false,
+                pageSize: 200,
+                buffered: true,
+                purgePageCount: 0,
+                remoteSort: true,
+                proxy: {
+                    type: 'direct',
+                    api: {read: AmdaAction.readCacheIntervals},
+                    // remplir automatiquement tt, sharedtt , catalog, shared catalog
+                    extraParams: {'typeTT': 'catalog'},
+                    reader:
+                            {
+                                type: 'json',
+                                root: 'intervals',
+                                totalProperty: 'totalCount'
+                            }
+                },
+                listeners: {
+                    scope: me,
+                    load: function (store, records) {
+                        // myDesktopApp.EventManager.fireEvent('refresh');
+                        me.TTGrid.getView().refresh();
+                        me.TTGrid.getSelectionModel().refresh();
+                        me.updateCount();
+                        //Statistical plugin
+                        this.fireEvent("refresh");
+                    }
+                }
             });
-            break;
-        default:
-                field = Ext.apply({}, field, {
-                        type: 'string'
-                });
-                column = Ext.apply({}, column, {
-                        xtype: 'gridcolumn',
-                        width : pramColumnWidth *  parseInt(obj.size),
-                        editor: 'textfield',
-filter: { type: 'string'}
+
+            me.TTGrid.reconfigure(store, columnsConfig);
+            if (me.TTGrid.filters) {
+                me.TTGrid.filters.bindStore(store);
+            }
+        }
+        me.TTGrid.getSelectionModel().deselectAll();
+        //
+        //         	// clear filters
+        //         	me.TTGrid.getStore().clearFilter(true);
+        //
+        // clear sort
+        me.TTGrid.getStore().sorters.clear();
+        //me.TTGrid.getStore().sorters = new Ext.util.MixedCollection();
+
+        //set cache token to the Catalog object
+        me.object.set('cacheToken', result.token);
+        me.setParamInfo(result.parameters);
+        me.TTGrid.getStore().load();
+
+        me.status = result.status;
+        //Statistical plugin
+        me.fireEvent("refresh");
+    },
+
+    /**
+     * load object catalog into this view
+     */
+    loadObject: function () {
+        // load object into form
+        this.formPanel.getForm().loadRecord(this.object);
+
+        this.status = null;
+
+        if (this.object.get('fromPlugin') && (this.object.get('objName') != '')) {
+            if (this.object.get('objFormat') && this.object.get('objFormat') != '') {
+                //From uploaded file
+                AmdaAction.initObjectCacheFromUploadedFile(this.object.get('objName'), this.object.get('objFormat'), this.isCatalog, this.onAfterInit, this);
+            } else {
+                //From tmp object (ie Statistics result)
+                AmdaAction.initObjectCacheFromTmpObject(this.object.get('folderId'), this.object.get('objName'), this.isCatalog, this.onAfterInit, this);
+            }
+        } else {
+            var typeTT = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.catalog.id).linkedNode.data.nodeType;
+
+            if (this.object.get('id') == '' && this.object.get('relatedTimeTableId') == '') {
+                // creating new catalog
+                AmdaAction.initObjectCache(this.isCatalog, this.object.get('nbParameters'), this.onAfterInit, this);
+            } else if (this.object.get('relatedTimeTableId') != '') {
+                // Generate Catalog from Time Table
+                AmdaAction.initObjectCacheFromTimeTable(this.object.get('relatedTimeTableId'), typeTT, this.object.get('nbParameters'), this.onAfterInit, this);
+            } else {
+                //From existing TT file
+                AmdaAction.initObjectCacheFromObject(this.object.get('id'), typeTT, this.onAfterInit, this);
+            }
+        }
+        //Statistical plugin
+        this.fireEvent("refresh");
+    },
+
+    checkIntervalsStatusForSave: function (onStatusOk) {
+        onStatusOk();
+    },
+
+    /*
+     * save method called by Save button
+     */
+    saveProcess: function (toRename, onAfterSave, notDisplayMsg)
+    {
+        var module = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.catalog.id);
+        //  store / columns are the same - not needed to reconfigure grid
+        this.toReconfigure = false;
+
+        // if save shared catalog
+        if (module.contextNode && (module.contextNode.get('id') == 'sharedcatalog-treeRootNode'))
+        {
+            module.linkedNode = null;
+            module.createLinkedNode();
+            module.createObject(this.object.getJsonValues());
+            var obj = module.linkedNode.get('object');
+            // synchronisation of objects
+            this.object = obj;
+            module.linkedNode.create({notDisplayMsg: notDisplayMsg, callback: function () {
+                    if (onAfterSave)
+                        this.createTT(this.object.get('id'));
+                }, scope: this});
+        }
+        // if the name has been modified this is a creation
+        else if (this.fclose()) {
+            if (this.object.isModified('name') || this.object.get('fromPlugin')) {
+                // if object already has an id : it's a 'rename' of an existing
+                if (this.object.get('id')) {
+                    // the context Node is the parent node of current edited one
+                    var contextNode = module.linkedNode.parentNode;
+                    // link a new node to the TimeTableModule
+                    module.createLinkedNode();
+                    // set the contextNode
+                    module.linkedNode.set('contextNode', contextNode);
+                    // create a new object linked
+                    module.createObject(this.object.getJsonValues());
+
+                    var obj = module.linkedNode.get('object');
+                    // synchronisation of objects
+                    this.object = obj;
+                    if (toRename)
+                        module.linkedNode.toRename = true;
+                }
+                module.linkedNode.create({callback: function () {
+                        module.linkedNode.update({notDisplayMsg: notDisplayMsg, callback: function () {
+                                if (onAfterSave)
+                                    this.createTT(this.object.get('id'));
+                            }, scope: this}, "", notDisplayMsg);
+                    }, scope: this});
+            } else {
+                //update
+                module.linkedNode.update({notDisplayMsg: notDisplayMsg, callback: function () {
+                        if (onAfterSave)
+                            this.createTT(this.object.get('id'));
+                    }, scope: this});
+            }
+        }
+    },
+    saveCatalog: function (onAfterSave, notDisplayMsg) {
+        if (this.updateObject())
+        {
+            var basicForm = this.formPanel.getForm();
+            // if there's at least one record in the store of TTGrid
+            if (this.TTGrid.getStore().getTotalCount() > 0)
+            {
+                // update TimeTable object which the content of form
+                basicForm.updateRecord(this.object);
+
+                var me = this;
+                this.checkIntervalsStatusForSave(function () {
+                    //Name validation
+                    var module = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.catalog.id);
+
+                    if (!module)
+                        return;
+                    module.linkedNode.isValidName(me.fieldName.getValue(), function (res)
+                    {
+                        if (!res) {
+                            me.fieldName.validFlag = 'Error during object validation';
+                            myDesktopApp.errorMsg(me.fieldName.validFlag);
+                            me.fieldName.validate();
+                            return;
+                        }
+
+                        if (!res.valid) {
+                            if (res.error) {
+                                if (res.error.search('subtree') != -1) {
+                                    Ext.MessageBox.show({title: 'Warning',
+                                        msg: res.error + '<br/>Do you want to overwrite it?',
+                                        width: 300,
+                                        buttons: Ext.MessageBox.OKCANCEL,
+                                        fn: me.overwriteProcess,
+                                        icon: Ext.MessageBox.WARNING,
+                                        scope: me
+                                    });
+                                    me.fieldName.validFlag = true;
+                                } else
+                                    me.fieldName.validFlag = res.error;
+                            } else {
+                                me.fieldName.validFlag = 'Invalid object name';
+                                myDesktopApp.errorMsg(me.fieldName.validFlag);
+                            }
+                            me.fieldName.validate();
+                            return;
+                        }
+
+                        me.fieldName.validFlag = true;
+                        me.fieldName.validate();
+                        me.saveProcess(false, onAfterSave, notDisplayMsg);
+                    });
                 });
-}
-fieldsConfig.push(field);
-columnsConfig.push(column);
-});
+            } else {
+                Ext.Msg.alert('No intervals', 'Your catalog is invalid, <br>you must have at least one interval');
+            }
+        }
+    },
+
+    /**
+     * overwrite metod called by Save button
+     */
+    overwriteProcess: function (btn) {
+        if (btn == 'cancel')
+            return;
+
+        this.fieldName.clearInvalid();
+        this.saveProcess(true);
+    },
+
+    /**
+     * Check if changes were made before closing window
+     * @return true if changes
+     */
+    fclose: function () {
+        if (this.status == null)
+            return false;
+
+        var isDirty = this.formPanel.getForm().isDirty() || (this.status.isModified) || (this.status.nbModified > 0) || (this.status.nbNew > 0);
+        return isDirty;
+    },
+
+    init: function (config)
+    {
+        this.object = config.object;
+
+        this.fieldName = new Ext.form.field.Text({
+            fieldLabel: 'Name',
+            allowBlank: false,
+            stripCharsRe: /(^\s+|\s+$)/g,
+            emptyText: 'Please no spaces!',
+            name: 'name',
+            validateOnChange: false,
+            validateOnBlur: false,
+            validFlag: false,
+            validator: function () {
+                return this.validFlag;
+            }
+        });
 
-			var store = Ext.create('Ext.data.Store', {
-				fields: fieldsConfig,
-				autoDestroy: false,
-				pageSize : 200,
-				buffered : true,
-				purgePageCount: 0,
-				remoteSort: true,
-				proxy: {
-					type: 'direct',
-					api : { read   :  AmdaAction.readCacheIntervals },
-					// remplir automatiquement tt, sharedtt , catalog, shared catalog
-					extraParams : {'typeTT' : 'catalog'},
-					reader:
-					{
-						type: 'json',
-						root: 'intervals',
-						totalProperty : 'totalCount'
-					}
-				},
-				listeners: {
-					scope : me,
-					load: function(store,records) {
-						// myDesktopApp.EventManager.fireEvent('refresh');
-							me.TTGrid.getView().refresh();
-							me.TTGrid.getSelectionModel().refresh();
-							me.updateCount();
-						                   //Statistical plugin
-						 	this.fireEvent("refresh");
-					}
-				}
-			});
-
-			me.TTGrid.reconfigure(store, columnsConfig);
-      if (me.TTGrid.filters) {
-        me.TTGrid.filters.bindStore(store);
-      }
-		}
-		me.TTGrid.getSelectionModel().deselectAll();
-	//
-	//         	// clear filters
-	//         	me.TTGrid.getStore().clearFilter(true);
-	//
-		// clear sort
-		me.TTGrid.getStore().sorters.clear();
-		 //me.TTGrid.getStore().sorters = new Ext.util.MixedCollection();
-
-		//set cache token to the Catalog object
-		me.object.set('cacheToken', result.token);
-		me.setParamInfo(result.parameters);
-		me.TTGrid.getStore().load();
-
-		me.status = result.status;
-                                        //Statistical plugin
-                                        me.fireEvent("refresh");
-	},
-
-	/**
-	 * load object catalog into this view
-	 */
-	loadObject : function(){
-		// load object into form
-		this.formPanel.getForm().loadRecord(this.object);
-
-		this.status = null;
-
-		if (this.object.get('fromPlugin') && (this.object.get('objName') != '')){
-			if (this.object.get('objFormat') && this.object.get('objFormat') != ''){
-				//From uploaded file
-				AmdaAction.initObjectCacheFromUploadedFile(this.object.get('objName'), this.object.get('objFormat'), this.isCatalog, this.onAfterInit, this);
-			}
-			else {
-				//From tmp object (ie Statistics result)
-				AmdaAction.initObjectCacheFromTmpObject(this.object.get('folderId'), this.object.get('objName'), this.isCatalog, this.onAfterInit, this);
-			}
-		}
-		else {
-			var typeTT = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.catalog.id).linkedNode.data.nodeType;
-
-			if (this.object.get('id') == '' && this.object.get('relatedTimeTableId') == '') {
-                                                                                // creating new catalog
-				AmdaAction.initObjectCache(this.isCatalog, this.object.get('nbParameters'), this.onAfterInit,this);
-			}
-                                                            else if(this.object.get('relatedTimeTableId') != ''){
-                                                                // Generate Catalog from Time Table
-                                                                AmdaAction.initObjectCacheFromTimeTable(this.object.get('relatedTimeTableId'), typeTT, this.object.get('nbParameters'),this.onAfterInit, this);
-                                                            }
-			else {
-				//From existing TT file
-				AmdaAction.initObjectCacheFromObject(this.object.get('id'), typeTT, this.onAfterInit, this);
-			}
-		}
-                    //Statistical plugin
-        	this.fireEvent("refresh");
-	},
-
-	checkIntervalsStatusForSave : function(onStatusOk) {
-		onStatusOk();
-	},
-
-	/*
-	 * save method called by Save button
-	 */
-	saveProcess : function(toRename, onAfterSave, notDisplayMsg)
-	{
-		var module = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.catalog.id);
-		//  store / columns are the same - not needed to reconfigure grid
-		this.toReconfigure = false;
-
-		// if save shared catalog
-		if (module.contextNode &&  (module.contextNode.get('id') == 'sharedcatalog-treeRootNode'))
-		{
-			module.linkedNode = null;
-			module.createLinkedNode();
-			module.createObject(this.object.getJsonValues());
-			var obj = module.linkedNode.get('object');
-			// synchronisation of objects
-			this.object = obj;
-			module.linkedNode.create({notDisplayMsg:notDisplayMsg, callback : function() {if (onAfterSave) this.createTT(this.object.get('id'));}, scope : this});
-		}
-		// if the name has been modified this is a creation
-		else if (this.fclose()) {
-			if (this.object.isModified('name') || this.object.get('fromPlugin')) {
-				// if object already has an id : it's a 'rename' of an existing
-				if (this.object.get('id')){
-					// the context Node is the parent node of current edited one
-					var contextNode = module.linkedNode.parentNode;
-					// link a new node to the TimeTableModule
-					module.createLinkedNode();
-					// set the contextNode
-					module.linkedNode.set('contextNode',contextNode);
-					// create a new object linked
-					module.createObject(this.object.getJsonValues());
-
-					var obj = module.linkedNode.get('object');
-					// synchronisation of objects
-					this.object = obj;
-					if (toRename) module.linkedNode.toRename = true;
-				}
-				module.linkedNode.create({callback : function() {module.linkedNode.update({notDisplayMsg:notDisplayMsg, callback : function() {if (onAfterSave) this.createTT(this.object.get('id'));}, scope : this},"",notDisplayMsg);}, scope : this});
-			} else {
-				//update
-				module.linkedNode.update({notDisplayMsg:notDisplayMsg,callback : function() {if (onAfterSave) this.createTT(this.object.get('id'));}, scope : this});
-			}
-		}
-	},
-        saveCatalog : function (onAfterSave,notDisplayMsg){
-            if (this.updateObject())
-                {
-                        var basicForm = this.formPanel.getForm();
-                        // if there's at least one record in the store of TTGrid
-                        if (this.TTGrid.getStore().getTotalCount() > 0)
-                        {
-                                // update TimeTable object which the content of form
-                                basicForm.updateRecord(this.object);
+        var cellEditing = Ext.create('Ext.grid.plugin.CellEditing', {
+//			clicksToEdit: 2,
+            onEditComplete: function (ed, value, startValue) {
+                var me = this,
+                        activeColumn = me.getActiveColumn(),
+                        context = me.context,
+                        record;
+
+                if (activeColumn) {
+                    record = context.record;
+
+                    me.setActiveEditor(null);
+                    me.setActiveColumn(null);
+                    me.setActiveRecord(null);
+
+                    context.value = value;
+                    if (!me.validateEdit()) {
+                        me.editing = false;
+                        return;
+                    }
+
+                    // Only update the record if the new value is different than the
+                    // startValue. When the view refreshes its el will gain focus
+                    if (!record.isEqual(value, startValue)) {
+                        var obj = {
+                            'cacheId': record.get('cacheId'),
+                            'isCatalog': true,
+                            'data': {}
+                        };
+                        obj['data'][activeColumn.dataIndex] = value;
+
+                        //Interval is modified on the server side
+                        me.editing = true;
+
+                        AmdaAction.modifyCacheInterval(obj, function (result, e) {
+                            var module = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.catalog.id);
+                            if (module)
+                                module.getUiContent().status = result.status;
+                            if (!context.store.loading) {
+                                context.grid.getSelectionModel().deselectAll();
+                                context.store.reload({
+                                    callback: function (records, options, success) {
+                                        context.view.bufferedRenderer.scrollTo(context.rowIdx, true, function () {
+                                            me.fireEvent('edit', me, context);
+                                            me.editing = false;
+                                        }, me);
+                                    }
+                                });
+                            } else {
+                                me.editing = false;
+                            }
+                        }, this);
+                    } else
+                        me.editing = false;
+                }
+            }
+        });
+
+        var filters = {
+            ftype: 'filters',
+            encode: true, // json encode the filter query
+            local: false,
+            filters: [
+
+            ]
+        };
+
+        this.TTGrid = Ext.create('Ext.grid.Panel', {
+            height: 530,
+            features: [filters],
+            columns: [],
+            frame: true,
+            columnLines: true,
+            selModel: {pruneRemoved: false},
+            //	selType: 'cellmodel',
+            plugins: [cellEditing, {ptype: 'bufferedrenderer'}],
+            dockedItems: [{
+                    xtype: 'toolbar',
+                    items: [{
+                            iconCls: 'icon-add',
+                            scope: this,
+                            handler: function () {
+                                cellEditing.cancelEdit();
+                                var store = this.TTGrid.getStore();
+
+                                var selection = this.TTGrid.getView().getSelectionModel().getSelection()[0];
+                                var row = 0;
+                                if (selection)
+                                    row = store.indexOf(selection) + 1;
+                                this.TTGrid.getSelectionModel().deselectAll();
 
                                 var me = this;
-                                this.checkIntervalsStatusForSave(function () {
-                                        //Name validation
+                                AmdaAction.addCacheInterval({'index': row, 'isCatalog': true}, function (result, e) {
+                                    this.status = result.status;
+                                    if (!this.TTGrid.getStore().loading) {
+                                        this.TTGrid.getStore().reload({
+                                            callback: function (records, options, success) {
+                                                me.TTGrid.getView().bufferedRenderer.scrollTo(row, false, function () {
+                                                    me.TTGrid.getView().select(row);
+                                                    cellEditing.startEditByPosition({row: row, column: 1});
+                                                }, me);
+                                            }
+                                        });
+                                    }
+                                }, this);
+                            }
+                        }, {
+                            iconCls: 'icon-delete',
+                            disabled: true,
+                            itemId: 'delete',
+                            scope: this,
+                            handler: function () {
+                                var selection = this.TTGrid.getView().getSelectionModel().getSelection()[0];
+                                if (selection)
+                                {
+                                    var rowId = selection.get('cacheId');
+                                    this.TTGrid.getSelectionModel().deselectAll();
+                                    AmdaAction.removeTTCacheIntervalFromId(rowId, this.isCatalog, function (result, e) {
+                                        this.status = result.status;
+                                        if (!this.TTGrid.getStore().loading) {
+                                            this.TTGrid.getStore().reload();
+                                        }
+                                    }, this);
+                                }
+                            }
+                        }, '->',
+                        {
+                            text: 'Clear Filters',
+                            scope: this,
+                            handler: function () {
+                                this.TTGrid.getStore().clearFilter(true);
+                                this.TTGrid.filters.clearFilters();
+                            }
+                        }]
+                }]
+        });
+
+        this.formPanel = Ext.create('Ext.form.Panel', {
+            region: 'center',
+            layout: 'hbox',
+            model: 'amdaModel.Catalog',
+            trackResetOnLoad: true, // reset to the last loaded record
+            bodyStyle: {background: '#dfe8f6'},
+            defaults: {border: false, align: 'stretch', bodyStyle: {background: '#dfe8f6'}, padding: '3'},
+            fieldDefaults: {labelWidth: 80, labelAlign: 'top'},
+            items: [{
+                    xtype: 'form',
+                    flex: 1,
+                    buttonAlign: 'left',
+                    // title : 'Information',
+                    layout: {type: 'vbox', pack: 'start', align: 'stretch'},
+                    items: [
+                        this.fieldName,
+                        {
+                            xtype: 'fieldcontainer',
+                            layout: 'hbox',
+                            items: [{
+                                    xtype: 'datefield', fieldLabel: 'Creation date',
+                                    name: 'created', disabled: true,
+                                    hideTrigger: true, format: 'Y/m/d H:i:s'
+                                },
+                                {xtype: 'splitter'},
+                                {xtype: 'textfield', fieldLabel: 'Intervals', name: 'nbIntervals', disabled: true}
+                            ]
+                        },
+                        {
+                            xtype: 'textarea',
+                            name: 'description',
+                            fieldLabel: 'Description',
+                            height: 200
+                        },
+                        {
+                            xtype: 'component',
+                            height: 90
+                        }],
+                    dockedItems: [
+                        {
+                            xtype: 'toolbar',
+                            dock: 'bottom',
+                            ui: 'footer',
+                            height: 140,
+                        
+                            items: [
+                                {
+                                    type: 'button',
+                                    text: 'Save',
+                                    width: 50,
+                                    scope: this,
+                                    handler: function ()
+                                    {
+                                        this.saveCatalog();
+                                    }
+                                }, {
+                                    type: 'button',
+                                    text: 'Reset',
+                                    width: 50,
+                                    scope: this,
+                                    handler: function () {
+                                        var module = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.catalog.id);
+                                        // 								module.createLinkedNode();
+                                        // 								module.createObject();
+                                        this.setObject(module.getLinkedNode().get('object'), true);
+                                    }
+                                },
+                                {
+                                    type: 'button',
+                                    text: 'Create New Catalog',
+                                    width: 120,
+                                    scope: this,
+                                    handler: function ()
+                                    {
                                         var module = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.catalog.id);
 
-                                        if (!module) return;
-                                        module.linkedNode.isValidName(me.fieldName.getValue(), function (res)
-                                        {
-                                                if (!res) {
-                                                        me.fieldName.validFlag = 'Error during object validation';
-                                                        myDesktopApp.errorMsg(me.fieldName.validFlag);
-                                                        me.fieldName.validate();
-                                                        return;
-                                                }
+                                        if (!module)
+                                            return;
+
+                                        module.createLinkedNode();
+                                        module.createObject();
+
+                                        var obj = module.linkedNode.get('object');
+
+                                        var me = this;
 
-                                                if (!res.valid) {
-                                                        if (res.error) {
-                                                                if (res.error.search('subtree') != -1) {
-                                                                        Ext.MessageBox.show({title:'Warning',
-                                                                                msg: res.error+'<br/>Do you want to overwrite it?',
-                                                                                width: 300,
-                                                                                buttons: Ext.MessageBox.OKCANCEL,
-                                                                                fn : me.overwriteProcess,
-                                                                                icon: Ext.MessageBox.WARNING,
-                                                                                scope : me
-                                                                        });
-                                                                        me.fieldName.validFlag = true;
-                                                                }
-                                                                else
-                                                                        me.fieldName.validFlag = res.error;
-                                                        }
-                                                        else {
-                                                                me.fieldName.validFlag = 'Invalid object name';
-                                                                myDesktopApp.errorMsg(me.fieldName.validFlag);
-                                                        }
-                                                        me.fieldName.validate();
-                                                        return;
+                                        Ext.Msg.prompt('Create catalog', 'Enter the number of columns:', function (btn, text) {
+                                            if (btn == 'ok') {
+                                                module.createLinkedNode();
+                                                module.createObject();
+                                                var obj = module.linkedNode.get('object');
+
+                                                var nbParam = parseInt(text);
+                                                if ((nbParam <= 0) || (nbParam > 100)) {
+                                                    nbParam = 1;
                                                 }
 
-                                                me.fieldName.validFlag = true;
-                                                me.fieldName.validate();
-                                                me.saveProcess(false, onAfterSave,notDisplayMsg);
+                                                obj.set('nbParameters', nbParam);
+                                                me.setObject(obj, true);
+                                            }
+                                        }, this);
+
+                                    }
+                                }]
+                        },
+
+
+                        //statistical info
+                        {
+                            xtype: 'toolbar',
+                            dock: 'bottom',
+                            ui: 'footer',
+                            items: [{
+                                    xtype: 'button',
+                                    text: 'Statistical info',
+                                    scope: this,
+                                    //dock: 'bottom',
+                                    //ui: 'footer',
+                                    handler: function () {
+                                        this.fireEvent('info', 'catalogUI');
+                                    }
+                                },
+                                {
+                                    type: 'button',
+                                    text: 'Visualize',
+                                    scope: this,
+                                    handler: function () {
+                                        var me = this;
+                                        myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.visu.id, true, function (module) {
+                                            //temporary linked node - as  Visu module is 'pseudo' interactive - no 'save', no 'execute'
+                                            var temporaryNode = Ext.create('amdaModel.CatalogNode', {leaf: true});
+                                            if (temporaryNode)
+                                                temporaryNode.set('object', me.object);
+                                            module.setLinkedNode(temporaryNode);
+
+                                            module.createWindow();
                                         });
-                                });
-                        }
-                        else {
-                                Ext.Msg.alert('No intervals', 'Your catalog is invalid, <br>you must have at least one interval');
-                        }
+                                    }
+                                }
+                            ]
+                        },
+                        {
+                            xtype: 'toolbar',
+                            dock: 'bottom',
+                            ui: 'footer',
+                            items: [{
+                                    xtype: 'button',
+                                    text: 'Generate Time Table',
+                                    scope: this,
+                                    //dock: 'bottom',
+                                    //ui: 'footer',
+                                    handler: function () {
+                                        this.generateTT(this.object.get('id'));
+                                    }
+                                }]},
+                    ],
+
+                },
+                {
+                    xtype: 'form',
+                    bodyStyle: {background: '#dfe8f6'},
+                    //padding: '3',
+                    flex: 2,
+                    items: [this.TTGrid]
+                }]
+        });
+
+        this.TTGrid.getSelectionModel().on('selectionchange', function (selModel, selections) {
+            this.TTGrid.down('#delete').setDisabled(selections.length === 0);
+        }, this);
+
+        var myConf = {
+            layout: 'border',
+            items: [
+                this.formPanel,
+                {
+                    xtype: 'panel',
+                    region: 'south',
+                    title: 'Information',
+                    collapsible: true,
+                    collapseMode: 'header',
+                    height: 100,
+                    autoHide: false,
+                    bodyStyle: 'padding:5px',
+                    iconCls: 'icon-information',
+                    loader:
+                            {
+                                autoLoad: true,
+                                url: helpDir + 'catalogHOWTO'
+                            }
                 }
-        },
-
-	/**
-	 * overwrite metod called by Save button
-	 */
-	overwriteProcess : function(btn) {
-		if (btn == 'cancel') return;
-
-		this.fieldName.clearInvalid();
-		this.saveProcess(true);
-	},
-
-	/**
-	 * Check if changes were made before closing window
-	 * @return true if changes
-	 */
-	fclose : function() {
-		if (this.status == null)
-			return false;
-
-		var isDirty = this.formPanel.getForm().isDirty() || (this.status.isModified) || (this.status.nbModified > 0) || (this.status.nbNew > 0);
-		return isDirty;
-	},
-
-	init : function (config)
-	{
-		this.object =   config.object;
-
-		this.fieldName = new Ext.form.field.Text({
-			fieldLabel: 'Name',
-			allowBlank : false,
-			stripCharsRe: /(^\s+|\s+$)/g,
-			emptyText: 'Please no spaces!',
-			name: 'name',
-			validateOnChange: false,
-			validateOnBlur: false,
-			validFlag: false,
-			validator : function() {
-				return this.validFlag;
-			}
-		});
-
-		var cellEditing = Ext.create('Ext.grid.plugin.CellEditing',{
-//			clicksToEdit: 2,
-			onEditComplete : function(ed, value, startValue) {
-				var me = this,
-				activeColumn = me.getActiveColumn(),
-				context = me.context,
-				record;
-
-				if (activeColumn) {
-					record = context.record;
-
-					me.setActiveEditor(null);
-					me.setActiveColumn(null);
-					me.setActiveRecord(null);
-
-					context.value = value;
-					if (!me.validateEdit()) {
-						me.editing = false;
-						return;
-					}
-
-					// Only update the record if the new value is different than the
-					// startValue. When the view refreshes its el will gain focus
-					if (!record.isEqual(value, startValue)) {
-            var obj = {
-              'cacheId' : record.get('cacheId'),
-              'isCatalog' : true,
-              'data' : {}
-            };
-            obj['data'][activeColumn.dataIndex] = value;
-
-						//Interval is modified on the server side
-						me.editing = true;
-
-						AmdaAction.modifyCacheInterval(obj, function (result, e) {
-							var module = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.catalog.id);
-							if (module)
-								module.getUiContent().status = result.status;
-							if (!context.store.loading) {
-								context.grid.getSelectionModel().deselectAll();
-								context.store.reload({
-									callback : function(records, options, success) {
-										context.view.bufferedRenderer.scrollTo(context.rowIdx, true, function() {
-											me.fireEvent('edit', me, context);
-											me.editing = false;
-										}, me);
-									}
-								});
-							}
-							else {
-								me.editing = false;
-							}
-						}, this);
-					}
-					else
-						me.editing = false;
-					}
-			}
-		});
-
-    var filters = {
-        ftype: 'filters',
-        encode: true, // json encode the filter query
-        local: false,
-        filters: [
-
-        ]
-    };
-
-		this.TTGrid =  Ext.create('Ext.grid.Panel', {
-			height: 530,
-      features: [filters],
-			columns: [ ],
-			frame: true,
-			columnLines: true,
-			selModel: {pruneRemoved: false},
-			//	selType: 'cellmodel',
-			plugins: [ cellEditing, { ptype : 'bufferedrenderer'} ],
-			dockedItems: [{
-				xtype: 'toolbar',
-				items: [{
-					iconCls: 'icon-add',
-					scope: this,
-					handler: function(){
-						cellEditing.cancelEdit();
-						var store = this.TTGrid.getStore();
-
-						var selection = this.TTGrid.getView().getSelectionModel().getSelection()[0];
-						var row = 0;
-						if (selection)
-							row = store.indexOf(selection) + 1;
-						this.TTGrid.getSelectionModel().deselectAll();
-
-						var me = this;
-						AmdaAction.addCacheInterval({'index' : row, 'isCatalog' : true}, function (result, e) {
-							this.status = result.status;
-							if (!this.TTGrid.getStore().loading) {
-								this.TTGrid.getStore().reload({
-									callback : function(records, options, success) {
-										me.TTGrid.getView().bufferedRenderer.scrollTo(row, false, function() {
-											me.TTGrid.getView().select(row);
-											cellEditing.startEditByPosition({row: row, column: 1});
-										}, me);
-									}
-								});
-							}
-						}, this);
-					}
-				},{
-					iconCls: 'icon-delete',
-					disabled: true,
-					itemId: 'delete',
-					scope: this,
-					handler:  function(){
-						var selection = this.TTGrid.getView().getSelectionModel().getSelection()[0];
-						if (selection)
-						{
-							var rowId = selection.get('cacheId');
-							this.TTGrid.getSelectionModel().deselectAll();
-							AmdaAction.removeTTCacheIntervalFromId(rowId, this.isCatalog, function (result, e) {
-								this.status = result.status;
-								if (!this.TTGrid.getStore().loading) {
-									this.TTGrid.getStore().reload();
-								}
-							}, this);
-						}
-					}
-				},'->',
-        {
-            text: 'Clear Filters',
-            scope: this,
-            handler: function () {
-              this.TTGrid.getStore().clearFilter(true);
-              this.TTGrid.filters.clearFilters();
-            }
-        }]
-			}]
-		});
-
-		this.formPanel =  Ext.create('Ext.form.Panel', {
-			region : 'center',
-			layout:  'hbox',
-			model : 'amdaModel.Catalog',
-			trackResetOnLoad : true, // reset to the last loaded record
-			bodyStyle: {background : '#dfe8f6'},
-			defaults: { border : false, align: 'stretch', bodyStyle: {background : '#dfe8f6'},  padding: '3'},
-			fieldDefaults: { labelWidth: 80, labelAlign : 'top' },
-			items: [{
-				xtype: 'form',
-				flex: 1,
-				buttonAlign: 'left',
-				// title : 'Information',
-				layout: {type: 'vbox', pack: 'start', align: 'stretch'},
-				items : [
-					this.fieldName,
-					{
-						xtype: 'fieldcontainer',
-						layout: 'hbox',
-						items: [{
-								xtype:'datefield', fieldLabel:'Creation date',
-								name: 'created', disabled: true,
-								hideTrigger: true, format: 'Y/m/d H:i:s'
-							},
-							{ xtype: 'splitter' },
-							{ xtype:'textfield', fieldLabel: 'Intervals', name: 'nbIntervals', disabled: true }
-						]
-					},
-					{
-						xtype: 'textarea',
-						name: 'description',
-						fieldLabel: 'Description',
-						height: 200
-					},
-					{
-						xtype: 'component',
-						height: 90
-					}],
-					dockedItems:[{
-						xtype: 'toolbar',
-						dock: 'bottom',
-						ui: 'footer',
-						items: [{
-							type: 'button',
-							text: 'Create New Catalog',
-							scope : this,
-							handler: function ()
-							{
-								var module = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.catalog.id);
-
-								if (!module) return;
-
-								module.createLinkedNode();
- 								module.createObject();
-
-								var obj = module.linkedNode.get('object');
-
-									var me = this;
-
-									Ext.Msg.prompt('Create catalog', 'Enter the number of columns:', function(btn, text){
-										if (btn == 'ok'){
-											module.createLinkedNode();
-											module.createObject();
-											var obj = module.linkedNode.get('object');
-
-											var nbParam = parseInt(text);
-											if ((nbParam <= 0) || (nbParam > 100)) {
-												nbParam = 1;
-											}
-
-											obj.set('nbParameters', nbParam);
-											me.setObject(obj,true);
-										}
-									}, this);
-
-							}
-						}]
-					},
-
-					{
-						xtype: 'toolbar',
-						dock: 'bottom',
-						ui: 'footer',
-						items: [
-						{
-							type: 'button',
-							text: 'Save',
-							scope : this,
-							handler: function ()
-							{
-                                                                                                                                                        this.saveCatalog();
-
-							}
-						},{
-							type: 'button',
-							text: 'Reset',
-							scope : this,
-							handler: function() {
-								var module = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.catalog.id);
-// 								module.createLinkedNode();
-// 								module.createObject();
-								this.setObject(module.getLinkedNode().get('object'), true);
-							}
-						},
-// 						{
-// 							type: 'button',
-// 							text: 'Share',
-// 							scope : this,
-// 							handler: function() {
-// 								var me = this;
-// 								myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.catalog.id, true, function (module) {
-// 									var catalog = module.getLinkedNode().get('object');
-// 									module.shareCatalog({'name' : catalog.get('text'), 'id' : catalog.get('id')});
-// 								});
-// 							}
-// 						},
-
-                                                                                                                        ]
-					},
-                                                                                                     //statistical info
-                                                                                                                       {
-                                                                                                                         xtype: 'toolbar',
-						dock: 'bottom',
-						ui: 'footer',
-                                                                                                                        items:[{
-                                                                                                                                            xtype: 'button',
-                                                                                                                                             text: 'Statistical info',
-                                                                                                                                             scope: this,
-                                                                                                                                             //dock: 'bottom',
-                                                                                                                                             //ui: 'footer',
-                                                                                                                                             handler: function() {
-                                                                                                                                                                   this.fireEvent('info','catalogUI');
-                                                                                                                                                                }
-                                                                                                                                             },
-                                                        			                                        {
-							type: 'button',
-							text: 'Visualize',
-							scope: this,
-							handler: function() {
-								var me = this;
-								myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.visu.id, true, function (module) {
-									//temporary linked node - as  Visu module is 'pseudo' interactive - no 'save', no 'execute'
-									var temporaryNode = Ext.create('amdaModel.CatalogNode', { leaf : true });
-									if (temporaryNode) temporaryNode.set('object',me.object);
-									module.setLinkedNode(temporaryNode);
-
-									module.createWindow();
-								});
-							}
-						}
-                                                                                                                        ]
-                                                                                                                        },
-                                                                                                                         {
-                                                                                                                         xtype: 'toolbar',
-						dock: 'bottom',
-						ui: 'footer',
-                                                                                                                        items:[{
-                                                                                                                                            xtype: 'button',
-                                                                                                                                             text: 'Generate Time Table',
-                                                                                                                                             scope: this,
-                                                                                                                                             //dock: 'bottom',
-                                                                                                                                             //ui: 'footer',
-                                                                                                                                             handler: function() {
-                                                                                                                                                                this.generateTT(this.object.get('id'));
-                                                                                                                                                            }
-                                                                                                                                             }]},
-                                                                                            ]
-				},
-				{
-					xtype: 'form',
-					bodyStyle: {background : '#dfe8f6'},
-					//padding: '3',
-					flex: 2,
-					items : [ this.TTGrid ]
-				}]
-			});
-
-		this.TTGrid.getSelectionModel().on('selectionchange', function(selModel,selections) {
-			this.TTGrid.down('#delete').setDisabled(selections.length === 0);
-		}, this);
-
-		var myConf = {
-			layout: 'border',
-			items: [
-				this.formPanel,
-				{
-					xtype: 'panel',
-					region: 'south',
-					title: 'Information',
-					collapsible: true,
-					collapseMode: 'header',
-					height: 100,
-					autoHide: false,
-					bodyStyle: 'padding:5px',
-					iconCls:  'icon-information',
-					loader:
-					{
-						autoLoad: true,
-						url: helpDir+'catalogHOWTO'
-					}
-				}
-			] ,
-                        plugins: [ {ptype: 'statisticalPlugin'} ]
-		};
-		Ext.apply (this, Ext.apply(arguments, myConf));
-	}
+            ],
+            plugins: [{ptype: 'statisticalPlugin'}]
+        };
+        Ext.apply(this, Ext.apply(arguments, myConf));
+    }
 
 });
--
libgit2 0.21.2