Commit 8a2ebb6973f060b0bdead08d80cab8badcb70d11

Authored by Elena Budnik
2 parents cedf0315 48a8a598

Merge branch 'upload_cdf_upgrade' into 'master'

Upload cdf upgrade

See merge request !20
generic_data/remote_sites.json 0 → 100644
@@ -0,0 +1,3 @@ @@ -0,0 +1,3 @@
  1 +{"remote_sites": [
  2 + {"name": "CDAWeb", "value": "https://cdaweb.gsfc.nasa.gov/pub/data/"}
  3 +]}
js/app/controllers/UploadModule.js
@@ -20,8 +20,8 @@ Ext.define('amdaDesktop.UploadModule', { @@ -20,8 +20,8 @@ Ext.define('amdaDesktop.UploadModule', {
20 * @cfg {String} window definitions 20 * @cfg {String} window definitions
21 * @required 21 * @required
22 */ 22 */
23 - width: 320,  
24 - height: 510, 23 + width: 330,
  24 + height: 520,
25 uiType : 'panelTabUpload', 25 uiType : 'panelTabUpload',
26 helpTitle : 'Help on Upload Module', 26 helpTitle : 'Help on Upload Module',
27 helpFile : 'uploadHelp', 27 helpFile : 'uploadHelp',
js/app/models/InteractiveNode.js
@@ -200,22 +200,11 @@ Ext.define('amdaModel.InteractiveNode', { @@ -200,22 +200,11 @@ Ext.define('amdaModel.InteractiveNode', {
200 200
201 if (res.info) { 201 if (res.info) {
202 this.set('info',res.info); 202 this.set('info',res.info);
203 - }  
204 -  
205 - if (this.get('nodeType') == 'myDataParam') {  
206 - if (res.isSpectra) {  
207 - this.set('iconCls', 'icon-spectra');  
208 - }  
209 - else {  
210 - if (res.size > 1) this.set('iconCls', 'icon-unknowntype');  
211 - }  
212 } 203 }
213 204
214 - // update my data on possibble mask change  
215 - if (res.updateMyData) {  
216 - this.updateMyData();  
217 - this.updateMask(res.mask);  
218 - } 205 + // myDataParam special update
  206 + this.specialUpdate(res, false);
  207 +
219 // reload object into the view of corresponding Module 208 // reload object into the view of corresponding Module
220 var me = this; 209 var me = this;
221 myDesktopApp.getLoadedModule(this.get('moduleId'), true, function (module) { 210 myDesktopApp.getLoadedModule(this.get('moduleId'), true, function (module) {
@@ -282,30 +271,10 @@ Ext.define('amdaModel.InteractiveNode', { @@ -282,30 +271,10 @@ Ext.define('amdaModel.InteractiveNode', {
282 if (res.info){ 271 if (res.info){
283 // set the tooltip 272 // set the tooltip
284 this.set('info',res.info); 273 this.set('info',res.info);
285 - //set globalStart & global Stop to be used for time selection  
286 - if (this.get('nodeType') == 'myDataParam')  
287 - {  
288 - var startStop = res.info.split("<br/>");  
289 - var globalStart = startStop[1].substr(0,19);  
290 - var globalStop = startStop[1].substr(20);  
291 -  
292 - this.set('globalStart', globalStart);  
293 - this.set('globalStop', globalStop);  
294 -  
295 - if (res.mask)  
296 - this.set('linkedMask', res.mask);  
297 - if (res.size)  
298 - this.set('size', res.size);  
299 -  
300 - if (res.isSpectra) {  
301 - this.set('iconCls', 'icon-spectra');  
302 - }  
303 - else {  
304 - if (res.size > 1)  
305 - this.set('iconCls', 'icon-unknowntype');  
306 - }  
307 - }  
308 - } 274 + }
  275 + //set globalStart & global Stop to be used for time selection
  276 + this.specialUpdate(res, true);
  277 +
309 //TODO do we need this commission ??? 278 //TODO do we need this commission ???
310 // fix the modifications for object 279 // fix the modifications for object
311 this.get('object').commit(); 280 this.get('object').commit();
@@ -333,14 +302,6 @@ Ext.define(&#39;amdaModel.InteractiveNode&#39;, { @@ -333,14 +302,6 @@ Ext.define(&#39;amdaModel.InteractiveNode&#39;, {
333 opt.callback.call(scope,'create'); 302 opt.callback.call(scope,'create');
334 } 303 }
335 }, this); 304 }, this);
336 -  
337 - // myDataParamNode - update MyData subtree  
338 - //TODO put this in mydataparamnode  
339 - if (res.updateMyData) {  
340 - this.updateMyData();  
341 - this.updateMask(res.mask);  
342 - }  
343 -  
344 } 305 }
345 // error code from server; but e.status==true 306 // error code from server; but e.status==true
346 else { 307 else {
@@ -359,6 +320,7 @@ Ext.define(&#39;amdaModel.InteractiveNode&#39;, { @@ -359,6 +320,7 @@ Ext.define(&#39;amdaModel.InteractiveNode&#39;, {
359 },this); 320 },this);
360 }, 321 },
361 322
  323 + specialUpdate : function() {},
362 /** 324 /**
363 * Generic part of Context Menu 325 * Generic part of Context Menu
364 * 326 *
js/app/models/MyDataNode.js
@@ -188,9 +188,9 @@ Ext.define(&#39;amdaModel.MyDataNode&#39;, { @@ -188,9 +188,9 @@ Ext.define(&#39;amdaModel.MyDataNode&#39;, {
188 if (myParamRootNode.isExpanded) { 188 if (myParamRootNode.isExpanded) {
189 Ext.Array.each(myParamRootNode.childNodes, function(node) { 189 Ext.Array.each(myParamRootNode.childNodes, function(node) {
190 if (node.get('linkedMask') && node.get('linkedMask') == mask) { 190 if (node.get('linkedMask') && node.get('linkedMask') == mask) {
191 - var globalStart = maskDesc.substr(0,16);  
192 - var globalStop = maskDesc.substr(17,16);  
193 - 191 + var globalStart = maskDesc.substr(0,19);
  192 + var globalStop = maskDesc.substr(20);
  193 +
194 node.set('globalStart', globalStart); 194 node.set('globalStart', globalStart);
195 node.set('globalStop', globalStop); 195 node.set('globalStop', globalStop);
196 if (node.get('info')) { 196 if (node.get('info')) {
js/app/models/MyDataParamNode.js
@@ -31,12 +31,13 @@ Ext.define(&#39;amdaModel.MyDataParamNode&#39;, { @@ -31,12 +31,13 @@ Ext.define(&#39;amdaModel.MyDataParamNode&#39;, {
31 this.set('objectDataModel','amdaModel.FileParamObject'); 31 this.set('objectDataModel','amdaModel.FileParamObject');
32 if (this.get('isParameter')) { 32 if (this.get('isParameter')) {
33 if (this.get('size') == 1) 33 if (this.get('size') == 1)
34 - this.set('iconCls', 'icon-scalar');  
35 - else if (this.get('size') == 3) 34 + this.set('iconCls', 'icon-scalar');
  35 + else if(this.get('size') == 3)
36 this.set('iconCls', 'icon-vector'); 36 this.set('iconCls', 'icon-vector');
37 else 37 else
38 this.set('iconCls', 'icon-unknowntype'); 38 this.set('iconCls', 'icon-unknowntype');
39 } 39 }
  40 +
40 if (this.get('isSpectra')) this.set('iconCls', 'icon-spectra'); 41 if (this.get('isSpectra')) this.set('iconCls', 'icon-spectra');
41 }, 42 },
42 43
@@ -76,7 +77,7 @@ Ext.define(&#39;amdaModel.MyDataParamNode&#39;, { @@ -76,7 +77,7 @@ Ext.define(&#39;amdaModel.MyDataParamNode&#39;, {
76 }, 77 },
77 78
78 getAllContextMenuItems: function() 79 getAllContextMenuItems: function()
79 - { 80 + {
80 var menuItems = this.allMenuItems('Parameter'); 81 var menuItems = this.allMenuItems('Parameter');
81 var locMenuItems = this.localMenuItems(); 82 var locMenuItems = this.localMenuItems();
82 83
@@ -87,52 +88,53 @@ Ext.define(&#39;amdaModel.MyDataParamNode&#39;, { @@ -87,52 +88,53 @@ Ext.define(&#39;amdaModel.MyDataParamNode&#39;, {
87 { 88 {
88 var fnId = Ext.util.Format.substr(item.fnId, 5, item.fnId.length); 89 var fnId = Ext.util.Format.substr(item.fnId, 5, item.fnId.length);
89 90
90 - switch (fnId) { 91 + switch (fnId)
  92 + {
91 case 'deleteNode': 93 case 'deleteNode':
92 this.deleteNode(); 94 this.deleteNode();
93 break; 95 break;
94 96
95 case 'createDir': 97 case 'createDir':
96 this.createDir(); 98 this.createDir();
97 - break; 99 + break;
98 100
99 case 'createLeaf': 101 case 'createLeaf':
100 - this.createLeaf(this);  
101 - break; 102 + this.createLeaf(this);
  103 + break;
102 104
103 case 'renameNode': 105 case 'renameNode':
104 - this.renameNode();  
105 - break; 106 + this.renameNode();
  107 + break;
106 108
107 case 'editLeaf': 109 case 'editLeaf':
108 - this.editLeaf();  
109 - break; 110 + this.editLeaf();
  111 + break;
110 112
111 case 'upload': 113 case 'upload':
112 - this.uploadFile();  
113 - break;  
114 - 114 + this.uploadFile();
  115 + break;
  116 +
115 case 'plotParam': 117 case 'plotParam':
116 - this.createPlot(this);  
117 - break;  
118 - 118 + this.createPlot(this);
  119 + break;
  120 +
119 case 'downParam': 121 case 'downParam':
120 - this.createDownload(this);  
121 - break;  
122 - 122 + this.createDownload(this);
  123 + break;
  124 +
123 default: 125 default:
124 - break;  
125 - } // switch end  
126 -  
127 - }, 126 + break;
  127 + } // switch end
  128 + },
128 129
129 uploadFile: function() { 130 uploadFile: function() {
130 myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.upload.id, true, function (module) { 131 myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.upload.id, true, function (module) {
131 module.createWindow(); 132 module.createWindow();
132 }); 133 });
133 }, 134 },
134 -  
135 - editLeaf: function() { 135 +
  136 + editLeaf: function()
  137 + {
136 // load the rootNode and recursively all its child nodes 138 // load the rootNode and recursively all its child nodes
137 // to know all names of DerivedParameters 139 // to know all names of DerivedParameters
138 var me = this; 140 var me = this;
@@ -161,20 +163,20 @@ Ext.define(&#39;amdaModel.MyDataParamNode&#39;, { @@ -161,20 +163,20 @@ Ext.define(&#39;amdaModel.MyDataParamNode&#39;, {
161 var t = remoteEvent.getTransaction(); 163 var t = remoteEvent.getTransaction();
162 if (result) { 164 if (result) {
163 if (result.id) { 165 if (result.id) {
164 - var paramObj = Ext.create(this.get('objectDataModel'), result);  
165 - // set parameter into node  
166 - this.set('object',paramObj);  
167 -  
168 - paramObj.set('tableDef', result['tableDef']);  
169 -  
170 - if (paramObj.get('mask')) var file = paramObj.get('mask');  
171 - else var file = paramObj.get('file');  
172 -  
173 - AmdaAction.getObject(file, amdaModel.MyDataNode.nodeType,  
174 - this.getFileObjectCallback, this); 166 + var paramObj = Ext.create(this.get('objectDataModel'), result);
  167 + // set parameter into node
  168 + this.set('object',paramObj);
  169 +
  170 + paramObj.set('tableDef', result['tableDef']);
  171 +
  172 + if (paramObj.get('mask')) var file = paramObj.get('mask');
  173 + else var file = paramObj.get('file');
  174 +
  175 + AmdaAction.getObject(file, amdaModel.MyDataNode.nodeType,
  176 + this.getFileObjectCallback, this);
175 } 177 }
176 else { 178 else {
177 - myDesktopApp.errorMsg(result.error); 179 + myDesktopApp.errorMsg(result.error);
178 } 180 }
179 } 181 }
180 else { 182 else {
@@ -226,24 +228,59 @@ Ext.define(&#39;amdaModel.MyDataParamNode&#39;, { @@ -226,24 +228,59 @@ Ext.define(&#39;amdaModel.MyDataParamNode&#39;, {
226 }, 228 },
227 229
228 updateMyData : function(){ 230 updateMyData : function(){
229 - // reload myFiles Tree in explorer  
230 - var explorerTree = Ext.getCmp(amdaUI.ExplorerUI.RESRC_TAB.TREE_ID);  
231 - if (explorerTree) {  
232 - var explorerTreeStore = explorerTree.getStore();  
233 - var explorerRoot = explorerTreeStore.getRootNode().findChild('text','My Files');  
234 -  
235 - var explorerPath = '/root/myData-treeRootNode/';  
236 -  
237 - explorerTreeStore.reload({node : explorerRoot,  
238 - params : { nodeType: 'myData'},  
239 - callback : function(){  
240 - explorerTree.selectPath(explorerPath);  
241 - }  
242 - });  
243 - } 231 + // reload myFiles Tree in explorer
  232 + var explorerTree = Ext.getCmp(amdaUI.ExplorerUI.RESRC_TAB.TREE_ID);
  233 + if (explorerTree) {
  234 + var explorerTreeStore = explorerTree.getStore();
  235 + var explorerRoot = explorerTreeStore.getRootNode().findChild('text','My Files');
  236 +
  237 + var explorerPath = '/root/myData-treeRootNode/';
  238 +
  239 + explorerTreeStore.reload({node : explorerRoot,
  240 + params : { nodeType: 'myData'},
  241 + callback : function(){
  242 + explorerTree.selectPath(explorerPath);
  243 + }
  244 + });
  245 + }
244 }, 246 },
245 247
246 isParameter : function(){ 248 isParameter : function(){
247 return this.get('isParameter'); 249 return this.get('isParameter');
248 - } 250 + },
  251 +
  252 + specialUpdate : function(res, timeUpdate)
  253 + {
  254 + if (timeUpdate && res.info)
  255 + {
  256 + var startStop = res.info.split("<br/>");
  257 + var globalStart = startStop[1].substr(0,19);
  258 + var globalStop = startStop[1].substr(20);
  259 +
  260 + this.set('globalStart', globalStart);
  261 + this.set('globalStop', globalStop);
  262 +
  263 + if (res.mask)
  264 + this.set('linkedMask', res.mask);
  265 + if (res.size)
  266 + this.set('size', res.size);
  267 + }
  268 +
  269 + if (res.isSpectra) {
  270 + this.set('iconCls', 'icon-spectra');
  271 + }
  272 + else if (res.size == 3) {
  273 + this.set('iconCls', 'icon-vector');
  274 + }
  275 + else if (res.size > 1) {
  276 + this.set('iconCls', 'icon-unknowntype');
  277 + }
  278 +
  279 + // update my data on possible mask change
  280 + if (res.updateMyData) {
  281 + this.updateMyData();
  282 + this.updateMask(res.mask);
  283 + }
  284 + }
  285 +
249 }); 286 });
js/app/views/ExplorerUI.js
@@ -266,10 +266,12 @@ Ext.define(&#39;amdaUI.ExplorerUI&#39;, { @@ -266,10 +266,12 @@ Ext.define(&#39;amdaUI.ExplorerUI&#39;, {
266 model: 'amdaModel.AmdaNode', 266 model: 'amdaModel.AmdaNode',
267 sorters:[{ direction: 'ASC' , 267 sorters:[{ direction: 'ASC' ,
268 sorterFn: function(o1, o2){ 268 sorterFn: function(o1, o2){
269 - if (o1.get('nodeType') !== 'localParam')  
270 - return;  
271 -  
272 - return o1.get('text').toUpperCase() < o2.get('text').toUpperCase() ? -1 : 1; 269 +
  270 + if (o1.get('nodeType') == 'localParam' || o1.get('nodeType') == 'myData') {
  271 + return o1.get('text').toUpperCase() < o2.get('text').toUpperCase() ? -1 : 1;
  272 + }
  273 +
  274 + return;
273 } 275 }
274 }], 276 }],
275 listeners: { 277 listeners: {
js/app/views/MyDataUI.js
@@ -10,474 +10,495 @@ @@ -10,474 +10,495 @@
10 10
11 11
12 Ext.define('amdaUI.MyDataUI', { 12 Ext.define('amdaUI.MyDataUI', {
13 - extend: 'Ext.container.Container',  
14 - alias: 'widget.panelMyData',  
15 -  
16 - requires: [  
17 - 'amdaUI.TableDefPlugUI'  
18 - ], 13 + extend: 'Ext.container.Container',
  14 + alias: 'widget.panelMyData',
  15 +
  16 + requires: [
  17 + 'amdaUI.TableDefPlugUI'
  18 + ],
19 19
20 - object : null,  
21 - fileObject : null,  
22 -  
23 - module : null,  
24 -  
25 - fields : [],  
26 - columns : [],  
27 -  
28 - constructor: function(config) {  
29 - this.module = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.my_data.id);  
30 - this.init(config);  
31 - this.callParent(arguments);  
32 - this.setObject(this.module.linkedNode.get('object'));  
33 - },  
34 -  
35 - /*  
36 - * linked node should be MyDataParamNode  
37 - */  
38 - resetLinkedNode: function()  
39 - {  
40 - this.linkedNode = null;  
41 - this.module.createLinkedNode();  
42 - this.module.createObject();  
43 - this.module.linkedNode.set('fileObject',this.fileObject);  
44 - }, 20 + object : null,
  21 + fileObject : null,
45 22
46 - getObjectCallback: function(result,remoteEvent)  
47 - {  
48 - var t = remoteEvent.getTransaction();  
49 - if (result && !result.error) {  
50 - //this.tmpNode.set('contextNode',mask!!! if exists  
51 - this.fileObject = Ext.create('amdaModel.FileObject', result);  
52 - var panelConfig = this.initPanel();  
53 - }  
54 - else {  
55 - // EXCEPTION : parameter not found !  
56 - myDesktopApp.errorMsg(t.action + "." + t.method + " : No parameter '"  
57 - +this.tmpNode.get('text')+"' found!");  
58 - }  
59 - },  
60 -  
61 - /*  
62 - * Update info in the form on another parameter selection (cdf, cef formats);  
63 - */  
64 - updateInfo : function(res, e)  
65 - {  
66 - if (res.success){  
67 - // info panel  
68 - this.items.getAt(1).update(res.info.name+': '+res.info.type+' '+res.info.size+' '+res.info.n_records);  
69 - var form = this.items.getAt(0).getForm();  
70 -  
71 - //keep old name and mask if they exist  
72 - if (this.object.get('format') == 'vot')  
73 - {  
74 - if ((res.info.id === this.object.get('realvar'))) {  
75 - if (this.object.get('realvar') != this.object.get('name')) {  
76 - res.info.name = this.object.get('name');  
77 - }  
78 - if (res.info.mask != this.object.get('mask')) {  
79 - res.info.mask = this.object.get('mask');  
80 - }  
81 - }  
82 - }  
83 - else  
84 - {  
85 - if ((res.info.name === this.object.get('realvar'))) {  
86 - if (this.object.get('realvar') != this.object.get('name')) {  
87 - res.info.name = this.object.get('name');  
88 - }  
89 - if (res.info.mask != this.object.get('mask')) {  
90 - res.info.mask = this.object.get('mask');  
91 - }  
92 - }  
93 - } 23 + module : null,
  24 +
  25 + fields : [],
  26 + columns : [],
  27 +
  28 + constructor: function(config) {
  29 + this.module = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.my_data.id);
  30 + this.init(config);
  31 + this.callParent(arguments);
  32 + this.setObject(this.module.linkedNode.get('object'));
  33 + },
94 34
95 - form.setValues(res.info);  
96 - }  
97 - else {  
98 - myDesktopApp.errorMsg("System Error <br/> Error at AMDA Server");  
99 - }  
100 - },  
101 -  
102 - /*  
103 - * Check if changes were made before closing window  
104 - * @return false  
105 - */  
106 - fclose : function() {  
107 - return false;  
108 - }, 35 + /*
  36 + * linked node should be MyDataParamNode
  37 + */
  38 + resetLinkedNode: function()
  39 + {
  40 + this.linkedNode = null;
  41 + this.module.createLinkedNode();
  42 + this.module.createObject();
  43 + this.module.linkedNode.set('fileObject',this.fileObject);
  44 + },
109 45
110 - /**  
111 - * set object into form  
112 - */  
113 - setObject : function (object)  
114 - {  
115 - // edit in module from FileUpload Module and ExplorerModule (edit param)  
116 - if (this.module.linkedNode) {  
117 - if (this.module.linkedNode.get('fileObject')) {  
118 - this.fileObject = this.module.linkedNode.get('fileObject');  
119 - }  
120 - // edit in module from Explorer Module (edit file)  
121 - else if (this.module.linkedNode.get('object')) {  
122 - this.fileObject = this.module.linkedNode.get('object');  
123 - this.resetLinkedNode();  
124 - }  
125 - else {  
126 - myDesktopApp.errorMsg("System Error <br/> No FileObject and Object");  
127 - }  
128 - }  
129 - else {  
130 - myDesktopApp.errorMsg("System Error <br/> No Linked Node");  
131 - }  
132 -  
133 - var form = this.down('form');  
134 - form.getForm().reset();  
135 - // remove and DESTROY right panel if it exists  
136 - if (form.items.length == 2)  
137 - form.remove(form.items.getAt(1),true);  
138 - // create right panel depending on file  
139 - var rightPanel = this.initPanel();  
140 - form.add(rightPanel);  
141 - this.object = this.module.linkedNode.get('object'); 46 + getObjectCallback: function(result,remoteEvent)
  47 + {
  48 + var t = remoteEvent.getTransaction();
  49 + if (result && !result.error) {
  50 + //this.tmpNode.set('contextNode',mask!!! if exists
  51 + this.fileObject = Ext.create('amdaModel.FileObject', result);
  52 + var panelConfig = this.initPanel();
  53 + }
  54 + else {
  55 + // EXCEPTION : parameter not found !
  56 + myDesktopApp.errorMsg(t.action + "." + t.method + " : No parameter '"
  57 + +this.tmpNode.get('text')+"' found!");
  58 + }
  59 + },
  60 + /*
  61 + * Update info in the form on another parameter selection (cdf, cef formats);
  62 + */
  63 + updateInfo : function(res, e)
  64 + {
  65 + if (res.success){
  66 + // info panel
  67 + this.items.getAt(1).update(res.info.name+': '+res.info.type+' '+res.info.size+' '+res.info.n_records);
  68 + var form = this.items.getAt(0).getForm();
  69 +
  70 + //keep old name and mask if they exist
  71 + if (this.object.get('format') == 'vot')
  72 + {
  73 + res.info.ytitle = res.info.name;
  74 + if ((res.info.id === this.object.get('realvar'))) {
  75 + if (this.object.get('realvar') != this.object.get('name')) {
  76 + res.info.name = this.object.get('name');
  77 + }
  78 + if (res.info.mask != this.object.get('mask')) {
  79 + res.info.mask = this.object.get('mask');
  80 + }
  81 + }
  82 + }
  83 + else
  84 + {
  85 + if ((res.info.name === this.object.get('realvar'))) {
  86 + if (this.object.get('realvar') != this.object.get('name')) {
  87 + res.info.name = this.object.get('name');
  88 + }
  89 + if (res.info.mask != this.object.get('mask')) {
  90 + res.info.mask = this.object.get('mask');
  91 + }
  92 + }
  93 + res.info.ytitle = res.info.name;
  94 + }
142 95
143 - // load object into form  
144 - if (object.$className == 'amdaModel.FileObject' || !this.object.get('name'))  
145 - form.getForm().loadRecord(this.fileObject);  
146 - else  
147 - form.getForm().loadRecord(this.object); 96 + form.setValues(res.info);
  97 + }
  98 + else {
  99 + myDesktopApp.errorMsg("System Error <br/> Error at AMDA Server");
  100 + }
  101 + },
  102 + /*
  103 + * Check if changes were made before closing window
  104 + * @return false
  105 + */
  106 + fclose : function() {
  107 + return false;
  108 + },
  109 +
  110 + /**
  111 + * set object into form
  112 + */
  113 + setObject : function (object)
  114 + {
  115 + // edit in module from FileUpload Module and ExplorerModule (edit param)
  116 + if (this.module.linkedNode) {
  117 + if (this.module.linkedNode.get('fileObject')) {
  118 + this.fileObject = this.module.linkedNode.get('fileObject');
  119 + }
  120 + // edit in module from Explorer Module (edit file)
  121 + else if (this.module.linkedNode.get('object')) {
  122 + this.fileObject = this.module.linkedNode.get('object');
  123 + this.resetLinkedNode();
  124 + }
  125 + else {
  126 + myDesktopApp.errorMsg("System Error <br/> No FileObject and Object");
  127 + }
  128 + }
  129 + else {
  130 + myDesktopApp.errorMsg("System Error <br/> No Linked Node");
  131 + }
  132 +
  133 + var form = this.down('form');
  134 + form.getForm().reset();
  135 + // remove and DESTROY right panel if it exists
  136 + if (form.items.length == 2)
  137 + form.remove(form.items.getAt(1),true);
  138 + // create right panel depending on file
  139 + var rightPanel = this.initPanel();
  140 + form.add(rightPanel);
  141 + this.object = this.module.linkedNode.get('object');
148 142
149 - // if it is not newly created empty myParamData node  
150 - if (this.object.get('name')) {  
151 - // file panel work around  
152 - if (this.fileObject.get('format') == 'txt') {  
153 - form.getForm().findField('start').setValue(this.object.get('realvar'));  
154 - }  
155 - else if (this.object.get('format') == 'vot')  
156 - {  
157 - var radio = this.down('radiogroup');  
158 - radio.setValue({'votvar' : this.object.get('realvar')});  
159 - }  
160 - else { // cdf, cef, nc  
161 - // select parameter  
162 - var radio = this.down('radiogroup');  
163 - radio.setValue({'cdfvar' : this.object.get('realvar')});  
164 - }  
165 - }  
166 -  
167 - //Set table definition  
168 - if (object.get('tableDef'))  
169 - this.getPlugin('tabledef').setTableDefinition(object.get('tableDef'));  
170 - }, 143 + // load object into form
  144 + if (object.$className == 'amdaModel.FileObject' || !this.object.get('name')) {
  145 + form.getForm().loadRecord(this.fileObject);
  146 + if (this.fileObject.get('format') == 'txt')
  147 + this.disablePredefined(false);
  148 + else
  149 + this.disablePredefined(true);
  150 + }
  151 + else
  152 + form.getForm().loadRecord(this.object);
171 153
172 -/*  
173 - * highlight selected columns in case of param (ASCII) edit  
174 - */  
175 - updateSelection: function()  
176 - {  
177 - var start = parseInt(this.object.get('realvar'));  
178 - var size = parseInt(this.object.get('size'));  
179 -  
180 - if (start && size) {  
181 - var columns = this.down('gridpanel').columns;  
182 - for (var i = start; i < start+size; i++) {  
183 - var selected = Ext.select(columns[i].getCellSelector(i));  
184 - selected.addCls('meow');  
185 - columns[i].selected = true;  
186 - }  
187 - }  
188 - }, 154 + // if it is not newly created empty myParamData node
  155 + if (this.object.get('name')) {
  156 + // file panel work around
  157 + if (this.fileObject.get('format') == 'txt') {
  158 + form.getForm().findField('start').setValue(this.object.get('realvar'));
  159 + this.disablePredefined(false);
  160 + }
  161 + else if (this.object.get('format') == 'vot')
  162 + {
  163 + var radio = this.down('radiogroup');
  164 + radio.setValue({'votvar' : this.object.get('realvar')});
  165 + }
  166 + else { // cdf, cef, nc
  167 + // select parameter
  168 + var radio = this.down('radiogroup');
  169 + radio.suspendEvent('change');
  170 + radio.setValue({'cdfvar' : this.object.get('realvar')});
  171 + radio.resumeEvent('change');
  172 + // disable form fields defined in file
  173 + this.disablePredefined(true);
  174 + }
  175 + }
  176 +
  177 + //Set table definition
  178 + if (object.get('tableDef'))
  179 + this.getPlugin('tabledef').setTableDefinition(object.get('tableDef'));
  180 + },
189 181
190 - /*  
191 - * update this.object from form  
192 - */  
193 - updateObject : function(nameField)  
194 - {  
195 - // get the basic form  
196 - var basicForm = this.down('form').getForm();  
197 - var updateStatus = true;  
198 - var fieldsWithoutName = basicForm.getFields().items;  
199 -  
200 - Ext.Array.each(fieldsWithoutName, function(item, index,allItems){  
201 - if(item !== nameField) {  
202 - if (!item.isValid()) {  
203 - // set update isn't allowed  
204 - updateStatus = false;  
205 - }  
206 - }  
207 - }, this);  
208 -  
209 - // if the update is allowed  
210 - if (updateStatus) {  
211 - // real object update  
212 - // updateobject with the content of form  
213 - var values = basicForm.getValues();  
214 - basicForm.updateRecord(this.object);  
215 - this.object.set('file',this.fileObject.get('fileName'));  
216 - this.object.set('format', this.fileObject.get('format'));  
217 - if (this.object.get('format') == 'cdf' || this.object.get('format') == 'cef' || this.object.get('format') == 'nc') this.object.set('realvar',values.cdfvar);  
218 - if (this.object.get('format') == 'vot') this.object.set('realvar',values.votvar);  
219 - if (this.object.get('format') == 'txt') this.object.set('realvar',values.start);  
220 - this.object.set('tableDef', this.getPlugin('tabledef').getTableDefinitionObject());  
221 - }  
222 - // return the update status  
223 - return updateStatus;  
224 - }, 182 + /*
  183 + * // disable form fields defined in file ( cdf, nc, cef )
  184 + */
  185 + disablePredefined: function(disable)
  186 + {
  187 + var form = this.down('form');
  188 + form.getForm().findField('start').setDisabled(disable);
  189 + form.getForm().findField('size').setReadOnly(disable);
  190 + this.down('combobox').setReadOnly(disable);
  191 + },
  192 +
  193 + /*
  194 + * highlight selected columns in case of param (ASCII) edit
  195 + */
  196 + updateSelection: function()
  197 + {
  198 + var start = parseInt(this.object.get('realvar'));
  199 + var size = parseInt(this.object.get('size'));
  200 +
  201 + if (start && size) {
  202 + var columns = this.down('gridpanel').columns;
  203 + for (var i = start; i < start+size; i++) {
  204 + var selected = Ext.select(columns[i].getCellSelector(i));
  205 + selected.addCls('meow');
  206 + columns[i].selected = true;
  207 + }
  208 + }
  209 + },
  210 +
  211 + /*
  212 + * update this.object from form
  213 + */
  214 + updateObject : function(nameField)
  215 + {
  216 + // get the basic form
  217 + var basicForm = this.down('form').getForm();
  218 + var updateStatus = true;
  219 + var fieldsWithoutName = basicForm.getFields().items;
  220 +
  221 + Ext.Array.each(fieldsWithoutName, function(item, index,allItems){
  222 + if(item !== nameField) {
  223 + if (!item.isValid()) {
  224 + // set update isn't allowed
  225 + updateStatus = false;
  226 + }
  227 + }
  228 + }, this);
  229 +
  230 + // if the update is allowed
  231 + if (updateStatus) {
  232 + // real object update
  233 + // updateobject with the content of form
  234 + var values = basicForm.getValues();
  235 + basicForm.updateRecord(this.object);
  236 + this.object.set('file',this.fileObject.get('fileName'));
  237 + this.object.set('format', this.fileObject.get('format'));
  238 + if (this.object.get('format') == 'cdf' || this.object.get('format') == 'cef' || this.object.get('format') == 'nc') this.object.set('realvar',values.cdfvar);
  239 + if (this.object.get('format') == 'vot') this.object.set('realvar',values.votvar);
  240 + if (this.object.get('format') == 'txt') this.object.set('realvar',values.start);
  241 + this.object.set('tableDef', this.getPlugin('tabledef').getTableDefinitionObject());
  242 + }
  243 + // return the update status
  244 + return updateStatus;
  245 + },
225 246
226 - /**  
227 - * Check mask - length, existed....  
228 - * @return true/false  
229 - */  
230 - validateMask : function(value)  
231 - {  
232 - // length  
233 - if (value.length < 6) return 'mask length is too small (< 6)';  
234 -  
235 - // first *  
236 - if (value.indexOf('*') === 0) return '"*" could not be the first letter in mask';  
237 -  
238 - // several *  
239 - if (value.indexOf('*') !== value.lastIndexOf('*')) return 'several "*" are not allowed in mask';  
240 -  
241 - // less common  
242 - var paramModule = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.my_data.id);  
243 - var oldmask = paramModule.linkedNode.get('object').get('mask');  
244 - // no old mask  
245 - if (oldmask.length === 0) return true;  
246 - if (value.length > oldmask.length) return 'new mask is less common than old one';  
247 -  
248 - return true;  
249 - }, 247 + /**
  248 + * Check mask - length, existed....
  249 + * @return true/false
  250 + */
  251 + validateMask : function(value)
  252 + {
  253 + // length
  254 + if (value.length < 6) return 'mask length is too small (< 6)';
250 255
251 - /*  
252 - *  
253 - */  
254 - saveProcess : function(toRename)  
255 - {  
256 - var values = this.down('form').getForm().getValues();  
257 - // Parameter Module  
258 - var paramModule = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.my_data.id);  
259 -  
260 - // if the name has been modified this is a creation  
261 - if (this.object.isModified('name')){  
262 - var contextNode = paramModule.linkedNode.parentNode;  
263 - // if object already has an id : it's a 'rename' of an existing  
264 - if (this.object.get('id')){  
265 - // get file object of the first node linked this file  
266 - var fileObject = paramModule.linkedNode.get('fileObject');  
267 -  
268 - paramModule.createLinkedNode();  
269 - // create a new object linked  
270 - var paramobj = Ext.create(paramModule.linkedNode.get('objectDataModel'), values);  
271 -  
272 - paramobj.set('format', this.fileObject.get('format'));  
273 - if (paramobj.get('format') == 'cdf' || paramobj.get('format') == 'cef' ||  
274 - paramobj.get('format') == 'nc')  
275 - paramobj.set('realvar',values.cdfvar);  
276 - if (paramobj.get('format') == 'vot')  
277 - paramobj.set('realvar',values.votvar);  
278 - if (paramobj.get('format') == 'txt')  
279 - paramobj.set('realvar',values.start);  
280 -  
281 - paramobj.set('file', this.fileObject.get('fileName'));  
282 -  
283 - paramobj.set('tableDef', this.getPlugin('tabledef').getTableDefinitionObject());  
284 -  
285 - paramModule.linkedNode.set('object',paramobj);  
286 - //synchronize objects  
287 - this.object = paramobj;  
288 -  
289 - paramModule.linkedNode.set('fileObject',fileObject);  
290 -  
291 - if (toRename)  
292 - paramModule.linkedNode.toRename = true;  
293 - }  
294 - paramModule.linkedNode.set('contextNode',contextNode);  
295 - paramModule.linkedNode.create();  
296 -  
297 - paramModule.linkedNode.set('isParameter', true);  
298 -  
299 - if (values.size == 1) {  
300 - paramModule.linkedNode.set('iconCls', 'icon-scalar');  
301 - paramModule.linkedNode.set('isSpectra', false);  
302 - }  
303 - else {  
304 - if (values.plottype == 'Spectra') {  
305 - paramModule.linkedNode.set('isSpectra', true);  
306 - paramModule.linkedNode.set('iconCls', 'icon-spectra');  
307 - }  
308 - else {  
309 - paramModule.linkedNode.set('iconCls', 'icon-unknowntype');  
310 - paramModule.linkedNode.set('isSpectra', false);  
311 - }  
312 - }  
313 -  
314 - } else {  
315 - paramModule.linkedNode.set('contextNode',paramModule.contextNode);  
316 - paramModule.linkedNode.update();  
317 - }  
318 - }, 256 + // first *
  257 + if (value.indexOf('*') === 0) return '"*" could not be the first letter in mask';
  258 +
  259 + // several *
  260 + if (value.indexOf('*') !== value.lastIndexOf('*')) return 'several "*" are not allowed in mask';
  261 +
  262 + // less common
  263 + var paramModule = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.my_data.id);
  264 + var oldmask = paramModule.linkedNode.get('object').get('mask');
  265 + // no old mask
  266 + if (oldmask.length === 0) return true;
  267 + if (value.length > oldmask.length) return 'new mask is less common than old one';
  268 +
  269 + return true;
  270 + },
  271 +
  272 + /*
  273 + * save parameter
  274 + */
  275 + saveProcess : function(toRename)
  276 + {
  277 + var values = this.down('form').getForm().getValues();
  278 + // Parameter Module
  279 + var paramModule = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.my_data.id);
  280 +
  281 + // if the name has been modified this is a creation
  282 + if (this.object.isModified('name'))
  283 + {
  284 + var contextNode = paramModule.linkedNode.parentNode;
  285 + // if object already has an id : it's a 'rename' of an existing
  286 + if (this.object.get('id'))
  287 + {
  288 + // get file object of the first node linked this file
  289 + var fileObject = paramModule.linkedNode.get('fileObject');
  290 +
  291 + paramModule.createLinkedNode();
  292 + // create a new object linked
  293 + var paramobj = Ext.create(paramModule.linkedNode.get('objectDataModel'), values);
  294 +
  295 + paramobj.set('format', this.fileObject.get('format'));
  296 + if (paramobj.get('format') == 'cdf' || paramobj.get('format') == 'cef' ||
  297 + paramobj.get('format') == 'nc')
  298 + paramobj.set('realvar',values.cdfvar);
  299 + if (paramobj.get('format') == 'vot')
  300 + paramobj.set('realvar',values.votvar);
  301 + if (paramobj.get('format') == 'txt')
  302 + paramobj.set('realvar',values.start);
  303 +
  304 + paramobj.set('file', this.fileObject.get('fileName'));
  305 +
  306 + paramobj.set('tableDef', this.getPlugin('tabledef').getTableDefinitionObject());
  307 +
  308 + paramModule.linkedNode.set('object',paramobj);
  309 + //synchronize objects
  310 + this.object = paramobj;
  311 +
  312 + paramModule.linkedNode.set('fileObject',fileObject);
  313 +
  314 + if (toRename)
  315 + paramModule.linkedNode.toRename = true;
  316 + }
  317 + paramModule.linkedNode.set('contextNode',contextNode);
  318 + paramModule.linkedNode.create();
  319 +
  320 + paramModule.linkedNode.set('isParameter', true);
  321 +
  322 + if (values.size == 1) {
  323 + paramModule.linkedNode.set('iconCls', 'icon-scalar');
  324 + paramModule.linkedNode.set('isSpectra', false);
  325 + }
  326 + else if (values.size == 3) {
  327 + paramModule.linkedNode.set('iconCls', 'icon-vector');
  328 + paramModule.linkedNode.set('isSpectra', false);
  329 + }
  330 + else {
  331 + if (values.plottype == 'Spectra') {
  332 + paramModule.linkedNode.set('isSpectra', true);
  333 + paramModule.linkedNode.set('iconCls', 'icon-spectra');
  334 + }
  335 + else {
  336 + paramModule.linkedNode.set('iconCls', 'icon-unknowntype');
  337 + paramModule.linkedNode.set('isSpectra', false);
  338 + }
  339 + }
  340 + } else {
  341 + paramModule.linkedNode.set('contextNode',paramModule.contextNode);
  342 + paramModule.linkedNode.update();
  343 + }
  344 + },
319 345
320 - /*  
321 - * overwrite method called by Save button  
322 - */  
323 - overwriteProcess : function(btn){  
324 - if (btn == 'cancel') return;  
325 - var basicForm = this.down('form').getForm();  
326 - basicForm.clearInvalid();  
327 - this.saveProcess(true);  
328 - },  
329 -  
330 - updateForm : function() {  
331 - var basicForm = this.down('form').getForm();  
332 - var columns = this.down('gridpanel').columns;  
333 -  
334 - var start;  
335 - var size = 0;  
336 - Ext.Array.each(columns, function(column,index){  
337 - if (!start && column.selected) start = index;  
338 - if (column.selected) size += 1;  
339 - });  
340 -  
341 - basicForm.setValues({start: start, size : size});  
342 - }, 346 + /*
  347 + * overwrite method called by Save button
  348 + */
  349 + overwriteProcess : function(btn){
  350 + if (btn == 'cancel') return;
  351 + var basicForm = this.down('form').getForm();
  352 + basicForm.clearInvalid();
  353 + this.saveProcess(true);
  354 + },
  355 +
  356 + updateForm : function() {
  357 + var basicForm = this.down('form').getForm();
  358 + var columns = this.down('gridpanel').columns;
  359 +
  360 + var start;
  361 + var size = 0;
  362 + Ext.Array.each(columns, function(column,index){
  363 + if (!start && column.selected) start = index;
  364 + if (column.selected) size += 1;
  365 + });
  366 +
  367 + basicForm.setValues({start: start, size : size});
  368 + },
343 369
344 - /*  
345 - * Configurations  
346 - *  
347 - */  
348 - initPanel : function()  
349 - {  
350 - var format = this.fileObject.get('format');  
351 - if (format == 'cdf' || format == 'cef' || format == 'nc') return this.cdfPanel(format);  
352 - if (format == 'txt') return this.txtPanel();  
353 - if (format == 'vot') return this.votPanel();  
354 - }, 370 + /*
  371 + * Configurations
  372 + *
  373 + */
  374 + initPanel : function()
  375 + {
  376 + var format = this.fileObject.get('format');
  377 + if (format == 'cdf' || format == 'cef' || format == 'nc') return this.cdfPanel(format);
  378 + if (format == 'txt') return this.txtPanel();
  379 + if (format == 'vot') return this.votPanel();
  380 + },
  381 +
  382 + txtPanel: function()
  383 + {
  384 + var fileName = this.fileObject.get('fileName');
355 385
356 - txtPanel: function()  
357 - {  
358 - var fileName = this.fileObject.get('fileName');  
359 -  
360 - //FOR INFO  
361 - // Null out built in convert functions for performance *because the raw data is known to be valid*  
362 - // Specifying defaultValue as undefined will also save code.  
363 - // As long as there will always be values in the data, or the app tolerates undefined field values*  
364 -  
365 - // Dynamically created fields and columns  
366 - var n_col = this.fileObject.get('vars');  
367 - // reset  
368 - this.fields = [];  
369 - this.columns = []; 386 + //FOR INFO
  387 + // Null out built in convert functions for performance *because the raw data is known to be valid*
  388 + // Specifying defaultValue as undefined will also save code.
  389 + // As long as there will always be values in the data, or the app tolerates undefined field values*
  390 +
  391 + // Dynamically created fields and columns
  392 + var n_col = this.fileObject.get('vars');
  393 + // reset
  394 + this.fields = [];
  395 + this.columns = [];
370 396
371 - for (var i = 0; i < n_col; i++){  
372 - var name = i === 0 ? 'Time' : 'n'+i;  
373 - //TODO width dependent on data?  
374 - var width = i === 0 ? 120 : 75;  
375 -  
376 - this.fields[i] = { name: name };  
377 - this.columns[i] = { text: name, sortable : false, dataIndex: name, width : width,  
378 - menuDisabled: true, selected : false,  
379 - listeners: {  
380 - scope : this,  
381 - headerclick: function(ct, column){  
382 - if (column.text != 'Time') {  
383 - var selected = Ext.select(column.getCellSelector(1));  
384 - if (column.selected) {  
385 - selected.removeCls('meow');  
386 - column.selected = false;  
387 - }  
388 - else {  
389 - selected.addCls('meow');  
390 - column.selected = true;  
391 - }  
392 - this.updateForm();  
393 - }  
394 - }  
395 - }  
396 - };  
397 - }  
398 -  
399 - // Dynamically created model  
400 - Ext.define('myData', {  
401 - extend: 'Ext.data.Model',  
402 - fields: this.fields,  
403 - idProperty: 'Time'  
404 - });  
405 -  
406 - var store = Ext.create('Ext.data.ArrayStore', {  
407 - model: 'myData',  
408 - autoLoad: true,  
409 - proxy: {  
410 - type: 'direct',  
411 - directFn: AmdaAction.getAsciiFile  
412 - },  
413 - listeners: {  
414 - scope: this,  
415 - beforeload: function(store){  
416 - store.proxy.extraParams = {  
417 - fileName: this.fileObject.get('fileName')  
418 - };  
419 - },  
420 - load: function(store, records, successful, eOpts) {  
421 - this.updateSelection();  
422 - }  
423 - }  
424 - }); 397 + for (var i = 0; i < n_col; i++)
  398 + {
  399 + var name = i === 0 ? 'Time' : 'n'+i;
  400 + //TODO width dependent on data?
  401 + var width = i === 0 ? 120 : 75;
  402 +
  403 + this.fields[i] = { name: name };
  404 + this.columns[i] = { text: name, sortable : false, dataIndex: name, width : width,
  405 + menuDisabled: true, selected : false,
  406 + listeners:
  407 + {
  408 + scope : this,
  409 + headerclick: function(ct, column)
  410 + {
  411 + if (column.text != 'Time') {
  412 + var selected = Ext.select(column.getCellSelector(1));
  413 + if (column.selected) {
  414 + selected.removeCls('meow');
  415 + column.selected = false;
  416 + }
  417 + else {
  418 + selected.addCls('meow');
  419 + column.selected = true;
  420 + }
  421 + this.updateForm();
  422 + }
  423 + }
  424 + }
  425 + };
  426 + }
  427 +
  428 + // Dynamically created model
  429 + Ext.define('myData', {
  430 + extend: 'Ext.data.Model',
  431 + fields: this.fields,
  432 + idProperty: 'Time'
  433 + });
  434 +
  435 + var store = Ext.create('Ext.data.ArrayStore', {
  436 + model: 'myData',
  437 + autoLoad: true,
  438 + proxy: {
  439 + type: 'direct',
  440 + directFn: AmdaAction.getAsciiFile
  441 + },
  442 + listeners: {
  443 + scope: this,
  444 + beforeload: function(store){
  445 + store.proxy.extraParams = {
  446 + fileName: this.fileObject.get('fileName')
  447 + };
  448 + },
  449 + load: function(store, records, successful, eOpts) {
  450 + this.updateSelection();
  451 + }
  452 + }
  453 + });
425 454
426 - // Dynamically created columns dependent of myData model  
427 - var panelConfig = {  
428 - xtype : 'gridpanel',  
429 - store : store,  
430 - title : fileName,  
431 - height: '100%',  
432 - flex : 2,  
433 - columnLines: true,  
434 - columns: this.columns,  
435 - listeners: {  
436 - scope : this,  
437 - cellclick: function(view,td,cellIndex,record,tr,rowIndex,e){  
438 - var column = view.getGridColumns()[cellIndex];  
439 - if (cellIndex > 0) {  
440 - var selected = Ext.select(column.getCellSelector(cellIndex));  
441 - if (column.selected) {  
442 - selected.removeCls('meow');  
443 - column.selected = false;  
444 - }  
445 - else {  
446 - selected.addCls('meow');  
447 - column.selected = true;  
448 - }  
449 - this.updateForm();  
450 - }  
451 - },  
452 - select: function(selmodel, record, index, e) {  
453 - selmodel.deselectAll();  
454 - }  
455 - }  
456 - }; 455 + // Dynamically created columns dependent of myData model
  456 + var panelConfig = {
  457 + xtype : 'gridpanel',
  458 + store : store,
  459 + title : fileName,
  460 + height: '100%',
  461 + flex : 2,
  462 + columnLines: true,
  463 + columns: this.columns,
  464 + listeners:
  465 + {
  466 + scope : this,
  467 + cellclick: function(view,td,cellIndex,record,tr,rowIndex,e)
  468 + {
  469 + var column = view.getGridColumns()[cellIndex];
  470 + if (cellIndex > 0) {
  471 + var selected = Ext.select(column.getCellSelector(cellIndex));
  472 + if (column.selected) {
  473 + selected.removeCls('meow');
  474 + column.selected = false;
  475 + }
  476 + else {
  477 + selected.addCls('meow');
  478 + column.selected = true;
  479 + }
  480 + this.updateForm();
  481 + }
  482 + },
  483 + select: function(selmodel, record, index, e) {
  484 + selmodel.deselectAll();
  485 + }
  486 + }
  487 + };
457 488
458 - return panelConfig;  
459 - }, 489 + return panelConfig;
  490 + },
460 491
461 - cdfPanel : function(format) {  
462 -  
463 - var vars = this.fileObject.get('vars');  
464 - var fileName = this.fileObject.get('fileName');  
465 - var items = [];  
466 - Ext.Array.each(vars, function(name, index) {  
467 - if (name) {  
468 - items[index] = { boxLabel: name, name: 'cdfvar', inputValue: name,  
469 - listeners: {  
470 - scope: this,  
471 - change: function (cb, nv, ov) {  
472 - if (nv) {  
473 - AmdaAction.getMyParamInfo({format: format, file : fileName, varName : cb.inputValue},  
474 - this.updateInfo, this);  
475 - }  
476 - }  
477 - }  
478 - }  
479 - }  
480 - }, this); 492 + cdfPanel : function(format)
  493 + {
  494 + var vars = this.fileObject.get('vars');
  495 + var fileName = this.fileObject.get('fileName');
  496 + var items = [];
  497 + Ext.Array.each(vars, function(name, index) {
  498 + if (name) {
  499 + items[index] = { boxLabel: name, name: 'cdfvar', inputValue: name }
  500 + }
  501 + }, this);
481 502
482 var panelConfig = { 503 var panelConfig = {
483 xtype : 'fieldset', 504 xtype : 'fieldset',
@@ -491,39 +512,49 @@ Ext.define(&#39;amdaUI.MyDataUI&#39;, { @@ -491,39 +512,49 @@ Ext.define(&#39;amdaUI.MyDataUI&#39;, {
491 cls: 'x-check-group-alt', 512 cls: 'x-check-group-alt',
492 columns: 2, 513 columns: 2,
493 vertical: true, 514 vertical: true,
494 - items: items 515 + items: items,
  516 + listeners : {
  517 + scope: this,
  518 + change: function (cb, nv, ov) {
  519 + if (nv.cdfvar) {
  520 + AmdaAction.getMyParamInfo({format: format, file : fileName, varName : nv.cdfvar},
  521 + this.updateInfo, this);
  522 + }
  523 + }
  524 + }
495 }] 525 }]
496 }; 526 };
497 527
498 return panelConfig; 528 return panelConfig;
499 }, 529 },
500 530
501 - votPanel : function()  
502 - {  
503 - var vars = this.fileObject.get('vars');  
504 - var fileName = this.fileObject.get('fileName');  
505 -  
506 - var items = [];  
507 -  
508 - if (this.fileObject.get('foundTime'))  
509 - {  
510 - Ext.Array.each(vars, function(obj, index) {  
511 - items[index] = { boxLabel: obj.name, name: 'votvar', inputValue: obj.id,  
512 - listeners: {  
513 - scope: this,  
514 - change: function (cb, nv, ov) {  
515 - if (nv) {  
516 - AmdaAction.getMyParamInfo({format: 'vot', file : fileName, varName : cb.inputValue},  
517 - this.updateInfo, this);  
518 - }  
519 - }  
520 - }  
521 - };  
522 - }, this);  
523 - }  
524 - else  
525 - myDesktopApp.errorMsg("Cannot find a valid time field!");  
526 - 531 + votPanel : function()
  532 + {
  533 + var vars = this.fileObject.get('vars');
  534 + var fileName = this.fileObject.get('fileName');
  535 +
  536 + var items = [];
  537 +
  538 + if (this.fileObject.get('foundTime'))
  539 + {
  540 + Ext.Array.each(vars, function(obj, index) {
  541 + items[index] = { boxLabel: obj.name, name: 'votvar', inputValue: obj.id,
  542 + listeners:
  543 + {
  544 + scope: this,
  545 + change: function (cb, nv, ov) {
  546 + if (nv) {
  547 + AmdaAction.getMyParamInfo({format: 'vot', file : fileName, varName : cb.inputValue},
  548 + this.updateInfo, this);
  549 + }
  550 + }
  551 + }
  552 + };
  553 + }, this);
  554 + }
  555 + else
  556 + myDesktopApp.errorMsg("Cannot find a valid time field!");
  557 +
527 var panelConfig = { 558 var panelConfig = {
528 xtype : 'fieldset', 559 xtype : 'fieldset',
529 bodyStyle: { background : '#dfe8f6'}, 560 bodyStyle: { background : '#dfe8f6'},
@@ -555,305 +586,314 @@ Ext.define(&#39;amdaUI.MyDataUI&#39;, { @@ -555,305 +586,314 @@ Ext.define(&#39;amdaUI.MyDataUI&#39;, {
555 ] 586 ]
556 }); 587 });
557 588
558 - var combo = {  
559 - xtype: 'combo',  
560 - fieldLabel: 'Parameter Data Type',  
561 - store: store,  
562 - queryMode: 'local',  
563 - displayField: 'name',  
564 - valueField: 'value',  
565 - name: 'type',  
566 - editable: false,  
567 - value: 'FLOAT'  
568 - }; 589 + var combo = {
  590 + xtype: 'combo',
  591 + fieldLabel: 'Parameter Data Type',
  592 + store: store,
  593 + queryMode: 'local',
  594 + displayField: 'name',
  595 + valueField: 'value',
  596 + name: 'type',
  597 + editable: false,
  598 + value: 'FLOAT'
  599 + };
569 600
570 - var store1 = Ext.create('Ext.data.Store', {  
571 - fields: ['value', 'name'],  
572 - data : [  
573 - {"value": "TimeSerie", "name":"Time Serie"},  
574 - {"value": "Spectra", "name":"Spectra"}  
575 - ]  
576 - }); 601 + var store1 = Ext.create('Ext.data.Store', {
  602 + fields: ['value', 'name'],
  603 + data : [
  604 + {"value": "TimeSerie", "name":"Time Serie"},
  605 + {"value": "Spectra", "name":"Spectra"}
  606 + ]
  607 + });
577 608
578 - var comboPlotType = {  
579 - xtype: 'combo',  
580 - fieldLabel: 'Display Type',  
581 - store: store1,  
582 - queryMode: 'local',  
583 - displayField: 'name',  
584 - valueField: 'value',  
585 - name: 'plottype',  
586 - editable: false,  
587 - value: 'Time Series'  
588 - };  
589 -  
590 - var notTxt = false; //this.fileObject.get('format') !== 'txt';  
591 - // var maxSize = notTxt? 100 : this.columns.length - 1;  
592 -  
593 - // Parameter Form  
594 - var panelLeft = {  
595 - bodyStyle: { background : '#dfe8f6'},  
596 - flex : 1,  
597 - defaults: {  
598 - xtype:'textfield',  
599 - validateOnChange: false,  
600 - validateOnBlur: false,  
601 - padding : '0 10 0 5',  
602 - inputWidth : 80  
603 - },  
604 - items: [  
605 - {  
606 - id: 'mydataName',  
607 - fieldLabel: 'Parameter Name',  
608 - labelAlign: 'top',  
609 - name: 'name',  
610 - allowBlank : false,  
611 - stripCharsRe: /(^\s+|\s+$)/g,  
612 - validFlag: false,  
613 - validator : function() {  
614 - return this.validFlag;  
615 - },  
616 - inputWidth : 180  
617 - }, {  
618 - fieldLabel: 'File Name/Mask&nbsp;<img amda_clicktip="fileMask" style="vertical-align:bottom" src="js/resources/images/16x16/info_mini.png"',  
619 - labelAlign: 'top',  
620 - name: 'mask',  
621 - inputWidth : 180,  
622 - validator : this.validateMask  
623 - }, combo, {  
624 - xtype:'numberfield',  
625 - fieldLabel: 'Parameter Start Position',  
626 - name: 'start',  
627 - disabled: notTxt,  
628 - minValue : 1,  
629 - // maxValue : maxSize,  
630 - listeners : {  
631 - scope : this,  
632 - change : function(field, newValue, oldValue){  
633 - var grid = this.down('gridpanel');  
634 - if (!grid) return;  
635 - if (newValue && newValue != oldValue) {  
636 - var size = field.prev().value;  
637 - var columns = grid.columns;  
638 - Ext.Array.each(columns, function(column,index){  
639 - var selected = Ext.select(column.getCellSelector(index));  
640 - if (index < newValue){  
641 - if (column.selected) {  
642 - selected.removeCls('meow');  
643 - column.selected = false;  
644 - }  
645 - }  
646 - else if (index == newValue) {  
647 - if (!column.selected) {  
648 - selected.addCls('meow');  
649 - column.selected = true;  
650 - }  
651 - }  
652 - else {  
653 - if (column.selected) {  
654 - selected.removeCls('meow');  
655 - column.selected = false;  
656 - }  
657 - }  
658 - });  
659 - }  
660 - }  
661 - }  
662 - }, {  
663 - xtype:'numberfield',  
664 - fieldLabel: 'Parameter Size',  
665 - name: 'size',  
666 - minValue: 1,  
667 - // maxValue : maxSize,  
668 - disabled: notTxt,  
669 - listeners : {  
670 - scope : this,  
671 - change : function(field, newValue, oldValue){  
672 - var grid = this.down('gridpanel');  
673 - if (!grid) return;  
674 - var start = field.prev().value;  
675 - var columns = grid.columns;  
676 - Ext.Array.each(columns, function(column,index){  
677 - var selected = Ext.select(column.getCellSelector(index));  
678 - if (index <= start) {}  
679 - else if (index - start < newValue) {  
680 - if (!column.selected){  
681 - selected.addCls('meow');  
682 - column.selected = true;  
683 - }  
684 - }  
685 - else {  
686 - if (column.selected){  
687 - selected.removeCls('meow');  
688 - column.selected = false;  
689 - }  
690 - }  
691 - });  
692 - }  
693 - }  
694 - }, {  
695 - xtype:'numberfield',  
696 - fieldLabel: 'Min Sampling',  
697 - name: 'minsampling'//,  
698 - // disabled: notTxt  
699 - },{  
700 - xtype:'numberfield',  
701 - fieldLabel: 'Max Sampling',  
702 - name: 'maxsampling'//,  
703 - // disabled: notTxt  
704 - },{  
705 - fieldLabel: 'Filling Value',  
706 - name: 'fillvalue'  
707 - },{  
708 - fieldLabel: 'Units',  
709 - name: 'units'  
710 - }, comboPlotType, {  
711 - fieldLabel: 'Y Title',  
712 - name: 'ytitle'  
713 - },{  
714 - fieldLabel: 'Legend',  
715 - name: 'legend'  
716 - }  
717 - ],  
718 - listeners: {  
719 - click: {  
720 - element: 'el',  
721 - fn: function(e,t) {  
722 - var me = t,  
723 - text = me.getAttribute('amda_clicktip');  
724 - if (text) {  
725 - e.preventDefault();  
726 - AmdaAction.getInfo({name : text}, function(res,e) {  
727 - if (res.success) myDesktopApp.infoMsg(res.result);  
728 - });  
729 - }  
730 - }  
731 - }  
732 - }  
733 - };  
734 -  
735 - var myConf = {  
736 - layout: 'border',  
737 - items: [ {  
738 - xtype : 'form',  
739 - bodyStyle: { background : '#dfe8f6'},  
740 - layout: 'hbox',  
741 - region: 'center',  
742 - buttonAlign:'left',  
743 - items : [  
744 - panelLeft  
745 - ],  
746 - buttons: [  
747 - {  
748 - scope : this,  
749 - text: 'Show/Hide Table definition',  
750 - handler: function()  
751 - {  
752 - this.getPlugin('tabledef').showHide();  
753 - }  
754 - },  
755 - '->',  
756 - {  
757 - scope : this,  
758 - text: 'Save',  
759 - handler: function()  
760 - {  
761 - var form = this.down('form').getForm();  
762 - // check if variable was selected  
763 - // cdf,...  
764 - var radio = this.down('radiogroup');  
765 - if (radio && radio.getChecked().length == 0) {  
766 - myDesktopApp.warningMsg('Select variable from the file, please');  
767 - return;  
768 - }  
769 - // ascii  
770 - if (!radio && this.columns.length > 0) {  
771 - if (!form.findField('start').getValue() || !form.findField('size').getValue()) {  
772 - myDesktopApp.warningMsg('Select column[s] from the file, please');  
773 - return;  
774 - }  
775 - }  
776 - var nameField = form.findField('mydataName');  
777 - if (this.updateObject(nameField))  
778 - {  
779 - var myDataModule = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.my_data.id);  
780 - if (!myDataModule)  
781 - return;  
782 - var me = this;  
783 - myDataModule.linkedNode.isValidName(nameField.getValue(), function (res) {  
784 - if (!res)  
785 - {  
786 - nameField.validFlag = 'Error during object validation';  
787 - myDesktopApp.errorMsg(nameField.validFlag);  
788 - nameField.validate();  
789 - return;  
790 - }  
791 -  
792 - if (!res.valid)  
793 - {  
794 - if (res.error)  
795 - {  
796 - if (res.error.search('subtree') != -1) {  
797 - Ext.MessageBox.show({title:'Warning',  
798 - msg: res.error+'<br/>Do you want to overwrite it?',  
799 - width: 300,  
800 - buttons: Ext.MessageBox.OKCANCEL,  
801 - fn : me.overwriteProcess,  
802 - icon: Ext.MessageBox.WARNING,  
803 - scope : me  
804 - });  
805 - nameField.validFlag = true;  
806 - }  
807 - else  
808 - nameField.validFlag = res.error;  
809 - }  
810 - else  
811 - {  
812 - nameField.validFlag = 'Invalid object name';  
813 - myDesktopApp.errorMsg(nameField.validFlag);  
814 - }  
815 - nameField.validate();  
816 - return;  
817 - }  
818 -  
819 - nameField.validFlag = true;  
820 - nameField.validate();  
821 - me.saveProcess();  
822 - });  
823 - }  
824 - }  
825 - },{  
826 - scope : this,  
827 - text: 'Reset',  
828 - handler: function(){  
829 - this.down('form').getForm().reset();  
830 - }  
831 - }]  
832 - },{  
833 - xtype: 'panel',  
834 - region: 'south',  
835 - title: 'Information',  
836 - collapsible: true,  
837 - collapseMode: 'header',  
838 - height: 100,  
839 - autoHide: false,  
840 - iconCls: 'icon-information',  
841 - bodyStyle: 'padding:5px',  
842 - loader: {  
843 - autoLoad: true,  
844 - url: helpDir+'myDataHOWTO'  
845 - }  
846 - }  
847 - ],  
848 - plugins: [ {ptype: 'tabledef', pluginId: 'tabledef'} ]  
849 - };  
850 -  
851 - Ext.apply (this, Ext.apply(arguments, myConf));  
852 - },  
853 -  
854 - getParameterSize : function()  
855 - {  
856 - var form = this.down('form').getForm();  
857 - return form.findField('size').getValue();  
858 - } 609 + var comboPlotType = {
  610 + xtype: 'combo',
  611 + fieldLabel: 'Display Type',
  612 + store: store1,
  613 + queryMode: 'local',
  614 + displayField: 'name',
  615 + valueField: 'value',
  616 + name: 'plottype',
  617 + editable: false,
  618 + value: 'Time Series'
  619 + };
  620 +
  621 + // Parameter Form
  622 + var panelLeft = {
  623 + bodyStyle: { background : '#dfe8f6'},
  624 + flex : 1,
  625 + defaults: {
  626 + xtype:'textfield',
  627 + validateOnChange: false,
  628 + validateOnBlur: false,
  629 + padding : '0 10 0 5',
  630 + inputWidth : 80
  631 + },
  632 + items: [
  633 + {
  634 + id: 'mydataName',
  635 + fieldLabel: 'Parameter Name',
  636 + labelAlign: 'top',
  637 + name: 'name',
  638 + allowBlank : false,
  639 + stripCharsRe: /(^\s+|\s+$)/g,
  640 + validFlag: false,
  641 + validator : function() {
  642 + return this.validFlag;
  643 + },
  644 + inputWidth : 180
  645 + },
  646 + {
  647 + fieldLabel: 'File Name/Mask&nbsp;<img amda_clicktip="fileMask" style="vertical-align:bottom" src="js/resources/images/16x16/info_mini.png"',
  648 + labelAlign: 'top',
  649 + name: 'mask',
  650 + inputWidth : 180,
  651 + validator : this.validateMask
  652 + },
  653 + combo,
  654 + {
  655 + xtype:'numberfield',
  656 + fieldLabel: 'Parameter Start Position',
  657 + name: 'start',
  658 + minValue : 1,
  659 + // maxValue : maxSize,
  660 + listeners :
  661 + {
  662 + scope : this,
  663 + change : function(field, newValue, oldValue){
  664 + var grid = this.down('gridpanel');
  665 + if (!grid) return;
  666 + if (newValue && newValue != oldValue)
  667 + {
  668 + var size = field.prev().value;
  669 + var columns = grid.columns;
  670 + Ext.Array.each(columns, function(column,index){
  671 + var selected = Ext.select(column.getCellSelector(index));
  672 + if (index < newValue)
  673 + {
  674 + if (column.selected) {
  675 + selected.removeCls('meow');
  676 + column.selected = false;
  677 + }
  678 + }
  679 + else if (index == newValue) {
  680 + if (!column.selected) {
  681 + selected.addCls('meow');
  682 + column.selected = true;
  683 + }
  684 + }
  685 + else {
  686 + if (column.selected) {
  687 + selected.removeCls('meow');
  688 + column.selected = false;
  689 + }
  690 + }
  691 + });
  692 + }
  693 + }
  694 + }
  695 + },
  696 + {
  697 + xtype:'numberfield',
  698 + fieldLabel: 'Parameter Size',
  699 + name: 'size',
  700 + minValue: 1,
  701 + // maxValue : maxSize,
  702 + listeners :
  703 + {
  704 + scope : this,
  705 + change : function(field, newValue, oldValue){
  706 + var grid = this.down('gridpanel');
  707 + if (!grid) return;
  708 + var start = field.prev().value;
  709 + var columns = grid.columns;
  710 + Ext.Array.each(columns, function(column,index){
  711 + var selected = Ext.select(column.getCellSelector(index));
  712 + if (index <= start) {}
  713 + else if (index - start < newValue) {
  714 + if (!column.selected){
  715 + selected.addCls('meow');
  716 + column.selected = true;
  717 + }
  718 + }
  719 + else {
  720 + if (column.selected){
  721 + selected.removeCls('meow');
  722 + column.selected = false;
  723 + }
  724 + }
  725 + });
  726 + }
  727 + }
  728 + },
  729 + {
  730 + xtype:'numberfield',
  731 + fieldLabel: 'Min Sampling',
  732 + name: 'minsampling'
  733 + },
  734 + {
  735 + xtype:'numberfield',
  736 + fieldLabel: 'Max Sampling',
  737 + name: 'maxsampling'
  738 + },
  739 + {
  740 + fieldLabel: 'Filling Value',
  741 + name: 'fillvalue'
  742 + },
  743 + {
  744 + fieldLabel: 'Units',
  745 + name: 'units'
  746 + },
  747 + comboPlotType,
  748 + {
  749 + fieldLabel: 'Y Title',
  750 + name: 'ytitle'
  751 + },
  752 + {
  753 + fieldLabel: 'Legend',
  754 + name: 'legend'
  755 + }],
  756 + listeners:
  757 + {
  758 + click: {
  759 + element: 'el',
  760 + fn: function(e,t) {
  761 + var me = t,
  762 + text = me.getAttribute('amda_clicktip');
  763 + if (text) {
  764 + e.preventDefault();
  765 + AmdaAction.getInfo({name : text}, function(res,e) {
  766 + if (res.success) myDesktopApp.infoMsg(res.result);
  767 + });
  768 + }
  769 + }
  770 + }
  771 + }
  772 + };
  773 +
  774 + var myConf = {
  775 + layout: 'border',
  776 + items: [
  777 + {
  778 + xtype : 'form',
  779 + bodyStyle: { background : '#dfe8f6'},
  780 + layout: 'hbox',
  781 + region: 'center',
  782 + buttonAlign:'left',
  783 + items : [
  784 + panelLeft
  785 + ],
  786 + buttons: [
  787 + {
  788 + scope : this,
  789 + text: 'Show/Hide Table definition',
  790 + handler: function()
  791 + {
  792 + this.getPlugin('tabledef').showHide();
  793 + }
  794 + },
  795 + '->',
  796 + {
  797 + scope : this,
  798 + text: 'Save',
  799 + handler: function()
  800 + {
  801 + var form = this.down('form').getForm();
  802 + // check if variable was selected
  803 + // cdf,...
  804 + var radio = this.down('radiogroup');
  805 + if (radio && radio.getChecked().length == 0) {
  806 + myDesktopApp.warningMsg('Select variable from the file, please');
  807 + return;
  808 + }
  809 + // ascii
  810 + if (!radio && this.columns.length > 0) {
  811 + if (!form.findField('start').getValue() || !form.findField('size').getValue()) {
  812 + myDesktopApp.warningMsg('Select column[s] from the file, please');
  813 + return;
  814 + }
  815 + }
  816 + var nameField = form.findField('mydataName');
  817 + if (this.updateObject(nameField))
  818 + {
  819 + var myDataModule = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.my_data.id);
  820 + if (!myDataModule)
  821 + return;
  822 + var me = this;
  823 + myDataModule.linkedNode.isValidName(nameField.getValue(), function (res) {
  824 + if (!res) {
  825 + nameField.validFlag = 'Error during object validation';
  826 + myDesktopApp.errorMsg(nameField.validFlag);
  827 + nameField.validate();
  828 + return;
  829 + }
  830 +
  831 + if (!res.valid)
  832 + {
  833 + if (res.error)
  834 + {
  835 + if (res.error.search('subtree') != -1) {
  836 + Ext.MessageBox.show({title:'Warning',
  837 + msg: res.error+'<br/>Do you want to overwrite it?',
  838 + width: 300,
  839 + buttons: Ext.MessageBox.OKCANCEL,
  840 + fn : me.overwriteProcess,
  841 + icon: Ext.MessageBox.WARNING,
  842 + scope : me
  843 + });
  844 + nameField.validFlag = true;
  845 + }
  846 + else
  847 + nameField.validFlag = res.error;
  848 + }
  849 + else
  850 + {
  851 + nameField.validFlag = 'Invalid object name';
  852 + myDesktopApp.errorMsg(nameField.validFlag);
  853 + }
  854 + nameField.validate();
  855 + return;
  856 + }
  857 +
  858 + nameField.validFlag = true;
  859 + nameField.validate();
  860 + me.saveProcess();
  861 + });
  862 + }
  863 + }
  864 + },
  865 + {
  866 + scope : this,
  867 + text: 'Reset',
  868 + handler: function(){
  869 + this.down('form').getForm().reset();
  870 + }
  871 + }]
  872 + },
  873 + {
  874 + xtype: 'panel',
  875 + region: 'south',
  876 + title: 'Information',
  877 + collapsible: true,
  878 + height: 100,
  879 + autoHide: false,
  880 + iconCls: 'icon-information',
  881 + bodyStyle: 'padding:5px',
  882 + loader: {
  883 + autoLoad: true,
  884 + url: helpDir+'myDataHOWTO'
  885 + }
  886 + }],
  887 +
  888 + plugins: [ {ptype: 'tabledef', pluginId: 'tabledef'} ]
  889 + };
  890 +
  891 + Ext.apply (this, Ext.apply(arguments, myConf));
  892 + },
  893 +
  894 + getParameterSize : function()
  895 + {
  896 + var form = this.down('form').getForm();
  897 + return form.findField('size').getValue();
  898 + }
859 }); 899 });
js/app/views/RemoteSearchPlugin.js
1 /** 1 /**
2 * Project  : AMDA-NG 2 * Project  : AMDA-NG
3 * Name : RemoteSearchPlug.js 3 * Name : RemoteSearchPlug.js
4 - * @plugin amdaUI.InteractiveIntervalPlug  
5 - * @extends Ext.AbstractPlugin  
6 - * @ptype interactiveIntervalPlugin  
7 - * @brief Plot interactive session UI (View)  
8 - * @author Myriam  
9 - * @version $Id: RemoteSearchPlugin.js 1130 2012-12-18 16:45:54Z elena $  
10 - ********************************************************************************  
11 - * FT Id : Date : Name - Description  
12 - *******************************************************************************  
13 - * : 4 + * @plugin remoteSearchPlugin
  5 + * @extends Ext.AbstractPlugin
14 */ 6 */
15 7
16 8
@@ -22,93 +14,85 @@ Ext.define(&#39;amdaUI.RemoteSearchPlugin&#39;, { @@ -22,93 +14,85 @@ Ext.define(&#39;amdaUI.RemoteSearchPlugin&#39;, {
22 14
23 win : null, 15 win : null,
24 16
25 - constructor: function(config) {  
26 - Ext.apply(this, config);  
27 - this.callParent(arguments); 17 + constructor: function(config) {
  18 + Ext.apply(this, config);
  19 + this.callParent(arguments);
28 }, 20 },
29 21
30 22
31 init: function(cmp) { 23 init: function(cmp) {
32 - this.hostCmp = cmp;  
33 - this.hostCmp.on({  
34 - open: this.onOpen,  
35 - scope: this}); 24 + this.hostCmp = cmp;
  25 + this.hostCmp.on({
  26 + open: this.onOpen,
  27 + scope: this});
36 }, 28 },
37 - 29 +
38 onDestroy : function() { 30 onDestroy : function() {
39 - this.win = null; 31 + this.win = null;
40 }, 32 },
41 33
42 onOpen: function(url) { 34 onOpen: function(url) {
43 - //TODO just reloa dtree  
44 - if (this.win) this.win.destroy(); 35 + //TODO just reload tree
  36 + if (this.win) this.win.destroy();
45 37
46 if (!this.win) { 38 if (!this.win) {
47 - this.win = new Ext.Window({  
48 - id: 'remoteSearch-win',  
49 - width: 310,  
50 - height: 500,  
51 - title: url,  
52 - layout: 'fit',  
53 - constrain: true,  
54 - ghost: false,  
55 - items: this.getTree(url),  
56 - listeners: {  
57 - scope: this,  
58 - beforeclose: function(){  
59 - // Ext.PluginManager.unregister(this);  
60 - }  
61 - },  
62 - getConstrainVector: function(constrainTo){ 39 + this.win = new Ext.Window({
  40 + id: 'remoteSearch-win',
  41 + width: 310,
  42 + height: 500,
  43 + title: url,
  44 + layout: 'fit',
  45 + constrain: true,
  46 + ghost: false,
  47 + items: this.getTree(url),
  48 + getConstrainVector: function(constrainTo){
63 var me = this; 49 var me = this;
64 - if (me.constrain || me.constrainHeader) {  
65 - constrainTo = constrainTo || (me.floatParent && me.floatParent.getTargetEl()) || me.container || me.el.getScopeParent();  
66 - return (me.constrainHeader ? me.header.el : me.el).getConstrainVector(constrainTo);  
67 - }  
68 - }  
69 - });  
70 - this.win.on('destroy', this.onDestroy, this);  
71 -  
72 - // Ext.PluginManager.register(this);  
73 -  
74 - this.win.show();  
75 - } 50 + if (me.constrain || me.constrainHeader) {
  51 + constrainTo = constrainTo || (me.floatParent && me.floatParent.getTargetEl()) || me.container || me.el.getScopeParent();
  52 + return (me.constrainHeader ? me.header.el : me.el).getConstrainVector(constrainTo);
  53 + }
  54 + }
  55 + });
  56 + this.win.on('destroy', this.onDestroy, this);
  57 +
  58 + this.win.show();
  59 + }
76 }, 60 },
77 61
78 - getTree : function(url) {  
79 -  
80 - var store = Ext.create('Ext.data.TreeStore', {  
81 - model: 'amdaModel.AmdaNode',  
82 - root: {  
83 - text: url,  
84 - nodeType : 'url',  
85 - expanded: true  
86 - } ,  
87 - listeners: {  
88 - scope : this,  
89 - beforeload: function(store, operation){  
90 - store.proxy.extraParams = {  
91 - nodeType: 'url',  
92 - baseId: url  
93 - }}  
94 - } 62 + getTree : function(url)
  63 + {
  64 + var store = Ext.create('Ext.data.TreeStore', {
  65 + model: 'amdaModel.AmdaNode',
  66 + root: {
  67 + text: url,
  68 + nodeType : 'url',
  69 + expanded: true
  70 + } ,
  71 + listeners: {
  72 + scope : this,
  73 + beforeload: function(store, operation){
  74 + store.proxy.extraParams = {
  75 + nodeType: 'url',
  76 + baseId: url
  77 + }
  78 + }
  79 + }
  80 + });
95 81
96 - });  
97 -  
98 - var tree = Ext.create('Ext.tree.Panel', {  
99 - store: store,  
100 - listeners : {  
101 - scope : this,  
102 - itemdblclick: function(view, record, item, index, event){  
103 - event.stopEvent();  
104 - var form = this.hostCmp.down('form').next().getForm();  
105 - form.getFields().getAt(1).setValue(record.internalId); // internalId ??  
106 - this.win.destroy();  
107 - }  
108 - }  
109 - }); 82 + var tree = Ext.create('Ext.tree.Panel', {
  83 + store: store,
  84 + listeners : {
  85 + scope : this,
  86 + itemdblclick: function(view, record, item, index, event){
  87 + event.stopEvent();
  88 + var form = this.hostCmp.down('form').next().getForm();
  89 + form.getFields().getAt(1).setValue(record.internalId); // internalId ??
  90 + this.win.destroy();
  91 + }
  92 + }
  93 + });
110 94
111 - return tree; 95 + return tree;
112 } 96 }
113 97
114 }); 98 });
115 \ No newline at end of file 99 \ No newline at end of file
js/app/views/UploadPanelUI.js
@@ -15,15 +15,16 @@ Ext.define(&#39;amdaUI.UploadPanelUI&#39;, { @@ -15,15 +15,16 @@ Ext.define(&#39;amdaUI.UploadPanelUI&#39;, {
15 requires : [ 15 requires : [
16 'amdaUI.RemoteSearchPlugin' 16 'amdaUI.RemoteSearchPlugin'
17 ], 17 ],
18 -  
19 - isFile : true,  
20 - isTimeTable : false,  
21 - tmpNode : null,  
22 18
  19 + tmpNode : null,
  20 + specialItems : null,
  21 + formats : null,
  22 + localName : null,
  23 +
23 constructor: function(config) 24 constructor: function(config)
24 { 25 {
25 this.init(config); 26 this.init(config);
26 - this.callParent(arguments); 27 + this.callParent(arguments);
27 }, 28 },
28 29
29 /* 30 /*
@@ -39,8 +40,7 @@ Ext.define(&#39;amdaUI.UploadPanelUI&#39;, { @@ -39,8 +40,7 @@ Ext.define(&#39;amdaUI.UploadPanelUI&#39;, {
39 var me = this; 40 var me = this;
40 myDesktopApp.getLoadedModule(this.tmpNode.get('moduleId'), true, function (module){ 41 myDesktopApp.getLoadedModule(this.tmpNode.get('moduleId'), true, function (module){
41 // myData 42 // myData
42 - if (me.tmpNode.get('nodeType') == amdaModel.MyDataParamNode.nodeType)  
43 - { 43 + if (me.tmpNode.get('nodeType') == amdaModel.MyDataParamNode.nodeType) {
44 var linkedFile = Ext.create('amdaModel.MyDataNode', {leaf : true, text : me.tmpNode.get('text')}); 44 var linkedFile = Ext.create('amdaModel.MyDataNode', {leaf : true, text : me.tmpNode.get('text')});
45 45
46 linkedFile.create(result.mask, result.description, result.maskDesc); 46 linkedFile.create(result.mask, result.description, result.maskDesc);
@@ -53,37 +53,33 @@ Ext.define(&#39;amdaUI.UploadPanelUI&#39;, { @@ -53,37 +53,33 @@ Ext.define(&#39;amdaUI.UploadPanelUI&#39;, {
53 linkedFile.set('object',paramObj); 53 linkedFile.set('object',paramObj);
54 me.tmpNode.set('fileObject',paramObj); 54 me.tmpNode.set('fileObject',paramObj);
55 } 55 }
56 - else  
57 - { 56 + else {
58 // Time Table or Catalog 57 // Time Table or Catalog
59 var paramObj = Ext.create(me.tmpNode.get('objectDataModel'), result); 58 var paramObj = Ext.create(me.tmpNode.get('objectDataModel'), result);
60 59
61 paramObj.set('fromPlugin',true); 60 paramObj.set('fromPlugin',true);
62 - if (result.intervals)  
63 - { 61 + if (result.intervals) {
64 paramObj.set('intervals',result.intervals); 62 paramObj.set('intervals',result.intervals);
65 paramObj.set('nbIntervals',result.intervals.length); 63 paramObj.set('nbIntervals',result.intervals.length);
66 } 64 }
67 me.tmpNode.set('object',paramObj); 65 me.tmpNode.set('object',paramObj);
68 } 66 }
69 - if (module)  
70 - { 67 + if (module) {
71 module.setLinkedNode(me.tmpNode); 68 module.setLinkedNode(me.tmpNode);
72 module.linkedNode.editInModule(); 69 module.linkedNode.editInModule();
73 } 70 }
74 }); 71 });
75 } 72 }
76 - else  
77 - { 73 + else {
78 // EXCEPTION : parameter not found ! 74 // EXCEPTION : parameter not found !
79 myDesktopApp.errorMsg(t.action + "." + t.method + " : No parameter '"+this.tmpNode.get('text')+"' found!"); 75 myDesktopApp.errorMsg(t.action + "." + t.method + " : No parameter '"+this.tmpNode.get('text')+"' found!");
80 } 76 }
  77 +
81 loadMask.hide(); 78 loadMask.hide();
82 }, 79 },
83 80
84 /* 81 /*
85 * form validation 82 * form validation
86 -* TODO markInvalid()?  
87 */ 83 */
88 validate : function() 84 validate : function()
89 { 85 {
@@ -91,59 +87,43 @@ Ext.define(&#39;amdaUI.UploadPanelUI&#39;, { @@ -91,59 +87,43 @@ Ext.define(&#39;amdaUI.UploadPanelUI&#39;, {
91 87
92 if (values['filesrc'] == 'LOCAL') 88 if (values['filesrc'] == 'LOCAL')
93 { 89 {
94 - if (this.isFile) var locFile = this.getForm().findField('localFileName').getValue();  
95 - else if (this.isTimeTable) var locFile = this.getForm().findField('localTTName').getValue();  
96 - else var locFile = this.getForm().findField('localCatName').getValue();  
97 -  
98 - if (!locFile)  
99 - { 90 + var locFile = this.getForm().findField(this.localName).getValue();
  91 +
  92 + if (!locFile) {
100 myDesktopApp.warningMsg("Select File to Upload"); 93 myDesktopApp.warningMsg("Select File to Upload");
101 return false; 94 return false;
102 } 95 }
103 } 96 }
104 else 97 else
105 { 98 {
106 - if (!values['remoteFile'] && !values['remoteTT'] && !values['remoteCat'])  
107 - { 99 + if (!values['remoteFile'] && !values['remoteTT'] && !values['remoteCat']) {
108 myDesktopApp.warningMsg("Select File to Upload"); 100 myDesktopApp.warningMsg("Select File to Upload");
109 return false; 101 return false;
110 } 102 }
111 - } 103 + }
  104 +
112 return true; 105 return true;
113 }, 106 },
114 107
115 108
116 - //TODO proper parsing 109 +/*
  110 + * Upadte format if user didn't do this himself
  111 + */
117 updateFormat: function(value) 112 updateFormat: function(value)
118 { 113 {
119 var arrayOfStr = value.split('.'); 114 var arrayOfStr = value.split('.');
120 - //TODO use down method?  
121 - if (this.isFile)  
122 - {  
123 - var radios = Ext.getCmp('filefrmt');  
124 - var user_format_obj = radios.getValue();  
125 - var user_format = user_format_obj.filefrmt;  
126 - }  
127 - else if (this.isTimeTable)  
128 - {  
129 - var radios = Ext.getCmp('ttfrmt');  
130 - var user_format_obj = radios.getValue();  
131 - var user_format = user_format_obj.ttfrmt;  
132 - }  
133 - else  
134 - {  
135 - var radios = Ext.getCmp('catfrmt');  
136 - var user_format_obj = radios.getValue();  
137 - var user_format = user_format_obj.catfrmt;  
138 - }  
139 -  
140 - var auto_format = user_format; 115 +
  116 + var radios = Ext.getCmp(this.radioId);
  117 + var user_format_obj = radios.getValue();
  118 +
  119 + var user_format = user_format_obj[this.radioId];
141 120
142 // auto define format in some special cases 121 // auto define format in some special cases
143 //TODO name without extention => ASCII? 122 //TODO name without extention => ASCII?
144 - if (arrayOfStr.length == 1) auto_format = 'ASCII';  
145 - else  
146 - { 123 + if (arrayOfStr.length == 1) {
  124 + auto_format = 'ASCII';
  125 + }
  126 + else {
147 var suffix = arrayOfStr[arrayOfStr.length - 1].toLowerCase(); 127 var suffix = arrayOfStr[arrayOfStr.length - 1].toLowerCase();
148 if (suffix == 'gz') 128 if (suffix == 'gz')
149 suffix = arrayOfStr[arrayOfStr.length - 2].toLowerCase() + '.gz'; 129 suffix = arrayOfStr[arrayOfStr.length - 2].toLowerCase() + '.gz';
@@ -155,35 +135,30 @@ Ext.define(&#39;amdaUI.UploadPanelUI&#39;, { @@ -155,35 +135,30 @@ Ext.define(&#39;amdaUI.UploadPanelUI&#39;, {
155 case 'cef' : auto_format = 'CEF'; break; 135 case 'cef' : auto_format = 'CEF'; break;
156 case 'xml' : auto_format = 'VOT'; 136 case 'xml' : auto_format = 'VOT';
157 case 'vot' : auto_format = 'VOT'; break; 137 case 'vot' : auto_format = 'VOT'; break;
158 - case 'nc' : auto_format = 'NC'; break; 138 + case 'nc' : auto_format = 'NC'; break;
159 case 'asc' : 139 case 'asc' :
160 case 'txt' : 140 case 'txt' :
161 default : auto_format = 'ASCII'; 141 default : auto_format = 'ASCII';
162 } 142 }
163 } 143 }
164 // set auto format : case when format was not set by user before 144 // set auto format : case when format was not set by user before
165 - if (this.isFile && user_format !== auto_format) {  
166 - user_format_obj.filefrmt = auto_format;  
167 - } else if (this.isTimeTable && user_format !== auto_format) {  
168 - user_format_obj.ttfrmt = auto_format;  
169 - } else if (!this.isFile && !this.isTimeTable && user_format !== auto_format) {  
170 - user_format_obj.catfrmt = auto_format;  
171 - }  
172 - 145 + if (user_format !== auto_format) {
  146 + user_format_obj[this.radioId] = auto_format;
  147 + }
  148 +
173 radios.setValue(user_format_obj); 149 radios.setValue(user_format_obj);
174 }, 150 },
175 151
176 - /*  
177 - *  
178 - */ 152 +/*
  153 +*
  154 +*/
179 forceUpload : function (url,format,onFinish) 155 forceUpload : function (url,format,onFinish)
180 { 156 {
181 var me = this; 157 var me = this;
182 var re = /http:\/\/127.0.0.1:/; 158 var re = /http:\/\/127.0.0.1:/;
183 var isRemoteUrl = !re.test(url); 159 var isRemoteUrl = !re.test(url);
184 160
185 - switch (format)  
186 - { 161 + switch (format) {
187 case 'votable' : 162 case 'votable' :
188 this.getForm().findField('filefrmt').setValue('VOT'); 163 this.getForm().findField('filefrmt').setValue('VOT');
189 break; 164 break;
@@ -230,14 +205,14 @@ Ext.define(&#39;amdaUI.UploadPanelUI&#39;, { @@ -230,14 +205,14 @@ Ext.define(&#39;amdaUI.UploadPanelUI&#39;, {
230 this.postUpload(onFinish); 205 this.postUpload(onFinish);
231 }, 206 },
232 207
233 - /*  
234 - *  
235 - */ 208 +/*
  209 +*
  210 +*/
236 postUpload : function(onFinish) 211 postUpload : function(onFinish)
237 { 212 {
238 // 'global' form containing 'partial' forms 213 // 'global' form containing 'partial' forms
239 var form = this.getForm(); 214 var form = this.getForm();
240 - 215 +
241 // special validation 216 // special validation
242 if(this.validate()) 217 if(this.validate())
243 { 218 {
@@ -246,16 +221,14 @@ Ext.define(&#39;amdaUI.UploadPanelUI&#39;, { @@ -246,16 +221,14 @@ Ext.define(&#39;amdaUI.UploadPanelUI&#39;, {
246 scope: this, 221 scope: this,
247 url: 'php/uploadFile.php', 222 url: 'php/uploadFile.php',
248 waitMsg: 'Uploading your file...', 223 waitMsg: 'Uploading your file...',
249 - success: function(form, o)  
250 - { 224 + success: function(form, o) {
251 if (onFinish) 225 if (onFinish)
252 onFinish(); 226 onFinish();
253 this.tmpNode = Ext.create(this.nodeType,{leaf : true, text : o.result.file}); 227 this.tmpNode = Ext.create(this.nodeType,{leaf : true, text : o.result.file});
254 AmdaAction.getUploadedObject(o.result.file, o.result.format, this.tmpNode.get('nodeType'), this.getObjectCallback, this); 228 AmdaAction.getUploadedObject(o.result.file, o.result.format, this.tmpNode.get('nodeType'), this.getObjectCallback, this);
255 loadMask.hide(); 229 loadMask.hide();
256 }, 230 },
257 - failure: function(form, o)  
258 - { 231 + failure: function(form, o) {
259 if (onFinish) 232 if (onFinish)
260 onFinish(); 233 onFinish();
261 loadMask.hide(); 234 loadMask.hide();
@@ -265,25 +238,19 @@ Ext.define(&#39;amdaUI.UploadPanelUI&#39;, { @@ -265,25 +238,19 @@ Ext.define(&#39;amdaUI.UploadPanelUI&#39;, {
265 } 238 }
266 }, 239 },
267 240
268 - /*  
269 - * panel config  
270 - */  
271 - init : function(config)  
272 - {  
273 - this.isFile = config.panelType == 'file'? true : false;  
274 - this.isTimeTable = config.panelType == 'timetable'? true : false;  
275 -  
276 - // file / time table / catalog settings  
277 - if (this.isFile)  
278 - {  
279 - var title = 'File';  
280 - var items = [ 241 + initFileUpload : function()
  242 + {
  243 + this.formats = [
281 { boxLabel: 'ASCII', name: 'filefrmt', inputValue: 'ASCII', checked: true, 244 { boxLabel: 'ASCII', name: 'filefrmt', inputValue: 'ASCII', checked: true,
282 - listeners:  
283 - { 245 + listeners: {
284 change: function (cb, nv, ov) { 246 change: function (cb, nv, ov) {
285 - if (nv) Ext.getCmp('tf').show();  
286 - else Ext.getCmp('tf').hide(); 247 + if (nv) {
  248 + Ext.getCmp('tf').show();
  249 + }
  250 + else {
  251 + Ext.getCmp('tf').hide();
  252 + Ext.getCmp('nfs').hide();
  253 + }
287 } 254 }
288 } 255 }
289 }, 256 },
@@ -291,143 +258,95 @@ Ext.define(&#39;amdaUI.UploadPanelUI&#39;, { @@ -291,143 +258,95 @@ Ext.define(&#39;amdaUI.UploadPanelUI&#39;, {
291 { boxLabel: 'CDF&nbsp;<img amda_clicktip="cdfTimeFormat" style="vertical-align:bottom" src="js/resources/images/16x16/info_mini.png"', name: 'filefrmt', inputValue: 'CDF' }, 258 { boxLabel: 'CDF&nbsp;<img amda_clicktip="cdfTimeFormat" style="vertical-align:bottom" src="js/resources/images/16x16/info_mini.png"', name: 'filefrmt', inputValue: 'CDF' },
292 // { boxLabel: 'CEF[GZ]', name: 'filefrmt', inputValue: 'CEF' }, 259 // { boxLabel: 'CEF[GZ]', name: 'filefrmt', inputValue: 'CEF' },
293 { boxLabel: 'VOTable', name: 'filefrmt', inputValue: 'VOT' }]; 260 { boxLabel: 'VOTable', name: 'filefrmt', inputValue: 'VOT' }];
294 - var timeFormatId = 'tf';  
295 - this.formatId = 'nsf'; 261 +
296 this.localUploadId = 'form-uploadfile'; 262 this.localUploadId = 'form-uploadfile';
297 - var localUploadName ='localFileName';  
298 - var remoteUploadName ='remoteFile';  
299 this.remoteUploadId = 'form-uploadurl'; 263 this.remoteUploadId = 'form-uploadurl';
300 - this.nodeType = 'amdaModel.MyDataParamNode';  
301 - //TODO load XML  
302 - var store = Ext.create('Ext.data.Store', { 264 + this.nodeType = 'amdaModel.MyDataParamNode';
  265 + this.store = Ext.create('Ext.data.Store', {
303 fields: ['value', 'name'], 266 fields: ['value', 'name'],
304 - data : [  
305 - {"value":"ftp://cdaweb.gsfc.nasa.gov/pub/data/", "name":"CDAWEB/FTP"}/*,  
306 - {"value":"ftp://ftp.ngdc.noaa.gov/STP/SOLAR_DATA/", "name":"Solar Data"}*/]  
307 - });  
308 - }  
309 - else if (this.isTimeTable)  
310 - {  
311 - var title = 'Time Table';  
312 - var items = [  
313 - { boxLabel: 'ASCII&nbsp;<img amda_clicktip="ttTimeFormat" style="vertical-align:bottom" src="js/resources/images/16x16/info_mini.png"', name: 'ttfrmt', inputValue: 'ASCII', checked: true},  
314 - { boxLabel: 'VOTable', name: 'ttfrmt', inputValue: 'VOT'}  
315 - ];  
316 - var timeFormatId = 'tf_tt';  
317 - this.formatId = 'nsf_tt';  
318 - this.localUploadId = 'form-uploadtt';  
319 - var localUploadName ='localTTName';  
320 - var remoteUploadName ='remoteTT';  
321 - this.remoteUploadId = 'form-uploadtturl';  
322 - this.nodeType = 'amdaModel.TimeTableNode';  
323 - //TODO load XML  
324 - var store = Ext.create('Ext.data.Store', {  
325 - fields: ['value', 'name'],  
326 - data : [] 267 + proxy: {
  268 + type: 'ajax',
  269 + url : 'generic_data/remote_sites.json',
  270 + reader: {
  271 + type: 'json',
  272 + root: 'remote_sites'
  273 + }
  274 + },
  275 + autoLoad: true
327 }); 276 });
328 - }  
329 - else  
330 - {  
331 - var title = 'Catalog';  
332 - var items = [  
333 - { boxLabel: 'VOTable', name: 'catfrmt', inputValue: 'VOT', checked: true }];  
334 -  
335 - var timeFormatId = 'tf_cat';  
336 - this.formatId = 'nsf_cat';  
337 - this.localUploadId = 'form-uploadcat';  
338 - var localUploadName ='localCatName';  
339 - var remoteUploadName ='remoteCat';  
340 277
341 - this.remoteUploadId = 'form-uploadcaturl';  
342 - this.nodeType = 'amdaModel.CatalogNode';  
343 - //TODO load XML  
344 - var store = Ext.create('Ext.data.Store', {  
345 - fields: ['value', 'name'],  
346 - data : []  
347 - });  
348 - }  
349 -  
350 - var combo = Ext.create('Ext.form.ComboBox', {  
351 - flex : 4,  
352 - store: store,  
353 - emptyText: 'Enter Remote Site URL (ftp)',  
354 - queryMode: 'local',  
355 - displayField: 'name',  
356 - valueField: 'value'  
357 - });  
358 -  
359 - var fieldcontainer =  
360 - {  
361 - xtype: 'fieldcontainer',  
362 - fieldLabel: ' ', labelWidth: 0, labelSeparator : '', labelPad : 0,  
363 - layout: 'hbox', 278 + this.radioId = 'filefrmt';
  279 +
  280 +/*
  281 + * Sampling : TimeFormat Fieldset
  282 + */
  283 + this.autoSampling = Ext.create('Ext.form.RadioGroup', {
  284 + // fieldLabel : 'Constant or Variable ?',
  285 + // labelWidth: 90,
  286 + defaults : {name : 'timesmpl'},
364 items: [ 287 items: [
365 - combo,  
366 - {  
367 - xtype : 'button',  
368 - flex : 1,  
369 - text: 'Browse It',  
370 - handler: function()  
371 - {  
372 - var form = this.up('form').getForm();  
373 - var site = form.getFields().getAt(0).getValue();  
374 - if (site)  
375 - this.up('form').ownerCt.fireEvent('open', site);  
376 - else  
377 - myDesktopApp.warningMsg("Please Enter Remote Site URL");  
378 - }  
379 - }]  
380 - };  
381 -  
382 - if (this.isFile) var radioId = 'filefrmt';  
383 - else if (this.isTimeTable) var radioId = 'ttfrmt';  
384 - else var radioId = 'catfrmt'; 288 + {boxLabel: 'constant sampling', inputValue: 'constant', checked: true},
  289 + {boxLabel: 'variable sampling&nbsp;<img amda_clicktip="variableSampling" style="vertical-align:bottom" src="js/resources/images/16x16/info_mini.png"', inputValue: 'variable'}
  290 + ]
  291 + });
385 292
386 - var fileFormat = Ext.create('Ext.form.FieldSet', {  
387 - title: 'File Format',  
388 - items : [{  
389 - xtype: 'radiogroup',  
390 - id : radioId,  
391 - columns: 3,  
392 - cls: 'x-check-group-alt',  
393 - items: items 293 + this.manualSampling = Ext.create('Ext.form.FieldContainer', {
  294 + defaultType: 'numberfield',
  295 + layout: 'anchor',
  296 + defaults: {
  297 + layout: '100%',
  298 + labelWidth : 150,
  299 + minValue : 0.001,
  300 + hideTrigger: true
  301 + },
  302 + hidden : true,
  303 + items: [
  304 + {
  305 + fieldLabel : 'min sampling',
  306 + name : 'min_manual_sampling'
  307 + },
  308 + {
  309 + fieldLabel : 'max sampling',
  310 + name : 'max_manual_sampling'
394 }] 311 }]
  312 + });
  313 +
  314 + var Sampling = Ext.create('Ext.form.RadioGroup', {
  315 + fieldLabel: 'Time Sampling',
  316 + labelWidth: 90,
  317 + cls: 'x-check-group-alt',
  318 + defaults : {name : 'smpl'},
  319 + items: [
  320 + {boxLabel: 'auto-defined', inputValue: 'auto', checked: true},
  321 + {boxLabel: 'manual', inputValue: 'manual'}
  322 + ],
  323 + listeners: {
  324 + scope : this,
  325 + change: function (cb, nv, ov) {
  326 + if (nv.smpl == 'manual') {
  327 + this.autoSampling.setVisible(false);
  328 + this.manualSampling.setVisible(true);
  329 + }
  330 + else {
  331 + this.autoSampling.setVisible(true);
  332 + this.manualSampling.setVisible(false);
  333 + }
  334 + }
  335 + }
395 }); 336 });
396 -  
397 - var Sampling =  
398 - {  
399 - xtype: 'radiogroup',  
400 - fieldLabel: 'Time Sampling',  
401 - labelWidth: 90,  
402 - cls: 'x-check-group-alt',  
403 - hidden : !this.isFile,  
404 - defaults : {name : 'timesmpl'},  
405 - items: [  
406 - {boxLabel: 'constant', inputValue: 'constant', checked: true},  
407 - {boxLabel: 'variable&nbsp;<img amda_clicktip="variableSampling" style="vertical-align:bottom" src="js/resources/images/16x16/info_mini.png"', inputValue: 'variable'}  
408 - ]  
409 - };  
410 -  
411 - var dayStart =  
412 - {  
413 - xtype: 'checkbox',  
414 - name : 'doy',  
415 - hidden : true,  
416 - fieldLabel: 'DOY starts from 1',  
417 - inputValue: '1'  
418 - };  
419 -  
420 - var nonStandardFormat =  
421 - { 337 +
  338 +/*
  339 + * NonStandardFormat : TimeFormat Fieldset
  340 + */
  341 + var nonStandardFormat = {
422 xtype: 'fieldcontainer', 342 xtype: 'fieldcontainer',
423 defaultType: 'textfield', 343 defaultType: 'textfield',
424 layout: 'anchor', 344 layout: 'anchor',
425 - defaults:  
426 - {  
427 - layout: '100%',  
428 - labelWidth : 150 345 + defaults: {
  346 + layout: '100%',
  347 + labelWidth : 150
429 }, 348 },
430 - id : this.formatId, 349 + id : 'nfs',
431 hidden : true, 350 hidden : true,
432 items: [ 351 items: [
433 { 352 {
@@ -435,8 +354,7 @@ Ext.define(&#39;amdaUI.UploadPanelUI&#39;, { @@ -435,8 +354,7 @@ Ext.define(&#39;amdaUI.UploadPanelUI&#39;, {
435 name : 'nonstd', 354 name : 'nonstd',
436 value: 'Y-m-d H:i:s', 355 value: 'Y-m-d H:i:s',
437 enableKeyEvents: true, 356 enableKeyEvents: true,
438 - listeners :  
439 - { 357 + listeners : {
440 keyUp : function() { 358 keyUp : function() {
441 if (this.getValue().indexOf('z') > 0) { 359 if (this.getValue().indexOf('z') > 0) {
442 this.nextSibling().show(); 360 this.nextSibling().show();
@@ -446,67 +364,165 @@ Ext.define(&#39;amdaUI.UploadPanelUI&#39;, { @@ -446,67 +364,165 @@ Ext.define(&#39;amdaUI.UploadPanelUI&#39;, {
446 } 364 }
447 } 365 }
448 } 366 }
449 - },  
450 - dayStart,  
451 - {  
452 - fieldLabel : 'define max time length',  
453 - name : 'timelength',  
454 - value: 'auto' 367 + },{
  368 + xtype: 'checkbox',
  369 + name : 'doy',
  370 + fieldLabel: 'DOY starts from 1',
  371 + hidden : true,
  372 + inputValue: '1'
  373 + },{
  374 + fieldLabel : 'define max time length',
  375 + name : 'timelength',
  376 + value: 'auto'
455 }], 377 }],
456 - listeners :  
457 - { 378 + listeners : {
458 hide : function() { 379 hide : function() {
459 this.items.getAt(1).hide(); 380 this.items.getAt(1).hide();
  381 + },
  382 + show : function() {
  383 + if (this.items.getAt(0).getValue().indexOf('z') > 0)
  384 + this.items.getAt(1).show();
460 } 385 }
461 } 386 }
462 - };  
463 -  
464 - var timeFormat = Ext.create('Ext.form.FieldSet', {  
465 - id: timeFormatId,  
466 - title: 'Time Settings',  
467 - hidden : !this.isFile,  
468 - items : [  
469 - { 387 + };
  388 +
  389 +/*
  390 + * TimeFormat Fieldset : Global form
  391 + */
  392 + var timeFormat = Ext.create('Ext.form.FieldSet', {
  393 + title: 'Time Settings',
  394 + items : [{
  395 + id: 'tf',
470 xtype: 'radiogroup', 396 xtype: 'radiogroup',
471 fieldLabel: 'Time Format', 397 fieldLabel: 'Time Format',
472 - labelWidth: 90, 398 + labelWidth: 90,
473 cls: 'x-check-group-alt', 399 cls: 'x-check-group-alt',
474 defaults : { name : 'timefrmt'}, 400 defaults : { name : 'timefrmt'},
475 - items: [  
476 - { boxLabel: 'standard&nbsp;<img amda_clicktip="standardTimeFormat" style="vertical-align:bottom" src="js/resources/images/16x16/info_mini.png"', inputValue: 'standard', checked: true},  
477 - { boxLabel: 'no&nbsp;<img amda_clicktip="userTimeFormat" style="vertical-align:bottom" src="js/resources/images/16x16/info_mini.png"', inputValue: 'user',  
478 - listeners:  
479 - {  
480 - scope : this,  
481 - change: function (cb, nv, ov) {  
482 - if (nv)  
483 - Ext.getCmp(this.formatId).show();  
484 - else  
485 - Ext.getCmp(this.formatId).hide();  
486 - }  
487 - }  
488 - }]  
489 - },  
490 - nonStandardFormat,  
491 - Sampling ] 401 + items: [
  402 + { boxLabel: 'standard&nbsp;<img amda_clicktip="standardTimeFormat" style="vertical-align:bottom" src="js/resources/images/16x16/info_mini.png"', inputValue: 'standard', checked: true},
  403 + { boxLabel: 'no&nbsp;<img amda_clicktip="userTimeFormat" style="vertical-align:bottom" src="js/resources/images/16x16/info_mini.png"', inputValue: 'user',
  404 + listeners: {
  405 + change: function (cb, nv, ov) {
  406 + if (nv)
  407 + Ext.getCmp('nfs').show();
  408 + else
  409 + Ext.getCmp('nfs').hide();
  410 + }
  411 + }
  412 + }]
  413 + },
  414 + nonStandardFormat,
  415 + Sampling,
  416 + this.autoSampling,
  417 + this.manualSampling
  418 + ]
492 }); 419 });
  420 +
  421 + this.specialItems = [ timeFormat,
  422 + {
  423 + xtype: 'hidden',
  424 + name: 'sampData',
  425 + value: null
  426 + },
  427 + {
  428 + xtype: 'hidden',
  429 + name: 'sampFileName',
  430 + value: null
  431 + }]
  432 + },
493 433
494 - var localFile = Ext.create('Ext.form.Panel', { 434 + initTTUpload : function(isTT)
  435 + {
  436 + if (isTT) {
  437 + this.formats = [
  438 + { boxLabel: 'ASCII&nbsp;<img amda_clicktip="ttTimeFormat" style="vertical-align:bottom" src="js/resources/images/16x16/info_mini.png"', name: 'ttfrmt', inputValue: 'ASCII', checked: true},
  439 + { boxLabel: 'VOTable', name: 'ttfrmt', inputValue: 'VOT'}
  440 + ];
  441 + this.localUploadId = 'form-uploadtt';
  442 + this.remoteUploadId = 'form-uploadtturl';
  443 + this.nodeType = 'amdaModel.TimeTableNode';
  444 +
  445 + this.store = Ext.create('Ext.data.Store', {
  446 + fields: ['value', 'name']/*,
  447 + proxy: {
  448 + type: 'ajax',
  449 + url : 'generic_data/remote_sites.json',
  450 + reader: {
  451 + type: 'json',
  452 + root: 'remote_sites'
  453 + }
  454 + },
  455 + autoLoad: true*/
  456 + });
  457 +
  458 + this.radioId = 'ttfrmt';
  459 + }
  460 + else {
  461 + this.formats = [
  462 + { boxLabel: 'VOTable', name: 'catfrmt', inputValue: 'VOT', checked: true }];
  463 +
  464 + this.localUploadId = 'form-uploadcat';
  465 + this.remoteUploadId = 'form-uploadcaturl';
  466 + this.nodeType = 'amdaModel.CatalogNode';
  467 + this.store = Ext.create('Ext.data.Store', {
  468 + fields: ['value', 'name']/*,
  469 + proxy: {
  470 + type: 'ajax',
  471 + url : 'generic_data/remote_sites.json',
  472 + reader: {
  473 + type: 'json',
  474 + root: 'remote_sites'
  475 + }
  476 + },
  477 + autoLoad: true*/
  478 + });
  479 +
  480 + this.radioId = 'catfrmt';
  481 + }
  482 + },
  483 +/*
  484 +* panel config
  485 +*/
  486 + init : function(config)
  487 + {
  488 +
  489 + if ( config.panelType == 'file' )
  490 + this.initFileUpload();
  491 + else
  492 + this.initTTUpload(config.panelType == 'timetable');
  493 +
  494 + this.localName = config.localUploadName;
  495 + /*
  496 + * FileFormat Fieldset
  497 + */
  498 + var fileFormat = Ext.create('Ext.form.FieldSet', {
  499 + title: 'File Format',
  500 + items : [{
  501 + xtype: 'radiogroup',
  502 + id : this.radioId,
  503 + columns: 3,
  504 + cls: 'x-check-group-alt',
  505 + items: this.formats
  506 + }]
  507 + });
  508 +
  509 +/*
  510 + * FileSource Fieldset : Local File Upload
  511 + */
  512 + var localFile = Ext.create('Ext.form.Panel', {
495 id: this.localUploadId, 513 id: this.localUploadId,
496 fileUpload: true, 514 fileUpload: true,
497 hideLabels: true, 515 hideLabels: true,
498 frame: true, 516 frame: true,
499 - items: [  
500 - {  
501 - xtype: 'fileuploadfield', 517 + items: [{
  518 + xtype: 'fileuploadfield',
502 emptyText: 'Select Your File', 519 emptyText: 'Select Your File',
503 width: 300, 520 width: 300,
504 - name: localUploadName, 521 + name: this.localName,
505 buttonText: 'Browse', 522 buttonText: 'Browse',
506 - listeners:  
507 - { 523 + listeners: {
508 scope : this, 524 scope : this,
509 - change: function (field, value, e) { 525 + change: function (field, value, e) {
510 this.updateFormat(value); 526 this.updateFormat(value);
511 } 527 }
512 } 528 }
@@ -517,41 +533,75 @@ Ext.define(&#39;amdaUI.UploadPanelUI&#39;, { @@ -517,41 +533,75 @@ Ext.define(&#39;amdaUI.UploadPanelUI&#39;, {
517 name: 'MAX_FILE_SIZE', 533 name: 'MAX_FILE_SIZE',
518 value: myDesktopApp.MAX_UPLOADED_FILE_SIZE // 30MB 534 value: myDesktopApp.MAX_UPLOADED_FILE_SIZE // 30MB
519 }] 535 }]
520 - });  
521 -  
522 - var remoteFile = Ext.create('Ext.form.Panel', {  
523 - id: this.remoteUploadId, 536 + });
  537 +
  538 +/*
  539 + * FileSource Fieldset : Remote File Upload
  540 + */
  541 + var combo = Ext.create('Ext.form.ComboBox', {
  542 + flex : 4,
  543 + store: this.store,
  544 + emptyText: 'Enter Remote Site URL (ftp/http[s])',
  545 + queryMode: 'local',
  546 + displayField: 'name',
  547 + valueField: 'value'
  548 + });
  549 +
  550 + var fieldcontainer = {
  551 + xtype: 'fieldcontainer',
  552 + fieldLabel: ' ', labelWidth: 0, labelSeparator : '', labelPad : 0,
  553 + layout: 'hbox',
  554 + items: [
  555 + combo,
  556 + {
  557 + xtype : 'button',
  558 + flex : 1,
  559 + text: 'Browse It',
  560 + handler: function() {
  561 + var form = this.up('form').getForm();
  562 + var site = form.getFields().getAt(0).getValue();
  563 + if (site)
  564 + this.up('form').ownerCt.fireEvent('open', site);
  565 + else
  566 + myDesktopApp.warningMsg("Please Enter Remote Site URL");
  567 + }
  568 + }]
  569 + };
  570 +
  571 + var remoteFile = Ext.create('Ext.form.Panel', {
  572 + id: this.remoteUploadId,
524 hideLabels: true, 573 hideLabels: true,
525 - autoHeight: true, 574 + autoHeight: true,
526 frame: true, 575 frame: true,
527 hidden : true, 576 hidden : true,
528 items: [ 577 items: [
529 fieldcontainer, 578 fieldcontainer,
530 { 579 {
531 xtype : 'textfield', 580 xtype : 'textfield',
532 - name : remoteUploadName,  
533 - emptyText: 'Enter Remote File URL (http or ftp)', 581 + name : config.remoteUploadName,
  582 + emptyText: 'Enter Remote File URL (ftp/http[s])',
534 width: 310, 583 width: 310,
535 listeners: 584 listeners:
536 { 585 {
537 scope : this, 586 scope : this,
538 - change: function (field, value, e) {  
539 - this.updateFormat(value); 587 + change: function (field, value, e) {
  588 + this.updateFormat(value);
540 } 589 }
541 } 590 }
542 }] 591 }]
543 }); 592 });
544 -  
545 - var uploadForm = Ext.create('Ext.form.FieldSet',{  
546 - title: 'File Source',  
547 - items : [  
548 - {  
549 - xtype: 'radiogroup', 593 +
  594 + /*
  595 + * FileSource Fieldset : global form
  596 + */
  597 + var uploadForm = Ext.create('Ext.form.FieldSet',{
  598 + title: 'File Source',
  599 + items : [{
  600 + xtype: 'radiogroup',
550 cls: 'x-check-group-alt', 601 cls: 'x-check-group-alt',
551 items: [ 602 items: [
552 { boxLabel: 'Local', name: 'filesrc', inputValue: 'LOCAL', checked: true, 603 { boxLabel: 'Local', name: 'filesrc', inputValue: 'LOCAL', checked: true,
553 - listeners:  
554 - { 604 + listeners: {
555 scope : this, 605 scope : this,
556 change: function (cb, nv, ov) { 606 change: function (cb, nv, ov) {
557 if (nv == ov) return; 607 if (nv == ov) return;
@@ -559,67 +609,52 @@ Ext.define(&#39;amdaUI.UploadPanelUI&#39;, { @@ -559,67 +609,52 @@ Ext.define(&#39;amdaUI.UploadPanelUI&#39;, {
559 var remote = Ext.getCmp(this.remoteUploadId); 609 var remote = Ext.getCmp(this.remoteUploadId);
560 if (nv) { 610 if (nv) {
561 remote.hide(); 611 remote.hide();
562 - local.show(); 612 + local.show();
563 } 613 }
564 else { 614 else {
565 local.hide(); 615 local.hide();
566 - remote.show(); 616 + remote.show();
567 } 617 }
568 } 618 }
569 } 619 }
570 }, 620 },
571 - { boxLabel: 'URL', name: 'filesrc', inputValue: 'URL'} ] 621 + { boxLabel: 'URL', name: 'filesrc', inputValue: 'URL'}]
572 }] 622 }]
573 }); 623 });
574 - 624 +
  625 +/*
  626 + * Panel Config
  627 + */
575 var myConf = 628 var myConf =
576 { 629 {
577 - title : title, 630 + title : config.title,
578 layout: {type: 'vbox', align: 'stretch'}, 631 layout: {type: 'vbox', align: 'stretch'},
  632 + autoScroll : true,
579 bodyStyle: { background : '#dfe8f6'}, 633 bodyStyle: { background : '#dfe8f6'},
580 - items : [  
581 - uploadForm,  
582 - localFile,  
583 - remoteFile,  
584 - fileFormat,  
585 - timeFormat,  
586 - {  
587 - xtype: 'hidden',  
588 - name: 'sampData',  
589 - value: null  
590 - },  
591 - {  
592 - xtype: 'hidden',  
593 - name: 'sampFileName',  
594 - value: null,  
595 - }  
596 - ],  
597 - buttons: [  
598 - { 634 + items : Ext.Array.merge(
  635 + [ uploadForm, localFile, remoteFile, fileFormat ],
  636 + this.specialItems ),
  637 + buttons: [{
599 text: 'Upload', 638 text: 'Upload',
600 - handler: function()  
601 - { 639 + handler: function() {
602 this.postUpload(); 640 this.postUpload();
603 }, 641 },
604 scope : this 642 scope : this
605 }, 643 },
606 { 644 {
607 text: 'Reset', 645 text: 'Reset',
608 - handler: function(){ 646 + handler: function() {
609 this.up('form').getForm().reset(); 647 this.up('form').getForm().reset();
610 } 648 }
611 }], 649 }],
612 plugins: [{ptype: 'remoteSearchPlugin'}], 650 plugins: [{ptype: 'remoteSearchPlugin'}],
613 - listeners:  
614 - {  
615 - click:  
616 - { 651 + listeners:{
  652 + click: {
617 element: 'el', 653 element: 'el',
618 - fn: function(e,t) { 654 + fn: function(e,t) {
619 var me = t, 655 var me = t,
620 text = me.getAttribute('amda_clicktip'); 656 text = me.getAttribute('amda_clicktip');
621 - if (text)  
622 - { 657 + if (text) {
623 e.preventDefault(); 658 e.preventDefault();
624 AmdaAction.getInfo({name : text}, function(res,e) { 659 AmdaAction.getInfo({name : text}, function(res,e) {
625 if (res.success) myDesktopApp.infoMsg(res.result); 660 if (res.success) myDesktopApp.infoMsg(res.result);
js/app/views/UploadUI.js
@@ -33,9 +33,9 @@ Ext.define(&#39;amdaUI.UploadUI&#39;, { @@ -33,9 +33,9 @@ Ext.define(&#39;amdaUI.UploadUI&#39;, {
33 region: 'center', 33 region: 'center',
34 activeTab : 0, 34 activeTab : 0,
35 items : [ 35 items : [
36 - { xtype: 'panelUpload', panelType : 'file'},  
37 - { xtype: 'panelUpload', panelType : 'timetable'},  
38 - { xtype: 'panelUpload', panelType : 'catalog'}] 36 + { xtype: 'panelUpload', panelType : 'file', title : 'File', localUploadName : 'localFileName', remoteUploadName : 'remoteFile'},
  37 + { xtype: 'panelUpload', panelType : 'timetable', title : 'Time Table', localUploadName : 'localTTName', remoteUploadName : 'remoteTT'},
  38 + { xtype: 'panelUpload', panelType : 'catalog', title : 'Catalog', localUploadName : 'localCatName', remoteUploadName :'remoteCat'}]
39 }, 39 },
40 { 40 {
41 xtype: 'panel', 41 xtype: 'panel',
php/classes/FilesMgr.php
@@ -113,19 +113,28 @@ class FilesMgr extends AmdaObjectMgr @@ -113,19 +113,28 @@ class FilesMgr extends AmdaObjectMgr
113 else { 113 else {
114 $size = 1; 114 $size = 1;
115 } 115 }
116 -  
117 - return array('type' => $data_type, 'size' => $size, 'n_records' => $n_recs); 116 +
  117 + $units = exec('cdfvar_attr '.$this->fileName.' '.$cdfVarId.' UNITS');
  118 + $fillval = exec('cdfvar_attr '.$this->fileName.' '.$cdfVarId.' FILLVAL');
  119 +
  120 + return array('type' => $data_type, 'size' => $size, 'n_records' => $n_recs, 'units' => $units, 'fillvalue' => $fillval);
118 } 121 }
119 122
120 - public function getCdfSampling()  
121 - { 123 + public function getCdfSampling() {
122 copy($this->fileName, "temp.cdf"); 124 copy($this->fileName, "temp.cdf");
123 exec('cdfsamplingfromdata ', $results); 125 exec('cdfsamplingfromdata ', $results);
124 unlink("temp.cdf"); 126 unlink("temp.cdf");
125 127
126 return $results; 128 return $results;
127 } 129 }
  130 +
  131 + public function getCdfSamplings() {
  132 + copy($this->fileName, "temp.cdf");
  133 + exec('cdfsamplingsfromdata ', $results);
  134 + unlink("temp.cdf");
128 135
  136 + return $results;
  137 + }
129 /* 138 /*
130 * CEF format processing 139 * CEF format processing
131 */ 140 */
@@ -214,7 +223,7 @@ class FilesMgr extends AmdaObjectMgr @@ -214,7 +223,7 @@ class FilesMgr extends AmdaObjectMgr
214 { 223 {
215 exec('ncvarinfo '.$this->fileName.' '.$this->param2dd($varId), $results); 224 exec('ncvarinfo '.$this->fileName.' '.$this->param2dd($varId), $results);
216 $tempArr = explode(' ', $results[0]); 225 $tempArr = explode(' ', $results[0]);
217 - // data type 226 + // data type
218 switch ($tempArr[0]) { 227 switch ($tempArr[0]) {
219 case "5": $data_type = 'FLOAT'; 228 case "5": $data_type = 'FLOAT';
220 break; 229 break;
@@ -238,7 +247,15 @@ class FilesMgr extends AmdaObjectMgr @@ -238,7 +247,15 @@ class FilesMgr extends AmdaObjectMgr
238 $size = 1; 247 $size = 1;
239 } 248 }
240 249
241 - return array('type' => $data_type, 'size' => $size, 'n_records' => $n_recs); 250 + $units = exec('ncvar_attr '.$this->fileName.' '.$this->param2dd($varId).' UNITS');
  251 + if (substr($units, 0,5) == 'error') $units = '';
  252 +
  253 + $fillval = exec('ncvar_attr '.$this->fileName.' '.$this->param2dd($varId).' _Fillvalue'); // _Fillvalue
  254 + if (substr($fillval, 0,5) == 'error') $fillval = exec('ncvar_attr '.$this->fileName.' '.$this->param2dd($varId).' Fillvalue');
  255 + if (substr($fillval, 0,5) == 'error') $fillval = exec('ncvar_attr '.$this->fileName.' '.$this->param2dd($varId).' Fillval');
  256 + if (substr($fillval, 0,5) == 'error') $fillval = '';
  257 +
  258 + return array('type' => $data_type, 'size' => $size, 'n_records' => $n_recs, 'units' => $units, 'fillvalue' => $fillval);
242 } 259 }
243 260
244 protected function param2dd($paramID) 261 protected function param2dd($paramID)
@@ -583,22 +600,30 @@ class FilesMgr extends AmdaObjectMgr @@ -583,22 +600,30 @@ class FilesMgr extends AmdaObjectMgr
583 } 600 }
584 601
585 602
586 - protected function createFile($format) 603 + protected function createFile($format, $samplingType)
587 { 604 {
588 $newFile = $this->contentDom->createElement('file'); 605 $newFile = $this->contentDom->createElement('file');
589 $newFile->setAttribute('xml:id', $this->fileId); 606 $newFile->setAttribute('xml:id', $this->fileId);
590 $newFile->setAttribute('name', $this->fileId); 607 $newFile->setAttribute('name', $this->fileId);
591 $newFile->setAttribute('format', $format); 608 $newFile->setAttribute('format', $format);
592 - 609 +
  610 + $minSamp = $this->sampling;
  611 + $maxSamp = $this->maxSampling;
  612 +
593 switch ($format) 613 switch ($format)
594 { 614 {
595 case "cdf": 615 case "cdf":
596 $start_stop = explode(" ",$this->getCdfStartStop()); 616 $start_stop = explode(" ",$this->getCdfStartStop());
597 - $result = $this->getCdfSampling();  
598 - //TODO process errors  
599 - $minSamp = $result[count($result)-1];  
600 - //TODO if min & max  
601 - $maxSamp = $minSamp; 617 + if ($minSamp < 0) {
  618 + if ($samplingType == 'constant') {
  619 + $result = $this->getCdfSampling();
  620 + //TODO process errors
  621 + $minSamp = $result[count($result)-1];
  622 + $maxSamp = $minSamp;
  623 + } else {
  624 + // $result = $this->getCdfSamplings();
  625 + }
  626 + }
602 break; 627 break;
603 case "txt": 628 case "txt":
604 $start_stop = explode(" ",$this->reformatTxt()); 629 $start_stop = explode(" ",$this->reformatTxt());
@@ -610,16 +635,14 @@ class FilesMgr extends AmdaObjectMgr @@ -610,16 +635,14 @@ class FilesMgr extends AmdaObjectMgr
610 // Test if 'standard' meta exist in CEF 635 // Test if 'standard' meta exist in CEF
611 $cefMetaTest = $this->getCefStartStop(); 636 $cefMetaTest = $this->getCefStartStop();
612 637
613 - if ($cefMetaTest != -1)  
614 - { 638 + if ($cefMetaTest != -1) {
615 $cefStartStop = explode("/",$cefMetaTest); 639 $cefStartStop = explode("/",$cefMetaTest);
616 $start_stop[] = strtotime($cefStartStop[0]); 640 $start_stop[] = strtotime($cefStartStop[0]);
617 $start_stop[] = strtotime($cefStartStop[1]); 641 $start_stop[] = strtotime($cefStartStop[1]);
618 $result = $this->getCefSampling(); 642 $result = $this->getCefSampling();
619 $minSamp = $result[count($result)-1]; 643 $minSamp = $result[count($result)-1];
620 } 644 }
621 - else  
622 - { 645 + else {
623 // no META data - so time processing 646 // no META data - so time processing
624 $timeInfo = $this->getCefTimeInfo(); 647 $timeInfo = $this->getCefTimeInfo();
625 $timeInfoArr = explode(" ", $timeInfo); 648 $timeInfoArr = explode(" ", $timeInfo);
@@ -633,8 +656,10 @@ class FilesMgr extends AmdaObjectMgr @@ -633,8 +656,10 @@ class FilesMgr extends AmdaObjectMgr
633 case "vot" : 656 case "vot" :
634 $start_stop = explode(" ",$this->getVotFileMgr()->getStartStop()); 657 $start_stop = explode(" ",$this->getVotFileMgr()->getStartStop());
635 $samplings = $this->getVotFileMgr()->getSamplings(); 658 $samplings = $this->getVotFileMgr()->getSamplings();
636 - $minSamp = $samplings["minSampling"];  
637 - $maxSamp = $samplings["maxSampling"]; 659 + if ($minSamp < 0) {
  660 + $minSamp = $samplings["minSampling"];
  661 + $maxSamp = $samplings["maxSampling"];
  662 + }
638 $desc = $this->getVotFileMgr()->getDescription(); 663 $desc = $this->getVotFileMgr()->getDescription();
639 break; 664 break;
640 case "nc": 665 case "nc":
@@ -644,11 +669,13 @@ class FilesMgr extends AmdaObjectMgr @@ -644,11 +669,13 @@ class FilesMgr extends AmdaObjectMgr
644 return $ncInfo; 669 return $ncInfo;
645 } 670 }
646 $ncInfoArr = explode("#",$ncInfo); 671 $ncInfoArr = explode("#",$ncInfo);
647 - $start_stop = explode(":",$ncInfoArr[0]);  
648 - //TODO process errors  
649 - $minSamp = $ncInfoArr[1];  
650 - //TODO if min & max  
651 - $maxSamp = $minSamp; 672 + $start_stop = explode(":",$ncInfoArr[0]);
  673 + if ($minSamp < 0) {
  674 + //TODO process errors
  675 + $minSamp = $ncInfoArr[1];
  676 + //TODO if min & max
  677 + $maxSamp = $minSamp;
  678 + }
652 break; 679 break;
653 default: 680 default:
654 } 681 }
@@ -1117,20 +1144,27 @@ class FilesMgr extends AmdaObjectMgr @@ -1117,20 +1144,27 @@ class FilesMgr extends AmdaObjectMgr
1117 1144
1118 $format = $this->getFormat(); 1145 $format = $this->getFormat();
1119 1146
1120 - if ($format === 'unknown')  
1121 - { 1147 + if ($format === 'unknown') {
1122 unlink($this->fileName); 1148 unlink($this->fileName);
1123 return array('success' => false, 'error' => 'Sorry, unknown format of '.$fileName); 1149 return array('success' => false, 'error' => 'Sorry, unknown format of '.$fileName);
1124 } 1150 }
1125 1151
  1152 + // if sampling is defined by user
  1153 + if ($formats["samplingType"] == "manual") {
  1154 + $this->sampling = $formats["min_sampling"];
  1155 + if ($formats["max_sampling"])
  1156 + $this->maxSampling = $formats["max_sampling"];
  1157 + else
  1158 + $this->maxSampling = $this->sampling;
  1159 + }
  1160 +
  1161 +
1126 if ($format == 'txt') 1162 if ($format == 'txt')
1127 { 1163 {
1128 - if ($formats["timeFormat"] == "user")  
1129 - { 1164 + if ($formats["timeFormat"] == "user") {
1130 $res = $this->reformatTime($formats["nonStandard"], $formats["timeLength"], $formats["doy"]); 1165 $res = $this->reformatTime($formats["nonStandard"], $formats["timeLength"], $formats["doy"]);
1131 1166
1132 - if (!$res)  
1133 - { 1167 + if (!$res) {
1134 unlink($this->fileName); 1168 unlink($this->fileName);
1135 return array('success' => false, 'error' => 'can\'t reformat time'); 1169 return array('success' => false, 'error' => 'can\'t reformat time');
1136 } 1170 }
@@ -1138,60 +1172,54 @@ class FilesMgr extends AmdaObjectMgr @@ -1138,60 +1172,54 @@ class FilesMgr extends AmdaObjectMgr
1138 // check if file is not empty 1172 // check if file is not empty
1139 $vars = $this->getTxtColNumber(false); 1173 $vars = $this->getTxtColNumber(false);
1140 1174
1141 - if ($vars == -100)  
1142 - { 1175 + if ($vars == -100) {
1143 return array('success' => false, 'error' => 'no such file'); 1176 return array('success' => false, 'error' => 'no such file');
1144 } 1177 }
1145 1178
1146 - if ($vars == -1)  
1147 - { 1179 + if ($vars == -1) {
1148 unlink($this->fileName); 1180 unlink($this->fileName);
1149 return array('success' => false, 'error' => 'while reading file'); 1181 return array('success' => false, 'error' => 'while reading file');
1150 } 1182 }
1151 1183
1152 - if ($vars === 0)  
1153 - { 1184 + if ($vars === 0) {
1154 unlink($this->fileName); 1185 unlink($this->fileName);
1155 return array('success' => false, 'error' => 'file contains no data'); 1186 return array('success' => false, 'error' => 'file contains no data');
1156 } 1187 }
  1188 +
  1189 + // sampling is to be defined automatically
  1190 + if ($this->sampling < 0) {
  1191 + if ($formats["timeSampling"] == "constant") {
  1192 + $this->sampling = $this->getTxtSampling();
  1193 + $this->maxSampling = $this->sampling;
  1194 + }
  1195 + else {
  1196 + $samplings = $this->getTxtSamplings();
  1197 + $this->sampling = $samplings[0];
  1198 + $this->maxSampling = $samplings[1];
  1199 + }
1157 1200
1158 - if ($formats["timeSampling"] == "constant")  
1159 - {  
1160 - $this->sampling = $this->getTxtSampling();  
1161 - $this->maxSampling = $this->sampling;  
1162 - }  
1163 - else  
1164 - {  
1165 - $samplings = $this->getTxtSamplings();  
1166 - $this->sampling = $samplings[0];  
1167 - $this->maxSampling = $samplings[1]; 1201 + if ($this->sampling <= 0) {
  1202 + unlink($this->fileName);
  1203 + if ($this->sampling == -10) {
  1204 + return array('success' => false, 'error' => 'Sorry, can\'t process'.$fileName.PHP_EOL.'. Check if there are non numeric chars in the data');
  1205 + }
  1206 + return array('success' => false, 'error' => 'Sorry, can\'t process Time for '.$fileName.PHP_EOL.'. Check time format, start time (> 1970-01-01) or sampling time (>= 1s)');
  1207 + }
1168 } 1208 }
1169 -  
1170 - if ($this->sampling <= 0)  
1171 - {  
1172 - unlink($this->fileName);  
1173 - if ($this->sampling == -10)  
1174 - {  
1175 - return array('success' => false, 'error' => 'Sorry, can\'t process'.$fileName.PHP_EOL.'. Check if there are non numeric chars in the data');  
1176 - }  
1177 - return array('success' => false, 'error' => 'Sorry, can\'t process Time for '.$fileName.PHP_EOL.'. Check time format, start time (> 1970-01-01) or sampling time (>= 1s)');  
1178 - }  
1179 } 1209 }
1180 1210
1181 if ($format == 'nc') 1211 if ($format == 'nc')
1182 { 1212 {
1183 $status = $this->reformatNcTime(); 1213 $status = $this->reformatNcTime();
1184 - if ($status <= 0)  
1185 - { 1214 + if ($status <= 0) {
1186 unlink($this->fileName); 1215 unlink($this->fileName);
1187 return array('success' => false, 'error' => 'error '.$timeFormat.PHP_EOL.'Time Format problem'); 1216 return array('success' => false, 'error' => 'error '.$timeFormat.PHP_EOL.'Time Format problem');
1188 } 1217 }
1189 } 1218 }
1190 1219
1191 //create new file tag with all attributes and add it to the content DOM 1220 //create new file tag with all attributes and add it to the content DOM
1192 - $newFile = $this->createFile($format);  
1193 - if (is_int($newFile) && ($newFile < 0))  
1194 - { 1221 + $newFile = $this->createFile($format, $formats["timeSampling"]);
  1222 + if (is_int($newFile) && ($newFile < 0)) {
1195 unlink($this->fileName); 1223 unlink($this->fileName);
1196 return array( 'success' => false, 'file' => $fileName); 1224 return array( 'success' => false, 'file' => $fileName);
1197 } 1225 }
@@ -1207,8 +1235,8 @@ class FilesMgr extends AmdaObjectMgr @@ -1207,8 +1235,8 @@ class FilesMgr extends AmdaObjectMgr
1207 $mask->appendChild($newFile); 1235 $mask->appendChild($newFile);
1208 1236
1209 $files = $mask->getElementsByTagName("file"); 1237 $files = $mask->getElementsByTagName("file");
1210 - foreach ($files as $file)  
1211 - { 1238 +
  1239 + foreach ($files as $file) {
1212 $starts[] = $file->getAttribute("start"); 1240 $starts[] = $file->getAttribute("start");
1213 $stops[] = $file->getAttribute("stop"); 1241 $stops[] = $file->getAttribute("stop");
1214 } 1242 }
@@ -1219,8 +1247,7 @@ class FilesMgr extends AmdaObjectMgr @@ -1219,8 +1247,7 @@ class FilesMgr extends AmdaObjectMgr
1219 } 1247 }
1220 } 1248 }
1221 // no corresponding masks => add to fileList 1249 // no corresponding masks => add to fileList
1222 - if (!$isMask)  
1223 - { 1250 + if (!$isMask) {
1224 $filesList = $this->contentDom->getElementById($this->contentRootId); 1251 $filesList = $this->contentDom->getElementById($this->contentRootId);
1225 $filesList->appendChild($newFile); 1252 $filesList->appendChild($newFile);
1226 } 1253 }
@@ -1230,8 +1257,7 @@ class FilesMgr extends AmdaObjectMgr @@ -1230,8 +1257,7 @@ class FilesMgr extends AmdaObjectMgr
1230 //if mask exists - add to data base 1257 //if mask exists - add to data base
1231 $myBaseManager = new BaseManager(); 1258 $myBaseManager = new BaseManager();
1232 $mask = $myBaseManager->addFile($fileName); 1259 $mask = $myBaseManager->addFile($fileName);
1233 - if ($mask != null)  
1234 - { 1260 + if ($mask != null) {
1235 $startstop = $myBaseManager->getStartStop($myBaseManager->getVi($mask)); 1261 $startstop = $myBaseManager->getStartStop($myBaseManager->getVi($mask));
1236 $myParamMgr = new DerivedParamMgr('myDataParam'); 1262 $myParamMgr = new DerivedParamMgr('myDataParam');
1237 $myParamMgr->updateMydata($mask,$startstop); 1263 $myParamMgr->updateMydata($mask,$startstop);
php/src/Makefile
@@ -4,8 +4,8 @@ CFLAGS = -ggdb -DLINUX -m64 -march=core2 -fPIC -Dlinux -D_REENTRANT -malign-doub @@ -4,8 +4,8 @@ CFLAGS = -ggdb -DLINUX -m64 -march=core2 -fPIC -Dlinux -D_REENTRANT -malign-doub
4 CC = gcc 4 CC = gcc
5 5
6 EXE = nctimestring2double nctimeinfo getncvars ncvarinfo \ 6 EXE = nctimestring2double nctimeinfo getncvars ncvarinfo \
7 - ncinfo_remote \  
8 - cdfinfo cdfvarinfo cdfstartstopfromdata cdfsamplingfromdata \ 7 + ncinfo_remote ncvar_attr \
  8 + cdfinfo cdfvarinfo cdfstartstopfromdata cdfsamplingfromdata cdfvar_attr \
9 AddVI 9 AddVI
10 10
11 lib: ${EXE} 11 lib: ${EXE}
@@ -14,8 +14,11 @@ AddVI: AddVI.c @@ -14,8 +14,11 @@ AddVI: AddVI.c
14 ${CC} ${CFLAGS} -o AddVI AddVI.c ${INC} ${LIB} -lDDClientLibC 14 ${CC} ${CFLAGS} -o AddVI AddVI.c ${INC} ${LIB} -lDDClientLibC
15 15
16 ncinfo_remote: ncinfo_remote.c 16 ncinfo_remote: ncinfo_remote.c
17 - ${CC} ${CFLAGS} -o ncinfo_remote ncinfo_remote.c ${INC} ${LIB} -lnetcdf  
18 - 17 + ${CC} ${CFLAGS} -o ncinfo_remote ncinfo_remote.c ${INC} ${LIB} -lnetcdf
  18 +
  19 +ncvar_attr: ncvar_attr.c
  20 + ${CC} ${CFLAGS} -o ncvar_attr ncvar_attr.c ${INC} ${LIB} -lnetcdf
  21 +
19 nctimestring2double: nctimestring2double.c 22 nctimestring2double: nctimestring2double.c
20 ${CC} ${CFLAGS} -o nctimestring2double nctimestring2double.c ${INC} ${LIB} -lDDClientLibC -lnetcdf 23 ${CC} ${CFLAGS} -o nctimestring2double nctimestring2double.c ${INC} ${LIB} -lDDClientLibC -lnetcdf
21 24
@@ -48,7 +51,10 @@ cdfinfo: cdfinfo.c @@ -48,7 +51,10 @@ cdfinfo: cdfinfo.c
48 51
49 cdfvarinfo: cdfvarinfo.c 52 cdfvarinfo: cdfvarinfo.c
50 ${CC} ${CFLAGS} -o cdfvarinfo cdfvarinfo.c ${INC} ${LIB} -lcdf 53 ${CC} ${CFLAGS} -o cdfvarinfo cdfvarinfo.c ${INC} ${LIB} -lcdf
51 - 54 +
  55 +cdfvar_attr: cdfvar_attr.c
  56 + ${CC} ${CFLAGS} -o cdfvar_attr cdfvar_attr.c ${INC} ${LIB} -lcdf
  57 +
52 cdfstartstopfromdata: cdfstartstopfromdata.c 58 cdfstartstopfromdata: cdfstartstopfromdata.c
53 ${CC} ${CFLAGS} -o cdfstartstopfromdata cdfstartstopfromdata.c ${INC} ${LIB} -lcdf 59 ${CC} ${CFLAGS} -o cdfstartstopfromdata cdfstartstopfromdata.c ${INC} ${LIB} -lcdf
54 60
php/src/cdfsamplingfromdata.c
1 -/* $Id: timeResFromData.c,v 1.1 2010/08/31 10:32:55 budnik Exp $ */ 1 +/* $Id: cdf constant samplig from data $ */
2 2
3 -/** @file timeResFromData.c  
4 -* @brief Function to get CDAWEB dataset sampling times from data files  
5 -*/  
6 #include <stdio.h> 3 #include <stdio.h>
7 #include <stdlib.h> 4 #include <stdlib.h>
8 #include <cdf.h> 5 #include <cdf.h>
@@ -46,48 +43,18 @@ void cdf_handle_error(CDFstatus status) @@ -46,48 +43,18 @@ void cdf_handle_error(CDFstatus status)
46 exit(1); 43 exit(1);
47 } 44 }
48 45
49 -void find_min(int* delta, int nRecs, int minFalse, int* minVal)  
50 -{  
51 - int i, n, min;  
52 -  
53 - n = 1;  
54 - i = 0;  
55 - while (abs(delta[i]) <= minFalse) i++;  
56 - if (i < nRecs) {  
57 - min = abs(delta[i]);  
58 - // printf(" first MIN %d \n", min);  
59 - for (i = 1; i < nRecs; i++) {  
60 - // printf(" delta %d \n", delta[i]);  
61 - if (delta[i] == min) n++;  
62 - if (delta[i] < min && delta[i] > minFalse) {  
63 - min = delta[i];  
64 - n = 1;  
65 - }  
66 - }  
67 - } else {  
68 - min = -10;  
69 - n = nRecs;  
70 - }  
71 -  
72 - minVal[0] = min;  
73 - minVal[1] = n;  
74 - printf(" MIN %d %d\n", min, n);  
75 -}  
76 -  
77 int main(int argc, char *argv[]) 46 int main(int argc, char *argv[])
78 { 47 {
79 - long RecStart = 0, RecCount, RecInt = 1; 48 + long RecStart = 0, RecCount = 2, RecInt = 1;
80 long indices[1] = {0}, intervals[1] = {1}, counts[1] = {1}; 49 long indices[1] = {0}, intervals[1] = {1}, counts[1] = {1};
81 long varN = -1; 50 long varN = -1;
82 long datatype = 0, attrN, maxEntry; 51 long datatype = 0, attrN, maxEntry;
83 CDFstatus cstatus; // CDF status code 52 CDFstatus cstatus; // CDF status code
84 CDFid id; 53 CDFid id;
85 double *value; 54 double *value;
86 - int *delta;  
87 int i, minFalse = 0, numEnough; 55 int i, minFalse = 0, numEnough;
88 - int min[2] = {0, 0};  
89 char attrValue[300]; 56 char attrValue[300];
90 - float Sampling; 57 + int sampling;
91 double epoch16[2], dbl_value, dbl_value_; 58 double epoch16[2], dbl_value, dbl_value_;
92 long year, month, day, hour, minute, sec, msec, mksec, nsec, psec; 59 long year, month, day, hour, minute, sec, msec, mksec, nsec, psec;
93 long long *int_value; 60 long long *int_value;
@@ -106,26 +73,27 @@ int main(int argc, char *argv[]) @@ -106,26 +73,27 @@ int main(int argc, char *argv[])
106 if ((cstatus = CDFlib(SELECT_, zVAR_, varN, 73 if ((cstatus = CDFlib(SELECT_, zVAR_, varN,
107 GET_, zVAR_DATATYPE_, &datatype, NULL_)) != CDF_OK) 74 GET_, zVAR_DATATYPE_, &datatype, NULL_)) != CDF_OK)
108 cdf_handle_error (cstatus); 75 cdf_handle_error (cstatus);
109 - // if (datatype == CDF_EPOCH16) break;  
110 } 76 }
  77 +
111 fprintf(stdout,"DATATYPE %d %d\n", varN, datatype); 78 fprintf(stdout,"DATATYPE %d %d\n", varN, datatype);
112 if ((cstatus = CDFlib(SELECT_, zVAR_, varN, 79 if ((cstatus = CDFlib(SELECT_, zVAR_, varN,
113 GET_, zVAR_MAXREC_, &CDFmaxRec, NULL_)) != CDF_OK) 80 GET_, zVAR_MAXREC_, &CDFmaxRec, NULL_)) != CDF_OK)
114 cdf_handle_error (cstatus); 81 cdf_handle_error (cstatus);
115 82
116 fprintf(stdout,"Max Recs %d\n", CDFmaxRec+1); 83 fprintf(stdout,"Max Recs %d\n", CDFmaxRec+1);
117 - if (CDFmaxRec < 10) { 84 +
  85 + if (CDFmaxRec < 3) {
118 fprintf(stdout," %d\n", badFile); 86 fprintf(stdout," %d\n", badFile);
119 exit (0); 87 exit (0);
120 } 88 }
121 89
122 if ( datatype == CDF_TIME_TT2000 ) { 90 if ( datatype == CDF_TIME_TT2000 ) {
123 - int_value = (long long *) malloc (sizeof(long long) * (CDFmaxRec+1)); 91 + int_value = (long long *) malloc (sizeof(long long) * (RecCount+1));
124 /******************* Get Epoch *************************/ 92 /******************* Get Epoch *************************/
125 if ((cstatus = CDFlib (SELECT_, 93 if ((cstatus = CDFlib (SELECT_,
126 zVAR_, varN, 94 zVAR_, varN,
127 zVAR_RECNUMBER_, RecStart, 95 zVAR_RECNUMBER_, RecStart,
128 - zVAR_RECCOUNT_, CDFmaxRec+1, 96 + zVAR_RECCOUNT_, RecCount + 1,
129 zVAR_RECINTERVAL_, RecInt, 97 zVAR_RECINTERVAL_, RecInt,
130 zVAR_DIMINDICES_, indices, 98 zVAR_DIMINDICES_, indices,
131 zVAR_DIMCOUNTS_, counts, 99 zVAR_DIMCOUNTS_, counts,
@@ -134,12 +102,12 @@ int main(int argc, char *argv[]) @@ -134,12 +102,12 @@ int main(int argc, char *argv[])
134 cdf_handle_error (cstatus); 102 cdf_handle_error (cstatus);
135 } 103 }
136 else { 104 else {
137 - value = (double *)malloc(sizeof(double)* (CDFmaxRec+1)*((datatype == CDF_EPOCH16)+1)); 105 + value = (double *)malloc(sizeof(double)* (RecCount + 1)*((datatype == CDF_EPOCH16)+1));
138 /******************* Get Epoch *************************/ 106 /******************* Get Epoch *************************/
139 if ((cstatus = CDFlib (SELECT_, 107 if ((cstatus = CDFlib (SELECT_,
140 zVAR_, varN, 108 zVAR_, varN,
141 zVAR_RECNUMBER_, RecStart, 109 zVAR_RECNUMBER_, RecStart,
142 - zVAR_RECCOUNT_, CDFmaxRec+1, 110 + zVAR_RECCOUNT_, RecCount + 1,
143 zVAR_RECINTERVAL_, RecInt, 111 zVAR_RECINTERVAL_, RecInt,
144 zVAR_DIMINDICES_, indices, 112 zVAR_DIMINDICES_, indices,
145 zVAR_DIMCOUNTS_, counts, 113 zVAR_DIMCOUNTS_, counts,
@@ -147,46 +115,35 @@ int main(int argc, char *argv[]) @@ -147,46 +115,35 @@ int main(int argc, char *argv[])
147 GET_, zVAR_HYPERDATA_, value, NULL_)) != CDF_OK) 115 GET_, zVAR_HYPERDATA_, value, NULL_)) != CDF_OK)
148 cdf_handle_error (cstatus); 116 cdf_handle_error (cstatus);
149 } 117 }
150 -  
151 118
152 -  
153 - delta = (int *)malloc(sizeof(int)* CDFmaxRec);  
154 - for (i = 1; i < CDFmaxRec+1; i++)  
155 - { 119 +
156 if (datatype == CDF_TIME_TT2000) { 120 if (datatype == CDF_TIME_TT2000) {
157 - dbl_value_ = CDF_TT2000_to_UTC_EPOCH(int_value[i-1]);  
158 - dbl_value = CDF_TT2000_to_UTC_EPOCH(int_value[i]);  
159 - delta[i-1] = (int)(dbl_value - dbl_value_ + 50)/100; 121 + dbl_value_ = CDF_TT2000_to_UTC_EPOCH(int_value[0]);
  122 + dbl_value = CDF_TT2000_to_UTC_EPOCH(int_value[1]);
  123 + sampling = (int)(dbl_value - dbl_value_ + 50)/100;
160 } 124 }
161 else { 125 else {
162 if (datatype == CDF_EPOCH16) { 126 if (datatype == CDF_EPOCH16) {
163 - epoch16[0] = value[2*(i-1)];  
164 - epoch16[1] = value[2*(i-1)+1]; 127 + epoch16[0] = value[0];
  128 + epoch16[1] = value[1];
165 EPOCH16breakdown(epoch16, &year, &month, &day, &hour, &minute, &sec, &msec, &mksec, &nsec, &psec); 129 EPOCH16breakdown(epoch16, &year, &month, &day, &hour, &minute, &sec, &msec, &mksec, &nsec, &psec);
166 - value[i-1] = computeEPOCH(year, month, day, hour, minute, sec, msec);  
167 - epoch16[0] = value[2*i];  
168 - epoch16[1] = value[2*i+1]; 130 + value[0] = computeEPOCH(year, month, day, hour, minute, sec, msec);
  131 + epoch16[0] = value[2];
  132 + epoch16[1] = value[3];
169 EPOCH16breakdown(epoch16, &year, &month, &day, &hour, &minute, &sec, &msec, &mksec, &nsec, &psec); 133 EPOCH16breakdown(epoch16, &year, &month, &day, &hour, &minute, &sec, &msec, &mksec, &nsec, &psec);
170 - value[i] = computeEPOCH(year, month, day, hour, minute, sec, msec); 134 + value[1] = computeEPOCH(year, month, day, hour, minute, sec, msec);
171 } 135 }
172 - delta[i-1] = (int)(value[i] - value[i-1] + 50)/100; 136 + sampling = (int)(value[1] - value[0] + 50)/100;
173 } 137 }
174 - } 138 +
175 // fprintf(stdout,"value %f\n", value[11]-value[10]); 139 // fprintf(stdout,"value %f\n", value[11]-value[10]);
176 if (datatype == CDF_TIME_TT2000) free(int_value); 140 if (datatype == CDF_TIME_TT2000) free(int_value);
177 else free(value); 141 else free(value);
178 - // fprintf(stdout,"delta %d\n", delta[0]);  
179 - numEnough = CDFmaxRec/10;  
180 - while (min[1] < numEnough) {  
181 - fprintf(stdout,"minFalse %d\n", minFalse);  
182 - find_min(delta, CDFmaxRec, minFalse, min);  
183 - minFalse = min[0];  
184 - } 142 +
185 143
186 - free(delta);  
187 if ((cstatus = CDFlib(CLOSE_, CDF_, NULL_)) != CDF_OK) 144 if ((cstatus = CDFlib(CLOSE_, CDF_, NULL_)) != CDF_OK)
188 cdf_handle_error (cstatus); 145 cdf_handle_error (cstatus);
189 146
190 // fprintf(stdout,"%d %f\n",min[1], (float)min[0]/100.0); 147 // fprintf(stdout,"%d %f\n",min[1], (float)min[0]/100.0);
191 - fprintf(stdout,"%f\n",(float)min[0]/10.0); 148 + fprintf(stdout,"%f\n",(float)sampling/10.0);
192 } 149 }
php/src/cdfsamplingsfromdata.c 0 → 100644
@@ -0,0 +1,192 @@ @@ -0,0 +1,192 @@
  1 +/* $Id: timeResFromData.c,v 1.1 2010/08/31 10:32:55 budnik Exp $ */
  2 +
  3 +/** @file timeResFromData.c
  4 +* @brief Function to get CDAWEB dataset sampling times from data files
  5 +*/
  6 +#include <stdio.h>
  7 +#include <stdlib.h>
  8 +#include <cdf.h>
  9 +#include <string.h>
  10 +#include <time.h>
  11 +#include <math.h>
  12 +
  13 +#define fileName "temp.cdf"
  14 +#define badFile -100
  15 +
  16 +/*************************************
  17 + Global variables and structures
  18 +**************************************/
  19 +long CDFDims, // Number of dimensions in a CDF file
  20 + CDFVars, // Number of variables in a CDF file
  21 + CDFDimSizes[CDF_MAX_DIMS], // Dimension Sizes in a CDF file
  22 + CDFencoding, // Data encoding
  23 + CDFmajority, // Variable majority
  24 + CDFmaxRec, // max Record number
  25 + CDFAttrs; // number of CDF Attributes
  26 +// CDFdatatype;
  27 +
  28 +struct cdfvar { // CDF variable structure
  29 + char name[CDF_VAR_NAME_LEN+1];
  30 + long num; //variable number
  31 + long datatype;
  32 + long numElem; // variable dimensionality
  33 + long recVariance; // variable rec Variance
  34 + long dimVariances[CDF_MAX_DIMS]; // # of data values in dimSizes
  35 +} cdfVar;
  36 +
  37 +/*--------------------------------------------------------------------------
  38 + * Handles a CDF error.
  39 + *--------------------------------------------------------------------------*/
  40 +void cdf_handle_error(CDFstatus status)
  41 +{
  42 + char message[CDF_STATUSTEXT_LEN+1];
  43 +
  44 + CDFerror (status, message); /* Get the appropriate message */
  45 + fprintf (stderr, "%s\n", message);
  46 + exit(1);
  47 +}
  48 +
  49 +void find_min(int* delta, int nRecs, int minFalse, int* minVal)
  50 +{
  51 + int i, n, min;
  52 +
  53 + n = 1;
  54 + i = 0;
  55 + while (abs(delta[i]) <= minFalse) i++;
  56 + if (i < nRecs) {
  57 + min = abs(delta[i]);
  58 + // printf(" first MIN %d \n", min);
  59 + for (i = 1; i < nRecs; i++) {
  60 + // printf(" delta %d \n", delta[i]);
  61 + if (delta[i] == min) n++;
  62 + if (delta[i] < min && delta[i] > minFalse) {
  63 + min = delta[i];
  64 + n = 1;
  65 + }
  66 + }
  67 + } else {
  68 + min = -10;
  69 + n = nRecs;
  70 + }
  71 +
  72 + minVal[0] = min;
  73 + minVal[1] = n;
  74 + printf(" MIN %d %d\n", min, n);
  75 +}
  76 +
  77 +int main(int argc, char *argv[])
  78 +{
  79 + long RecStart = 0, RecCount, RecInt = 1;
  80 + long indices[1] = {0}, intervals[1] = {1}, counts[1] = {1};
  81 + long varN = -1;
  82 + long datatype = 0, attrN, maxEntry;
  83 + CDFstatus cstatus; // CDF status code
  84 + CDFid id;
  85 + double *value;
  86 + int *delta;
  87 + int i, minFalse = 0, numEnough;
  88 + int min[2] = {0, 0};
  89 + char attrValue[300];
  90 + float Sampling;
  91 + double epoch16[2], dbl_value, dbl_value_;
  92 + long year, month, day, hour, minute, sec, msec, mksec, nsec, psec;
  93 + long long *int_value;
  94 +
  95 +/*********************** Open CDF file *****************************/
  96 + if ((cstatus = CDFopen(fileName, &id)) != CDF_OK)
  97 + cdf_handle_error(cstatus);
  98 +
  99 +/*********** treat all vars as zVars with eliminated false dimensionality and get Nrecs **********/
  100 +
  101 + if ((cstatus = CDFlib(SELECT_, CDF_zMODE_, zMODEon2, NULL_)) != CDF_OK)
  102 + cdf_handle_error (cstatus);
  103 +
  104 + while (datatype != CDF_EPOCH && datatype != CDF_EPOCH16 && datatype != CDF_TIME_TT2000){
  105 + varN++;
  106 + if ((cstatus = CDFlib(SELECT_, zVAR_, varN,
  107 + GET_, zVAR_DATATYPE_, &datatype, NULL_)) != CDF_OK)
  108 + cdf_handle_error (cstatus);
  109 + // if (datatype == CDF_EPOCH16) break;
  110 + }
  111 + fprintf(stdout,"DATATYPE %d %d\n", varN, datatype);
  112 + if ((cstatus = CDFlib(SELECT_, zVAR_, varN,
  113 + GET_, zVAR_MAXREC_, &CDFmaxRec, NULL_)) != CDF_OK)
  114 + cdf_handle_error (cstatus);
  115 +
  116 + fprintf(stdout,"Max Recs %d\n", CDFmaxRec+1);
  117 + if (CDFmaxRec < 10) {
  118 + fprintf(stdout," %d\n", badFile);
  119 + exit (0);
  120 + }
  121 +
  122 + if ( datatype == CDF_TIME_TT2000 ) {
  123 + int_value = (long long *) malloc (sizeof(long long) * (CDFmaxRec+1));
  124 + /******************* Get Epoch *************************/
  125 + if ((cstatus = CDFlib (SELECT_,
  126 + zVAR_, varN,
  127 + zVAR_RECNUMBER_, RecStart,
  128 + zVAR_RECCOUNT_, CDFmaxRec+1,
  129 + zVAR_RECINTERVAL_, RecInt,
  130 + zVAR_DIMINDICES_, indices,
  131 + zVAR_DIMCOUNTS_, counts,
  132 + zVAR_DIMINTERVALS_, intervals,
  133 + GET_, zVAR_HYPERDATA_, int_value, NULL_)) != CDF_OK)
  134 + cdf_handle_error (cstatus);
  135 + }
  136 + else {
  137 + value = (double *)malloc(sizeof(double)* (CDFmaxRec+1)*((datatype == CDF_EPOCH16)+1));
  138 + /******************* Get Epoch *************************/
  139 + if ((cstatus = CDFlib (SELECT_,
  140 + zVAR_, varN,
  141 + zVAR_RECNUMBER_, RecStart,
  142 + zVAR_RECCOUNT_, CDFmaxRec+1,
  143 + zVAR_RECINTERVAL_, RecInt,
  144 + zVAR_DIMINDICES_, indices,
  145 + zVAR_DIMCOUNTS_, counts,
  146 + zVAR_DIMINTERVALS_, intervals,
  147 + GET_, zVAR_HYPERDATA_, value, NULL_)) != CDF_OK)
  148 + cdf_handle_error (cstatus);
  149 + }
  150 +
  151 +
  152 +
  153 + delta = (int *)malloc(sizeof(int)* CDFmaxRec);
  154 + for (i = 1; i < CDFmaxRec+1; i++)
  155 + {
  156 + if (datatype == CDF_TIME_TT2000) {
  157 + dbl_value_ = CDF_TT2000_to_UTC_EPOCH(int_value[i-1]);
  158 + dbl_value = CDF_TT2000_to_UTC_EPOCH(int_value[i]);
  159 + delta[i-1] = (int)(dbl_value - dbl_value_ + 50)/100;
  160 + }
  161 + else {
  162 + if (datatype == CDF_EPOCH16) {
  163 + epoch16[0] = value[2*(i-1)];
  164 + epoch16[1] = value[2*(i-1)+1];
  165 + EPOCH16breakdown(epoch16, &year, &month, &day, &hour, &minute, &sec, &msec, &mksec, &nsec, &psec);
  166 + value[i-1] = computeEPOCH(year, month, day, hour, minute, sec, msec);
  167 + epoch16[0] = value[2*i];
  168 + epoch16[1] = value[2*i+1];
  169 + EPOCH16breakdown(epoch16, &year, &month, &day, &hour, &minute, &sec, &msec, &mksec, &nsec, &psec);
  170 + value[i] = computeEPOCH(year, month, day, hour, minute, sec, msec);
  171 + }
  172 + delta[i-1] = (int)(value[i] - value[i-1] + 50)/100;
  173 + }
  174 + }
  175 + // fprintf(stdout,"value %f\n", value[11]-value[10]);
  176 + if (datatype == CDF_TIME_TT2000) free(int_value);
  177 + else free(value);
  178 + // fprintf(stdout,"delta %d\n", delta[0]);
  179 + numEnough = CDFmaxRec/10;
  180 + while (min[1] < numEnough) {
  181 + fprintf(stdout,"minFalse %d\n", minFalse);
  182 + find_min(delta, CDFmaxRec, minFalse, min);
  183 + minFalse = min[0];
  184 + }
  185 +
  186 + free(delta);
  187 + if ((cstatus = CDFlib(CLOSE_, CDF_, NULL_)) != CDF_OK)
  188 + cdf_handle_error (cstatus);
  189 +
  190 + // fprintf(stdout,"%d %f\n",min[1], (float)min[0]/100.0);
  191 + fprintf(stdout,"%f\n",(float)min[0]/10.0);
  192 +}
php/src/cdfvar_attr.c 0 → 100644
@@ -0,0 +1,292 @@ @@ -0,0 +1,292 @@
  1 +/**
  2 +* @file cdfvarinfo.c
  3 +* @version $Id: cdfvarinfo.c,v 1.1 2010/08/31 10:32:55 budnik Exp $
  4 +* @brief
  5 +*/
  6 +
  7 +
  8 +#include <stdio.h>
  9 +#include <stdlib.h>
  10 +#include <cdf.h>
  11 +#include <string.h>
  12 +
  13 +#define MAX_FILE_NAME_LEN 120
  14 +
  15 +void cdf_status_handler (CDFstatus, char *);
  16 +char * cdf_str_datatype (long);
  17 +
  18 +typedef struct cdfvar { /* CDF variable structure */
  19 + char name[CDF_VAR_NAME_LEN+1];
  20 + long datatype;
  21 + long numElements; /* string length for CDF_CHAR, 1 otherwise */
  22 + long dimensionality; /* variable dimensionality */
  23 + long dimSizes[CDF_MAX_DIMS]; /* variable dimension sizes */
  24 + long recVariance; /* record variance */
  25 + long numRecs; /* # of records this variable contains */
  26 +} CDFvar;
  27 +
  28 +int main(int argc, char *argv[])
  29 +{
  30 +
  31 + CDFvar var;
  32 + CDFid id; /* CDF file ID */
  33 + CDFstatus status; /* CDF status code */
  34 +
  35 + long nZvars, nAttrs, attrId, attrScope, varId, datatype, numElements;
  36 + char attrName[CDF_ATTR_NAME_LEN+1];
  37 + char fileName[MAX_FILE_NAME_LEN], varName[CDF_VAR_NAME_LEN+1], attName[CDF_ATTR_NAME_LEN+1];
  38 + char msg[100];
  39 + int dummy, i;
  40 + char *cPtr;
  41 + signed char *scPtr;
  42 + short *sPtr;
  43 + int *iPtr;
  44 + float *fPtr;
  45 + double *dPtr;
  46 +
  47 +
  48 + if (argc <= 3)
  49 + exit(0); /* CDF input file name not specified */
  50 + else {
  51 + strcpy(fileName, argv[1]); /* Get the input file name */
  52 + strcpy(varName, argv[2]);
  53 + strcpy(attName, argv[3]);
  54 + }
  55 +
  56 + status = CDFlib (OPEN_, CDF_, fileName, &id, NULL_);
  57 +
  58 + if (status != CDF_OK) {
  59 + strcpy(msg, "OPEN_, CDF_, ");
  60 + strcat(msg, fileName);
  61 + cdf_status_handler (status, msg);
  62 + }
  63 +
  64 + /*---------------------------------------------------------------------------
  65 + * This routine retrievs the following information:
  66 + *
  67 + * nAttr - number of attributes (including global and variable)
  68 + * nZvars - number of zVariables
  69 + *
  70 + * CDF file can have both rVariables (old style) and zVariables (new style)
  71 + * simultaneously. zVariable is a superset of rVariable, and it is a lot
  72 + * more efficient and offers all the functionality a rVariable offers and
  73 + * more. Treat all CDF variables as zVariables.
  74 + *--------------------------------------------------------------------------*/
  75 +
  76 + status = CDFlib (SELECT_, CDF_zMODE_, zMODEon2,
  77 + GET_, CDF_NUMATTRS_, &nAttrs,
  78 + CDF_NUMzVARS_, &nZvars,
  79 + NULL_);
  80 + if (status != CDF_OK) cdf_status_handler(status, "GET_, CDF_FILEINFO_");
  81 +
  82 + // printf(" nAttrs %d Zvars %d\n",nAttrs, nZvars);
  83 + // printf ("Attributes:\n");
  84 +
  85 + for (attrId = 0; attrId < nAttrs; attrId++) {
  86 + status = CDFlib (SELECT_, ATTR_, attrId,
  87 + GET_, ATTR_NAME_, attrName, ATTR_SCOPE_, &attrScope,
  88 + NULL_);
  89 +
  90 + if (status != CDF_OK) cdf_status_handler (status, "SELECT_, ATTR_");
  91 + // printf("Attr %d %s %d\n", attrId, attrName, attrScope);
  92 + }
  93 +
  94 + // printf ("Variables:\n");
  95 + for (varId=0; varId < nZvars; varId++)
  96 + {
  97 + status = CDFlib (SELECT_,zVAR_, varId,
  98 + GET_, zVAR_NAME_, var.name,
  99 + zVAR_DATATYPE_, &var.datatype,
  100 + zVAR_NUMELEMS_, &var.numElements,
  101 + zVAR_NUMDIMS_, &var.dimensionality,
  102 + zVAR_DIMSIZES_, var.dimSizes,
  103 + zVAR_NUMRECS_, &var.numRecs,
  104 + zVAR_RECVARY_, &var.recVariance,
  105 + NULL_);
  106 + if (status != CDF_OK) cdf_status_handler (status, "GET_, zVARS_");
  107 +
  108 + if (strcmp(var.name, varName) == 0)
  109 + {
  110 + for (attrId = 0; attrId < nAttrs; attrId++) {
  111 + status = CDFlib (SELECT_, ATTR_, attrId,
  112 + GET_, ATTR_NAME_, attrName, ATTR_SCOPE_, &attrScope,
  113 + NULL_);
  114 +
  115 + if (status != CDF_OK) cdf_status_handler (status, "SELECT_, ATTR_");
  116 + if (attrScope == GLOBAL_SCOPE) continue;
  117 + if (strcasecmp(attrName, attName) != 0) continue;
  118 +
  119 + // printf("%d %s ", attrId, attrName);
  120 +
  121 + status = CDFlib (SELECT_, zENTRY_, varId,
  122 + GET_, zENTRY_DATATYPE_, &datatype,
  123 + zENTRY_NUMELEMS_, &numElements,
  124 + NULL_);
  125 + //printf("%d %s", numElements,cdf_str_datatype(datatype));
  126 + if (status == NO_SUCH_ENTRY) continue;
  127 +
  128 + if (status != CDF_OK) cdf_status_handler (status,"GET_ATTR_INFO_");
  129 +
  130 + switch (datatype)
  131 + {
  132 + case CDF_CHAR:
  133 + cPtr = (char *) malloc(numElements * sizeof(char) + 1);
  134 +
  135 + status = CDFlib (GET_, zENTRY_DATA_, cPtr, NULL_);
  136 + if (status != CDF_OK) cdf_status_handler (status, msg);
  137 + strcpy(&cPtr[numElements],"\0");
  138 + printf("%s\n", cPtr);
  139 + free(cPtr);
  140 + break;
  141 +
  142 + case CDF_BYTE:
  143 + case CDF_INT1:
  144 + scPtr = (signed char *) malloc (sizeof(signed char) * numElements);
  145 + status = CDFlib (GET_, zENTRY_DATA_, scPtr, NULL_);
  146 + if (status != CDF_OK) cdf_status_handler (status, msg);
  147 + free (scPtr);
  148 + break;
  149 +
  150 + case CDF_INT2:
  151 + case CDF_UCHAR:
  152 + case CDF_UINT1:
  153 + sPtr = (short *) malloc (sizeof(short) * numElements);
  154 + status = CDFlib (GET_, zENTRY_DATA_, sPtr, NULL_);
  155 + if (status != CDF_OK) cdf_status_handler (status, msg);
  156 + free (sPtr);
  157 + break;
  158 +
  159 + case CDF_INT4:
  160 + case CDF_UINT2:
  161 + iPtr = (int *) malloc (sizeof(int) * numElements);
  162 + status = CDFlib (GET_, zENTRY_DATA_, iPtr, NULL_);
  163 + if (status != CDF_OK) cdf_status_handler (status, msg);
  164 + printf("%d\n", *iPtr);
  165 + free (iPtr);
  166 + break;
  167 +
  168 + case CDF_FLOAT:
  169 + case CDF_REAL4:
  170 + fPtr = (float *) malloc (sizeof(float) * numElements);
  171 + status = CDFlib (GET_, zENTRY_DATA_, fPtr, NULL_);
  172 + if (status != CDF_OK) cdf_status_handler (status, msg);
  173 + printf("%8.1e\n", *fPtr);
  174 + free (fPtr);
  175 + break;
  176 +
  177 + case CDF_DOUBLE:
  178 + case CDF_REAL8:
  179 + case CDF_UINT4:
  180 + dPtr = (double *) malloc (sizeof(double) * numElements);
  181 +
  182 + status = CDFlib (GET_, zENTRY_DATA_, dPtr, NULL_);
  183 + if (status != CDF_OK) cdf_status_handler (status, msg);
  184 + printf("%8.1e\n", *dPtr);
  185 + free (dPtr);
  186 + break;
  187 +
  188 + case CDF_EPOCH: /* 8-byte real number */
  189 + dPtr = (double *) malloc (sizeof(double) * numElements);
  190 +
  191 + status = CDFlib (GET_, zENTRY_DATA_, dPtr, NULL_);
  192 + if (status != CDF_OK) cdf_status_handler (status, msg);
  193 +
  194 + free (dPtr);
  195 + break;
  196 +
  197 + case CDF_EPOCH16: /* 16-byte real number */
  198 + dPtr = (double *) malloc (sizeof(double) * numElements * 2);
  199 + status = CDFlib (GET_, zENTRY_DATA_, dPtr, NULL_);
  200 + if (status != CDF_OK) cdf_status_handler (status, msg);
  201 + free (dPtr);
  202 + break;
  203 +
  204 + default:
  205 + printf ("** Error in get_cdf_attribute: bad data type");
  206 + }
  207 + }
  208 + break;
  209 + }
  210 + }
  211 +
  212 + /* Close the CDF file */
  213 + status = CDFlib (CLOSE_, CDF_, NULL_);
  214 +
  215 +}
  216 +
  217 +
  218 +void cdf_status_handler (CDFstatus status, char *source)
  219 +{
  220 + char message[CDF_STATUSTEXT_LEN+1];
  221 +
  222 + CDFerror (status, message); /* Get the appropriate message */
  223 +
  224 + if (status < CDF_WARN) {
  225 + printf ("An error has occurred, halting...\n");
  226 + printf ("%s\n", message);
  227 + printf ("** Error source: %s\n", source);
  228 + exit (status);
  229 + }
  230 + else if (status < CDF_OK) {
  231 + printf ("Warning, function may not have compeleted as expected...\n");
  232 + printf ("%s\n", message);
  233 + }
  234 + else if (status > CDF_OK) {
  235 + printf ("Function compeleted successfully, but be advised that...\n");
  236 + printf ("%s\n", message);
  237 + }
  238 +}
  239 +
  240 +/*--------------------------------------------------------------------------
  241 + * This routine returns the string representation of the given CDF
  242 + * datatype.
  243 + *--------------------------------------------------------------------------*/
  244 +char * cdf_str_datatype (long type)
  245 +{
  246 + switch (type) {
  247 + case CDF_BYTE:
  248 + return "CDF_BYTE";
  249 +
  250 + case CDF_INT1:
  251 + return "CDF_INT1";
  252 +
  253 + case CDF_CHAR:
  254 + return "CDF_CHAR";
  255 +
  256 + case CDF_INT2:
  257 + return "CDF_INT2";
  258 +
  259 + case CDF_UCHAR:
  260 + return "CDF_UCHAR";
  261 +
  262 + case CDF_UINT1:
  263 + return "CDF_UINT1";
  264 +
  265 + case CDF_INT4:
  266 + return "CDF_INT4";
  267 +
  268 + case CDF_UINT2:
  269 + return "CDF_UINT2";
  270 +
  271 + case CDF_FLOAT:
  272 + return "CDF_FLOAT";
  273 +
  274 + case CDF_REAL4:
  275 + return "CDF_REAL4";
  276 +
  277 + case CDF_DOUBLE:
  278 + return "CDF_DOUBLE";
  279 +
  280 + case CDF_REAL8:
  281 + return "CDF_REAL8";
  282 +
  283 + case CDF_UINT4:
  284 + return "CDF_UINT4";
  285 +
  286 + case CDF_EPOCH:
  287 + return "CDF_EPOCH";
  288 +
  289 + case CDF_EPOCH16:
  290 + return "CDF_EPOCH16";
  291 + }
  292 +}
php/src/cdfvarinfo.c
@@ -16,49 +16,42 @@ void cdf_status_handler (CDFstatus, char *); @@ -16,49 +16,42 @@ void cdf_status_handler (CDFstatus, char *);
16 char * cdf_str_datatype (long); 16 char * cdf_str_datatype (long);
17 17
18 typedef struct cdfvar { /* CDF variable structure */ 18 typedef struct cdfvar { /* CDF variable structure */
19 - char name[CDF_VAR_NAME_LEN+1];  
20 - long datatype;  
21 - long numElements; /* string length for CDF_CHAR, 1 otherwise */  
22 - long dimensionality; /* variable dimensionality */  
23 - long dimSizes[CDF_MAX_DIMS]; /* variable dimension sizes */  
24 - long recVariance; /* record variance */  
25 - long numRecs; /* # of records this variable contains */ 19 + char name[CDF_VAR_NAME_LEN+1];
  20 + long datatype;
  21 + long numElements; /* string length for CDF_CHAR, 1 otherwise */
  22 + long dimensionality; /* variable dimensionality */
  23 + long dimSizes[CDF_MAX_DIMS]; /* variable dimension sizes */
  24 + long recVariance; /* record variance */
  25 + long numRecs; /* # of records this variable contains */
26 } CDFvar; 26 } CDFvar;
27 27
28 int main(int argc, char *argv[]) 28 int main(int argc, char *argv[])
29 -{  
30 -  
31 - CDFvar var;  
32 - CDFid id; /* CDF file ID */  
33 - CDFstatus status; /* CDF status code */  
34 -  
35 - long nZvars, nAttrs, attrId, attrScope, varId, datatype, numElements;  
36 - char attrName[CDF_ATTR_NAME_LEN+1];  
37 - char fileName[MAX_FILE_NAME_LEN], varName[CDF_VAR_NAME_LEN+1];  
38 - char msg[100];  
39 - int dummy, i;  
40 - char *cPtr;  
41 - signed char *scPtr;  
42 - short *sPtr;  
43 - int *iPtr;  
44 - float *fPtr;  
45 - double *dPtr; 29 +{
  30 + CDFvar var;
  31 + CDFid id; /* CDF file ID */
  32 + CDFstatus status; /* CDF status code */
  33 +
  34 + long nZvars, nAttrs, attrId, attrScope, varId, datatype, numElements;
  35 + char attrName[CDF_ATTR_NAME_LEN+1];
  36 + char fileName[MAX_FILE_NAME_LEN], varName[CDF_VAR_NAME_LEN+1];
  37 + char msg[100];
  38 + int dummy, i;
46 39
47 40
48 - if (argc <= 2)  
49 - exit(0); /* CDF input file name not specified */  
50 - else {  
51 - strcpy(fileName, argv[1]); /* Get the input file name */  
52 - strcpy(varName, argv[2]);  
53 - } 41 + if (argc <= 2)
  42 + exit(0); /* CDF input file name not specified */
  43 + else {
  44 + strcpy(fileName, argv[1]); /* Get the input file name */
  45 + strcpy(varName, argv[2]);
  46 + }
54 47
55 - status = CDFlib (OPEN_, CDF_, fileName, &id, NULL_); 48 + status = CDFlib (OPEN_, CDF_, fileName, &id, NULL_);
56 49
57 - if (status != CDF_OK) {  
58 - strcpy(msg, "OPEN_, CDF_, ");  
59 - strcat(msg, fileName);  
60 - cdf_status_handler (status, msg);  
61 - } 50 + if (status != CDF_OK) {
  51 + strcpy(msg, "OPEN_, CDF_, ");
  52 + strcat(msg, fileName);
  53 + cdf_status_handler (status, msg);
  54 + }
62 55
63 /*--------------------------------------------------------------------------- 56 /*---------------------------------------------------------------------------
64 * This routine retrievs the following information: 57 * This routine retrievs the following information:
@@ -72,225 +65,114 @@ int main(int argc, char *argv[]) @@ -72,225 +65,114 @@ int main(int argc, char *argv[])
72 * more. Treat all CDF variables as zVariables. 65 * more. Treat all CDF variables as zVariables.
73 *--------------------------------------------------------------------------*/ 66 *--------------------------------------------------------------------------*/
74 67
75 - status = CDFlib (SELECT_, CDF_zMODE_, zMODEon2,  
76 - GET_, CDF_NUMATTRS_, &nAttrs,  
77 - CDF_NUMzVARS_, &nZvars,  
78 - NULL_);  
79 - if (status != CDF_OK) cdf_status_handler(status, "GET_, CDF_FILEINFO_");  
80 -  
81 - // printf(" nAttrs %d Zvars %d\n",nAttrs, nZvars);  
82 -  
83 -// printf ("Attributes:\n");  
84 -  
85 - for (attrId = 0; attrId < nAttrs; attrId++) {  
86 - status = CDFlib (SELECT_, ATTR_, attrId,  
87 - GET_, ATTR_NAME_, attrName, ATTR_SCOPE_, &attrScope,  
88 - NULL_);  
89 - if (status != CDF_OK) cdf_status_handler (status, "SELECT_, ATTR_");  
90 -  
91 -  
92 - // printf("Attr %d %s %d\n", attrId, attrName, attrScope);  
93 - }  
94 -  
95 - // printf ("Variables:\n");  
96 - for (varId=0; varId < nZvars; varId++) {  
97 -  
98 - status = CDFlib (SELECT_,zVAR_, varId,  
99 - GET_, zVAR_NAME_, var.name,  
100 - zVAR_DATATYPE_, &var.datatype,  
101 - zVAR_NUMELEMS_, &var.numElements,  
102 - zVAR_NUMDIMS_, &var.dimensionality,  
103 - zVAR_DIMSIZES_, var.dimSizes,  
104 - zVAR_NUMRECS_, &var.numRecs,  
105 - zVAR_RECVARY_, &var.recVariance,  
106 - NULL_);  
107 - if (status != CDF_OK) cdf_status_handler (status, "GET_, zVARS_"); 68 + status = CDFlib (SELECT_, CDF_zMODE_, zMODEon2,
  69 + GET_, CDF_NUMATTRS_, &nAttrs,
  70 + CDF_NUMzVARS_, &nZvars,
  71 + NULL_);
  72 +
  73 + if (status != CDF_OK) cdf_status_handler(status, "GET_, CDF_FILEINFO_");
  74 +
  75 + for (varId=0; varId < nZvars; varId++)
  76 + {
  77 + status = CDFlib (SELECT_,zVAR_, varId,
  78 + GET_, zVAR_NAME_, var.name,
  79 + zVAR_DATATYPE_, &var.datatype,
  80 + zVAR_NUMELEMS_, &var.numElements,
  81 + zVAR_NUMDIMS_, &var.dimensionality,
  82 + zVAR_DIMSIZES_, var.dimSizes,
  83 + zVAR_NUMRECS_, &var.numRecs,
  84 + zVAR_RECVARY_, &var.recVariance,
  85 + NULL_);
  86 +
  87 + if (status != CDF_OK) cdf_status_handler (status, "GET_, zVARS_");
108 88
109 - if (strcmp(var.name, varName) == 0) {  
110 -  
111 - printf("%s %d %d ", cdf_str_datatype(var.datatype), var.dimensionality, var.numRecs);  
112 - for (i = 0; i < var.dimensionality; i++) printf("%d ",var.dimSizes[i]);  
113 - printf("\n");  
114 -  
115 - for (attrId = 0; attrId < nAttrs; attrId++) {  
116 - status = CDFlib (SELECT_, ATTR_, attrId,  
117 - GET_, ATTR_NAME_, attrName,  
118 - ATTR_SCOPE_, &attrScope,  
119 - NULL_);  
120 -  
121 - if (status != CDF_OK) cdf_status_handler (status, "SELECT_, ATTR_");  
122 - if (attrScope == GLOBAL_SCOPE) continue;  
123 -//printf("\n%d %s ", attrId, attrName);  
124 - status = CDFlib (SELECT_, zENTRY_, varId,  
125 - GET_, zENTRY_DATATYPE_, &datatype,  
126 - zENTRY_NUMELEMS_, &numElements,  
127 - NULL_);  
128 -//printf("%d %s", numElements,cdf_str_datatype(datatype));  
129 - if (status == NO_SUCH_ENTRY) continue;  
130 -  
131 - if (status != CDF_OK) cdf_status_handler (status,"GET_ATTR_INFO_");  
132 -  
133 - switch (datatype) {  
134 - case CDF_CHAR:  
135 - cPtr = (char *) malloc(numElements * sizeof(char) + 1);  
136 - status = CDFlib (GET_, zENTRY_DATA_, cPtr, NULL_);  
137 - if (status != CDF_OK) cdf_status_handler (status, msg);  
138 -// printf(" %s", cPtr);  
139 - free(cPtr);  
140 - break;  
141 -  
142 - case CDF_BYTE:  
143 - case CDF_INT1:  
144 - scPtr = (signed char *) malloc (sizeof(signed char) * numElements);  
145 - status = CDFlib (GET_, zENTRY_DATA_, scPtr, NULL_);  
146 - if (status != CDF_OK) cdf_status_handler (status, msg);  
147 - free (scPtr);  
148 - break;  
149 -  
150 - case CDF_INT2:  
151 - case CDF_UCHAR:  
152 - case CDF_UINT1:  
153 - sPtr = (short *) malloc (sizeof(short) * numElements);  
154 - status = CDFlib (GET_, zENTRY_DATA_, sPtr, NULL_);  
155 - if (status != CDF_OK) cdf_status_handler (status, msg);  
156 - free (sPtr);  
157 - break;  
158 -  
159 - case CDF_INT4:  
160 - case CDF_UINT2:  
161 - iPtr = (int *) malloc (sizeof(int) * numElements);  
162 - status = CDFlib (GET_, zENTRY_DATA_, iPtr, NULL_);  
163 - if (status != CDF_OK) cdf_status_handler (status, msg);  
164 - free (iPtr);  
165 - break;  
166 -  
167 - case CDF_FLOAT:  
168 - case CDF_REAL4:  
169 - fPtr = (float *) malloc (sizeof(float) * numElements);  
170 - status = CDFlib (GET_, zENTRY_DATA_, fPtr, NULL_);  
171 - if (status != CDF_OK) cdf_status_handler (status, msg);  
172 - free (fPtr);  
173 - break;  
174 -  
175 - case CDF_DOUBLE:  
176 - case CDF_REAL8:  
177 - case CDF_UINT4:  
178 - dPtr = (double *) malloc (sizeof(double) * numElements);  
179 -  
180 - status = CDFlib (GET_, zENTRY_DATA_, dPtr, NULL_);  
181 - if (status != CDF_OK) cdf_status_handler (status, msg);  
182 -  
183 - free (dPtr);  
184 - break;  
185 -  
186 - case CDF_EPOCH: /* 8-byte real number */  
187 - dPtr = (double *) malloc (sizeof(double) * numElements);  
188 -  
189 - status = CDFlib (GET_, zENTRY_DATA_, dPtr, NULL_);  
190 - if (status != CDF_OK) cdf_status_handler (status, msg);  
191 -  
192 - free (dPtr);  
193 - break;  
194 -  
195 - case CDF_EPOCH16: /* 16-byte real number */  
196 - dPtr = (double *) malloc (sizeof(double) * numElements * 2);  
197 - status = CDFlib (GET_, zENTRY_DATA_, dPtr, NULL_);  
198 - if (status != CDF_OK) cdf_status_handler (status, msg);  
199 - free (dPtr);  
200 - break;  
201 -  
202 - default:  
203 - printf ("** Error in get_cdf_attribute: bad data type");  
204 - }  
205 -  
206 - }  
207 - break; 89 + if (strcmp(var.name, varName) == 0)
  90 + {
  91 + printf("%s %d %d ", cdf_str_datatype(var.datatype), var.dimensionality, var.numRecs);
  92 + for (i = 0; i < var.dimensionality; i++) printf("%d ",var.dimSizes[i]);
  93 +
  94 + printf("\n");
  95 + break;
  96 + }
208 } 97 }
209 - }  
210 -  
211 -  
212 -  
213 - /* Close the CDF file */  
214 - status = CDFlib (CLOSE_, CDF_, NULL_);  
215 - 98 +
  99 + /* Close the CDF file */
  100 + status = CDFlib (CLOSE_, CDF_, NULL_);
216 } 101 }
217 102
218 103
219 -  
220 -  
221 void cdf_status_handler (CDFstatus status, char *source) 104 void cdf_status_handler (CDFstatus status, char *source)
222 { 105 {
223 - char message[CDF_STATUSTEXT_LEN+1]; 106 + char message[CDF_STATUSTEXT_LEN+1];
224 107
225 - CDFerror (status, message); /* Get the appropriate message */ 108 + CDFerror (status, message); /* Get the appropriate message */
226 109
227 - if (status < CDF_WARN) {  
228 - printf ("An error has occurred, halting...\n");  
229 - printf ("%s\n", message);  
230 - printf ("** Error source: %s\n", source);  
231 - exit (status);  
232 - }  
233 - else if (status < CDF_OK) {  
234 - printf ("Warning, function may not have compeleted as expected...\n");  
235 - printf ("%s\n", message);  
236 - }  
237 - else if (status > CDF_OK) {  
238 - printf ("Function compeleted successfully, but be advised that...\n");  
239 - printf ("%s\n", message);  
240 - }  
241 -  
242 - 110 + if (status < CDF_WARN) {
  111 + printf ("An error has occurred, halting...\n");
  112 + printf ("%s\n", message);
  113 + printf ("** Error source: %s\n", source);
  114 + exit (status);
  115 + }
  116 + else if (status < CDF_OK) {
  117 + printf ("Warning, function may not have compeleted as expected...\n");
  118 + printf ("%s\n", message);
  119 + }
  120 + else if (status > CDF_OK) {
  121 + printf ("Function compeleted successfully, but be advised that...\n");
  122 + printf ("%s\n", message);
  123 + }
243 } 124 }
  125 +
244 /*-------------------------------------------------------------------------- 126 /*--------------------------------------------------------------------------
245 * This routine returns the string representation of the given CDF 127 * This routine returns the string representation of the given CDF
246 * datatype. 128 * datatype.
247 *--------------------------------------------------------------------------*/ 129 *--------------------------------------------------------------------------*/
248 char * cdf_str_datatype (long type) 130 char * cdf_str_datatype (long type)
249 { 131 {
250 - switch (type) {  
251 - case CDF_BYTE:  
252 - return "CDF_BYTE"; 132 + switch (type) {
  133 + case CDF_BYTE:
  134 + return "CDF_BYTE";
253 135
254 - case CDF_INT1:  
255 - return "CDF_INT1"; 136 + case CDF_INT1:
  137 + return "CDF_INT1";
256 138
257 - case CDF_CHAR:  
258 - return "CDF_CHAR"; 139 + case CDF_CHAR:
  140 + return "CDF_CHAR";
259 141
260 - case CDF_INT2:  
261 - return "CDF_INT2"; 142 + case CDF_INT2:
  143 + return "CDF_INT2";
262 144
263 - case CDF_UCHAR:  
264 - return "CDF_UCHAR"; 145 + case CDF_UCHAR:
  146 + return "CDF_UCHAR";
265 147
266 - case CDF_UINT1:  
267 - return "CDF_UINT1"; 148 + case CDF_UINT1:
  149 + return "CDF_UINT1";
268 150
269 - case CDF_INT4:  
270 - return "CDF_INT4"; 151 + case CDF_INT4:
  152 + return "CDF_INT4";
271 153
272 - case CDF_UINT2:  
273 - return "CDF_UINT2"; 154 + case CDF_UINT2:
  155 + return "CDF_UINT2";
274 156
275 - case CDF_FLOAT:  
276 - return "CDF_FLOAT"; 157 + case CDF_FLOAT:
  158 + return "CDF_FLOAT";
277 159
278 - case CDF_REAL4:  
279 - return "CDF_REAL4"; 160 + case CDF_REAL4:
  161 + return "CDF_REAL4";
280 162
281 - case CDF_DOUBLE:  
282 - return "CDF_DOUBLE"; 163 + case CDF_DOUBLE:
  164 + return "CDF_DOUBLE";
283 165
284 - case CDF_REAL8:  
285 - return "CDF_REAL8"; 166 + case CDF_REAL8:
  167 + return "CDF_REAL8";
286 168
287 - case CDF_UINT4:  
288 - return "CDF_UINT4"; 169 + case CDF_UINT4:
  170 + return "CDF_UINT4";
289 171
290 - case CDF_EPOCH:  
291 - return "CDF_EPOCH"; 172 + case CDF_EPOCH:
  173 + return "CDF_EPOCH";
292 174
293 - case CDF_EPOCH16:  
294 - return "CDF_EPOCH16";  
295 - }  
296 -} 175 + case CDF_EPOCH16:
  176 + return "CDF_EPOCH16";
  177 + }
  178 +}
297 \ No newline at end of file 179 \ No newline at end of file
php/src/ncvar_attr.c 0 → 100644
@@ -0,0 +1,76 @@ @@ -0,0 +1,76 @@
  1 +/*
  2 + * get parameter info from nc file
  3 + * args : ncfile varId infoId
  4 + * infoId :
  5 + * UNITS
  6 + * FILLVALUE
  7 + */
  8 +
  9 +#include <stdio.h>
  10 +#include <stdlib.h>
  11 +#include <string.h>
  12 +#include <netcdf.h>
  13 +
  14 +void check(int stat)
  15 +{
  16 + if (stat != NC_NOERR)
  17 + {
  18 + printf("error: %s\n", nc_strerror(stat));
  19 + exit(1);
  20 + }
  21 +}
  22 +
  23 +main(int argc, char **argv)
  24 +{
  25 + int ncID, varID;
  26 + size_t i, k;
  27 +// char varname[NC_MAX_NAME];
  28 + int stat = 0;
  29 + nc_type xtype;
  30 + char name_in[NC_MAX_NAME];
  31 + float number_attr;
  32 + int nattsp;
  33 +
  34 + if (argc <= 3) {
  35 + printf("Incorrect number of arguments\n");
  36 + exit(1);
  37 + }
  38 +
  39 + check(nc_open(argv[1],NC_WRITE|NC_SHARE,&ncID));
  40 +
  41 + check(nc_inq_varid(ncID, argv[2], &varID));
  42 + check(nc_inq_varnatts(ncID, varID, &nattsp));
  43 + // fprintf(stdout, "%d\n", nattsp);
  44 +
  45 + for (i = 0; i < nattsp; i++) {
  46 + check(nc_inq_attname(ncID, varID, i, name_in));
  47 +
  48 + if (strcasecmp(name_in, argv[3]) == 0) {
  49 +
  50 + check(nc_inq_atttype(ncID, varID, name_in, &xtype));
  51 +
  52 + if (xtype == NC_CHAR) {
  53 + size_t attlen = 0;
  54 + check(nc_inq_attlen(ncID, varID, name_in, &attlen));
  55 + unsigned char *string_attr = (unsigned char *)malloc(attlen * sizeof(char*) + 1);
  56 +
  57 + check(nc_get_att(ncID, varID, name_in, string_attr));
  58 + strcpy(&string_attr[attlen],"\0");
  59 + fprintf(stdout, "%s\n", string_attr);
  60 + free(string_attr);
  61 + }
  62 + else {
  63 + check(nc_get_att(ncID, varID, name_in, &number_attr));
  64 + fprintf(stdout, "%e\n", number_attr);
  65 + }
  66 +
  67 + exit(0);
  68 + }
  69 + }
  70 +
  71 + stat = nc_close(ncID);
  72 + fprintf(stdout, "undefined\n");
  73 + exit(0);
  74 +}
  75 +
  76 +
php/uploadFile.php
@@ -112,11 +112,23 @@ @@ -112,11 +112,23 @@
112 $nonStd = $_POST['nonstd'] ? $_POST['nonstd'] : null; 112 $nonStd = $_POST['nonstd'] ? $_POST['nonstd'] : null;
113 $timeLength = $_POST['timelength'] ? $_POST['timelength'] : null; 113 $timeLength = $_POST['timelength'] ? $_POST['timelength'] : null;
114 $doy = isset($_POST['doy']) ? $_POST['doy'] : null; 114 $doy = isset($_POST['doy']) ? $_POST['doy'] : null;
  115 + $sampling = isset($_POST['smpl']) ? $_POST['smpl'] : null;
  116 + $min_sampling = isset($_POST['min_manual_sampling']) ? $_POST['min_manual_sampling'] : null;
  117 + $max_sampling = isset($_POST['max_manual_sampling']) ? $_POST['max_manual_sampling'] : null;
  118 +
  119 + if ($sampling == "auto" && $timeSmplg == "variable"
  120 + && (strtolower($fileFrmt) == "cdf" || strtolower($fileFrmt) == "nc")) {
  121 + $response = array('success' => false, 'error' => " : Auto-definition of variable sampling for $fileFrmt isn't implemented yet.
  122 + Use manual sampling definition");
  123 + die(json_encode($response));
  124 + }
  125 +
115 $sampData = isset($_POST['sampData']) ? $_POST['sampData'] : null; 126 $sampData = isset($_POST['sampData']) ? $_POST['sampData'] : null;
116 $sampFileName = isset($_POST['sampFileName']) ? $_POST['sampFileName'] : null; 127 $sampFileName = isset($_POST['sampFileName']) ? $_POST['sampFileName'] : null;
117 128
118 $allFormats = array('fileFormat' => $fileFrmt, 'timeFormat' => $timeFrmt, 'doy' => $doy, 129 $allFormats = array('fileFormat' => $fileFrmt, 'timeFormat' => $timeFrmt, 'doy' => $doy,
119 - 'timeSampling' => $timeSmplg, 'nonStandard' => $nonStd, 'timeLength' => $timeLength); 130 + 'timeSampling' => $timeSmplg, 'nonStandard' => $nonStd, 'timeLength' => $timeLength,
  131 + 'samplingType' => $sampling, 'min_sampling' => $min_sampling, 'max_sampling' => $max_sampling);
120 132
121 if ($_POST['filesrc'] == 'URL') $fromURL = true; 133 if ($_POST['filesrc'] == 'URL') $fromURL = true;
122 else $fromURL = false; 134 else $fromURL = false;