]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/reports/oils_rpt_builder.js
simplified from-pruning
[Evergreen.git] / Open-ILS / web / reports / oils_rpt_builder.js
1 /** initializes reports, some basid display settings, 
2   * grabs and builds the IDL tree
3   */
4 function oilsInitReportBuilder() {
5         oilsInitReports();
6         oilsReportBuilderReset();
7         DOM.oils_rpt_table.onclick = 
8                 function(){hideMe(DOM.oils_rpt_column_editor)};
9         oilsDrawRptTree(
10                 function() { 
11                         hideMe(DOM.oils_rpt_tree_loading); 
12                         unHideMe(DOM.oils_rpt_table); 
13                 }
14         );
15
16         DOM.oils_rpt_builder_save_template.onclick = oilsReportBuilderSave;
17         oilsRpt.folder = new CGI().param('folder');
18 }
19
20 function oilsReportBuilderReset() {
21         var n = (oilsRpt) ? oilsRpt.name : "";
22         oilsRpt = new oilsReport();
23         oilsRpt.name = n;
24         oilsRptDisplaySelector  = DOM.oils_rpt_display_selector;
25         oilsRptFilterSelector   = DOM.oils_rpt_filter_selector;
26         oilsRptAggFilterSelector= DOM.oils_rpt_agg_filter_selector;
27         removeChildren(oilsRptDisplaySelector);
28         removeChildren(oilsRptFilterSelector);
29         removeChildren(oilsRptAggFilterSelector);
30         oilsRptDebug();
31         oilsRptResetParams();
32 }
33
34 function oilsReportBuilderSave() {
35         if(!confirm('Name : '+oilsRpt.name + '\nDescription: ' 
36                         + oilsRpt.description+'\nSave Template?'))
37                 return;
38
39         var tmpl = new rt();
40         tmpl.name( oilsRpt.name );
41         tmpl.description( oilsRpt.desc );
42         tmpl.ower(USER.id());
43         tmpl.folder(oilsRpt.folder);
44         tmpl.data(js2JSON(oilsRpt.def));
45
46         var req = new Request(OILS_RPT_CREATE_TEMPLATE, SESSION, tmpl);
47         req.callback(
48                 function(r) {
49                         var res = r.getResultObject();
50                         if( res != 0 ) {
51                                 oilsRptAlertSuccess();
52                                 _l('oils_rpt.xhtml');
53                         }
54                 }
55         );
56         
57         req.send();
58 }
59
60
61
62 /* adds an item to the display window */
63 function oilsAddRptDisplayItem(path, name, tform, params) {
64         if( ! oilsAddSelectorItem(oilsRptDisplaySelector, path, name) ) 
65                 return;
66
67         /* add the selected columns to the report output */
68         name = (name) ? name : oilsRptPathCol(path);
69         if( !tform ) tform = 'Bare';
70
71         /* add this item to the select blob */
72         var sel = {
73                 relation: oilsRptPathRel(path), 
74                 alias:    name,
75                 column:   { transform: tform, colname: oilsRptPathCol(path) }
76         };
77
78         if( params ) sel.column.params = params;
79         oilsRpt.def.select.push(sel);
80
81         mergeObjects( oilsRpt.def.from, oilsRptBuildFromClause(path));
82         oilsRptDebug();
83 }
84
85 /* takes a column path and builds a from-clause object for the path */
86 function oilsRptBuildFromClause(path) {
87
88         /* the path is the full path (relation) from the source 
89                 object to the column in question (e.g. au-home_ou-aou-name)*/
90         var parts = path.split(/-/);
91
92         /* the final from clause */
93         var obj = {}; 
94
95         /* reference to the current position in the from clause */
96         var tobj = obj; 
97
98         var newpath = "";
99
100         /* walk the path, fleshing the from clause as we go */
101         for( var i = 0; i < parts.length; i += 2 ) {
102
103                 var cls = parts[i]; /* class name (id) */
104                 var col = parts[i+1]; /* column name */
105
106                 /* a "node" is a class description from the IDL, it 
107                         contains relevant info, plus a list of "fields",
108                         or column objects */
109                 var node = oilsIDL[cls];
110                 var pkey = oilsRptFindField(node, node.pkey);
111
112                 /* a "field" is a parsed version of a column from the IDL,
113                         contains datatype, column name, etc. */
114                 var field = oilsRptFindField(node, col);
115
116                 /* re-construct the path as we go so 
117                         we know what all we've seen thus far */
118                 newpath = (newpath) ? newpath + '-'+ cls : cls;
119
120                 /* extract relevant info */
121                 tobj.table = node.table;
122                 tobj.alias = newpath;
123                 _debug('field type is ' + field.type);
124                 if( i == (parts.length - 2) ) break;
125
126                 /* we still have columns left in the path, keep adding join's */
127                 var path_col = col;
128                 if(field.reltype != 'has_a')
129                         col = pkey.name + '-' + col;
130
131                 tobj.join = {};
132                 tobj = tobj.join;
133
134                 tobj[col] = {};
135                 tobj = tobj[col];
136                 if( field.type == 'link' )
137                         tobj.key = field.key;
138
139                 newpath = newpath + '-'+ path_col;
140         }
141
142         _debug("built 'from' clause: path="+path+"\n"+formatJSON(js2JSON(obj)));
143         return obj;
144 }
145
146
147 /* removes a specific item from the display window */
148 function oilsDelDisplayItem(val) {
149         oilsDelSelectorItem(oilsRptDisplaySelector, val);
150 }
151
152 /* removes selected items from the display window */
153 function oilsDelSelectedDisplayItems() {
154         var list = oilsDelSelectedItems(oilsRptDisplaySelector);
155
156         /* remove the de-selected columns from the report output */
157         oilsRpt.def.select = grep( oilsRpt.def.select, 
158                 function(i) {
159                         for( var j = 0; j < list.length; j++ ) {
160                                 var d = list[j];
161                                 var col = i.column;
162
163                                 if( oilsRptPathRel(d) == i.relation && oilsRptPathCol(d) == col.colname ) {
164                                         //var param = (i.alias) ? i.alias.match(/::PARAM\d*/) : null;
165                                         //      if( param ) delete oilsRpt.params[param];
166                                         return false;
167                                 }
168                         }
169                         return true;
170                 }
171         );
172
173         if(!oilsRpt.def.select) {
174                 oilsRpt.def.select = [];
175                 //oilsReportBuilderReset();
176
177         } else {
178                 for( var j = 0; j < list.length; j++ ) 
179                         /* if there are no items left in the "select", "where", or "having" clauses 
180                                 for the given relation, trim this relation from the "from" clause */
181                         if(     !grep(oilsRpt.def.select,
182                                         function(i){ return (i.relation == oilsRptPathRel(list[j])); })
183                                 && !grep(oilsRpt.def.where,
184                                         function(i){ return (i.relation == oilsRptPathRel(list[j])); })
185                                 && !grep(oilsRpt.def.having,
186                                         function(i){ return (i.relation == oilsRptPathRel(list[j])); })
187                         ) oilsRptPruneFromClause(oilsRptPathRel(list[j]));
188         }
189
190         oilsRptDebug();
191 }
192
193
194 /* for each item in the path list, remove the associated data
195         from the "from" clause */
196
197 function oilsRptPruneFromClause(relation, node) {
198         _debug("removing relation from 'from' clause " + relation);
199         if(!node) node = oilsRpt.def.from.join;
200         for( var i in node ) {
201                 _debug("looking at node "+node[i].alias);
202                 // first, descend into the tree, and prune leaves first
203                 if( node[i].join ) {
204                         oilsRptPruneFromClause(relation, node[i].join); 
205                         if(oilsRptObjectKeys(node[i].join).length == 0) delete node[i].join;
206                 }
207         }
208
209         // if we're at an unused empty leaf, remove it
210         if(  !node[i].join ) {
211                 if(     !grep(oilsRpt.def.select,
212                                 function(i){ return (i.relation == node[i].alias)})
213                         && !grep(oilsRpt.def.where,
214                                 function(i){ return (i.relation == node[i].alias)})
215                         && !grep(oilsRpt.def.having,
216                                 function(i){ return (i.relation == node[i].alias)})
217                 ) {
218                         delete node[i];
219                         return true;
220                 }
221         }
222
223         return false;
224 }
225
226 function oilsRptMkFilterTags(path, tform, filter) {
227         var name = oilsRptMakeLabel(path);
228         if(tform) name += ' ('+tform+')';
229         name += ' "' + filter + '"';
230         var epath = path + ':'+filter+':';
231         if(tform) epath += tform;
232
233         return [ name, epath ];
234 }
235
236
237 /* adds an item to the display window */
238 function oilsAddRptFilterItem(path, tform, filter) {
239         _debug("Adding filter item for "+path+" tform="+tform+" filter="+filter);
240
241         var name = oilsRptMkFilterTags(path, tform, filter);
242         var epath = name[1];
243         name = name[0];
244
245         if( ! oilsAddSelectorItem(oilsRptFilterSelector, epath, name) )
246                 return;
247
248         var where = {
249                 relation: oilsRptPathRel(path), 
250                 column:   { transform: tform, colname: oilsRptPathCol(path) },
251                 condition : {}
252         };
253         where.condition[filter] = oilsRptNextParam();
254
255         switch(tform) {
256                 case 'substring' : where.column.params = oilsRptNextParam();
257         }
258
259         oilsRpt.def.where.push(where);
260         mergeObjects( oilsRpt.def.from, oilsRptBuildFromClause(path));
261         oilsRptDebug();
262 }
263
264 /* removes a specific item from the display window */
265 //function oilsDelFilterItem(path) {
266         //oilsDelSelectorItem(oilsRptFilterSelector, path);
267 //}
268
269 /* removes selected items from the display window */
270 function oilsDelSelectedFilterItems() {
271
272         /* the values in this list are formed:  <path>:<operation>:<transform> */
273         var list = oilsDelSelectedItems(oilsRptFilterSelector);
274
275         var flist = [];
276
277         for( var i = 0; i < list.length; i++ ) {
278                 var item = list[i];
279                 flist.push( {
280                         path:           item.replace(/:.*/,''),
281                         operation:      item.replace(/.*:(.*):.*/,'$1'),
282                         tform:  item.replace(/.*?:.*?:(.*)/,'$1')
283                 });
284         }
285
286
287         /* XXX refactor the below to take operation and transform into account
288                 since the same path can be used multiple times as long as a different
289                 filter and/or transform is used */
290
291         /* remove the de-selected columns from the report output */
292         oilsRpt.def.where = grep( oilsRpt.def.where, 
293                 function(i) {
294                         for( var j = 0; j < flist.length; j++ ) {
295                                 var fil = flist[j];
296                                 var col = i.column;
297                                 var frel = oilsRptPathRel(fil.path);
298                                 var fcol = oilsRptPathCol(fil.path);
299
300                                 var op = oilsRptObjectKeys(i.condition)[0];
301
302                                 if(     frel == i.relation && 
303                                                 fcol == col.colname && 
304                                                 fil.operation == op &&
305                                                 fil.tform == col.transform ) {
306                                                 /* we have found a where clause with the same 
307                                                         relation, column,  operation and transform */
308                                                 
309                                                 /* we aren't setting params on template build.. */
310                                                 //var param = (i.column.params) ? i.columns.params.match(/::P\d*/) : null;
311                                                 //if( param ) delete oilsRpt.params[param];
312                                                 //param = (i.condition[op]) ? i.condition[op].match(/::P\d*/) : null;
313                                                 //if( param ) delete oilsRpt.params[param];
314
315                                                 return false;
316                                 }
317                         }
318                         return true;
319                 }
320         );
321
322         if(!oilsRpt.def.where) 
323                 oilsRpt.def.where = [];
324
325
326         for( var j = 0; j < flist.length; j++ ) {
327                 var path = flist[j].path;
328                 var rel = oilsRptPathRel(path);
329                 /* if there are no items left in the "select", "where", or "having" clauses 
330                         for the given relation, trim this relation from the "from" clause */
331
332                 var func = function(i){ return (i.relation == rel); };
333
334                 if(     !grep(oilsRpt.def.select, func) &&
335                                 !grep(oilsRpt.def.where, func) &&
336                                 !grep(oilsRpt.def.having, func) ) {
337
338                         _debug("pruning item with path "+ path + ' and relation '+ rel);
339
340                         oilsRptPruneFromClause(oilsRptPathRel(path)); 
341                 }
342         }
343
344         oilsRptDebug();
345 }
346
347 /* adds an item to the display window */
348 function oilsAddRptAggFilterItem(val) {
349         oilsAddSelectorItem(oilsRptAggFilterSelector, val);
350 }
351
352 /* removes a specific item from the display window */
353 function oilsDelAggFilterItem(val) {
354         oilsDelSelectorItem(oilsRptAggFilterSelector, val);
355 }
356
357 /* removes selected items from the display window */
358 function oilsDelSelectedAggFilterItems() {
359         var list = oilsDelSelectedItems(oilsRptAggFilterSelector);
360
361         /* remove the de-selected columns from the report output */
362         oilsRpt.def.having = grep( oilsRpt.def.having, 
363                 function(i) {
364                         for( var j = 0; j < list.length; j++ ) {
365                                 var d = list[j];
366                                 var col = i.column;
367
368                                 /* if this columsn has a transform, 
369                                         it will be an object { tform => column } */
370                                 if( typeof col != 'string' ) 
371                                         for( var c in col ) col = col[c];
372
373                                 /* if this transform requires params, the column 
374                                         will be the first item in the param set array */
375                                 if( typeof col != 'string' ) col = col[0];
376
377                                 if( oilsRptPathRel(d) == i.relation && oilsRptPathCol(d) == col ) {
378                                         var param = (i.alias) ? i.alias.match(/::P\d*/) : null;
379                                         if( param ) delete oilsRpt.params[param];
380                                         return false;
381                                 }
382                         }
383                         return true;
384                 }
385         );
386
387         if(!oilsRpt.def.having) {
388                 oilsRpt.def.having = [];
389                 oilsReportBuilderReset();
390
391         } else {
392                 for( var j = 0; j < list.length; j++ ) 
393                         /* if there are no items left in the "select", "where", or "having" clauses 
394                                 for the given relation, trim this relation from the "from" clause */
395                         if(     !grep(oilsRpt.def.select,
396                                         function(i){ return (i.relation == oilsRptPathRel(list[j])); })
397                                 && !grep(oilsRpt.def.where,
398                                         function(i){ return (i.relation == oilsRptPathRel(list[j])); })
399                                 && !grep(oilsRpt.def.having,
400                                         function(i){ return (i.relation == oilsRptPathRel(list[j])); })
401                         ) oilsRptPruneFromClause(oilsRptPathRel(list[j]));
402         }
403
404         oilsRptDebug();
405 }
406
407
408 /* adds an item to the display window */
409 function oilsAddSelectorItem(sel, val, name) {
410         name = (name) ? name : oilsRptMakeLabel(val);
411         _debug("adding selector item "+name+' = ' +val);
412         for( var i = 0; i < sel.options.length; i++ ) {
413                 var opt = sel.options[i];
414                 if( opt.value == val ) return false;
415         }
416         insertSelectorVal( sel, -1, name, val );
417         return true;
418 }
419
420
421 /* removes a specific item from the display window */
422 function oilsDelSelectorItem(sel, val) {
423         _debug("deleting selector item "+val);
424         var opts = sel.options;
425         for( var i = 0; i < opts.length; i++ ) {
426                 var opt = opts[i];
427                 if( opt.value == val )  {
428                         if( i == opts.length - 1 ) 
429                                 opts[i] = null;
430                         else opts[i] = opts[i+1];
431                         return;
432                 }
433         }
434 }
435
436 /* removes selected items from the display window */
437 function oilsDelSelectedItems(sel) {
438         var list = getSelectedList(sel);
439         for( var i = 0; i < list.length; i++ ) 
440                 oilsDelSelectorItem(sel, list[i]);
441         return list;
442 }
443
444
445 /* hides the different field editor tabs */
446 function oilsRptHideEditorDivs() {
447         hideMe(DOM.oils_rpt_tform_div);
448         hideMe(DOM.oils_rpt_filter_div);
449         hideMe(DOM.oils_rpt_agg_filter_div);
450 }
451
452
453 /**
454   This draws the 3-tabbed window containing the transform,
455   filter, and aggregate filter picker window
456   */
457 function oilsRptDrawDataWindow(path) {
458         var col = oilsRptPathCol(path);
459         var cls = oilsRptPathClass(path);
460         var field = oilsRptFindField(oilsIDL[cls], col);
461
462         appendClear(DOM.oils_rpt_editor_window_label, text(oilsRptMakeLabel(path)));
463         appendClear(DOM.oils_rpt_editor_window_datatype, text(field.datatype));
464
465         _debug("setting update data window for column "+col+' on class '+cls);
466
467         var div = DOM.oils_rpt_column_editor;
468         /* set a preliminary top position so the page won't bounce around */
469         div.setAttribute('style','top:'+oilsMouseX+'px');
470
471         /* unhide the div so we can determine the dimensions */
472         unHideMe(div);
473
474         /* don't let them see the floating div until the position is fully determined */
475         div.style.visibility='hidden'; 
476
477         oilsRptDrawTransformWindow(path, col, cls, field);
478         oilsRptDrawFilterWindow(path, col, cls, field);
479
480         //oilsRptSetFilters(field.datatype);
481
482         //oilsRptDoFilterWidgets();
483
484         //DOM.oils_rpt_filter_tform_selector.onchange = oilsRptDoFilterWidgets;
485
486         buildFloatingDiv(div, 600);
487
488         /* now let them see it */
489         div.style.visibility='visible';
490
491         oilsRptSetDataWindowActions(div);
492 }
493
494
495 function oilsRptSetDataWindowActions(div) {
496         /* give the tab links behavior */
497         DOM.oils_rpt_tform_tab.onclick = 
498                 function(){oilsRptHideEditorDivs();unHideMe(DOM.oils_rpt_tform_div)};
499         DOM.oils_rpt_filter_tab.onclick = 
500                 function(){oilsRptHideEditorDivs();unHideMe(DOM.oils_rpt_filter_div)};
501         DOM.oils_rpt_agg_filter_tab.onclick = 
502                 function(){oilsRptHideEditorDivs();unHideMe(DOM.oils_rpt_agg_filter_div)};
503
504         DOM.oils_rpt_tform_tab.onclick();
505         DOM.oils_rpt_column_editor_close_button.onclick = function(){hideMe(div);};
506 }
507
508
509 function oilsRptDrawFilterWindow(path, col, cls, field) {
510
511         var fsel = $n(DOM.oils_rpt_filter_op_table,'selector');
512         for( var i = 0; i < fsel.options.length; i++ ){
513                 var opt = fsel.options[i];
514                 var dt = opt.getAttribute('datatype');
515                 _debug(dt);
516
517                 /* add a special case for boolean objects, since the only 
518                         operation that makes sense is "="  */
519                 if( field.datatype == 'bool' ) {
520                         hideMe(opt);
521                         if( opt.getAttribute('value') == '=' )
522                                 unHideMe(opt);
523
524                 } else {
525                         if( dt && dt != field.datatype )
526                                 hideMe(opt);
527                         else unHideMe(opt);
528                 }
529         }
530
531
532         DOM.oils_rpt_filter_submit.onclick = function() {
533                 var tsel = $n(DOM.oils_rpt_filter_tform_table,'selector');
534                 var tform = getSelectorVal(tsel);
535                 var filter = getSelectorVal(fsel);
536                 oilsAddRptFilterItem(path, tform, filter);
537         }
538         oilsRptShowFilters($n(DOM.oils_rpt_filter_tform_table,'selector'), field.datatype, false, true);
539                 
540         /*
541         oilsRptCurrentFilterTform = new oilsRptTFormManager(DOM.oils_rpt_filter_tform_table);
542         oilsRptCurrentFilterTform.build(field.datatype, false, true);
543         oilsRptCurrentFilterOpManager = new oilsRptOpManager(DOM.oils_rpt_filter_op_table);
544         */
545 }
546
547 function oilsRptShowFilters( selector, dtype, show_agg, show_noagg ) {
548         for( var i = 0; i < selector.options.length; i++ ) {
549                 var opt = selector.options[i];
550                 var t = opt.getAttribute('datatype');
551                 if( t && t != dtype ){
552                         hideMe(opt);
553                 } else {
554                         var ag = opt.getAttribute('aggregate');
555                         if( ag && show_agg )
556                                 unHideMe(opt);
557                         else if( ag && ! show_agg )
558                                 hideMe(opt)
559                         else if( !ag && show_noagg )
560                                 unHideMe(opt);
561                         else hideMe(opt);
562                 }
563         }
564 }
565
566
567 /* draws the transform window */
568 function oilsRptDrawTransformWindow(path, col, cls, field) {
569         DOM.oils_rpt_tform_label_input.value = oilsRptMakeLabel(path);
570         var dtype = field.datatype;
571
572         DOM.oils_rpt_tform_submit.onclick = 
573                 function(){ 
574                         var sel = $n(DOM.oils_rpt_tform_table,'selector');
575                         var tform = getSelectorVal(sel);
576                         oilsAddRptDisplayItem(path, DOM.oils_rpt_tform_label_input.value, tform ) 
577                 };
578
579
580         DOM.oils_rpt_tform_label_input.focus();
581         DOM.oils_rpt_tform_label_input.select();
582
583         /*
584         oilsRptCurrentTform = new oilsRptTFormManager(DOM.oils_rpt_tform_table);
585         oilsRptCurrentTform.build(dtype, true, true);
586         */
587
588         _debug($n(DOM.oils_rpt_tform_table,'selector'));
589
590         oilsRptShowFilters($n(DOM.oils_rpt_tform_table,'selector'), dtype, true, true);
591
592         /*
593         oilsRptHideTformFields();
594         oilsRptUnHideTformFields(dtype);
595         */
596
597         _debug("Building transform window for datatype "+dtype);
598
599         /*
600         unHideMe($('oils_rpt_tform_'+dtype+'_div'));
601         $('oils_rpt_tform_all_raw').checked = true;
602         */
603 }
604
605 /*
606 function oilsRptHideTformFields() {
607         var rows = DOM.oils_rpt_tform_tbody.childNodes;
608         for( var i = 0; i < rows.length; i++ )
609                 if( rows[i] && rows[i].nodeType == 1 )
610                         hideMe(rows[i]);
611 }
612
613 function oilsRptUnHideTformFields(dtype) {
614         var rows = DOM.oils_rpt_tform_tbody.childNodes;
615         for( var i = 0; i < rows.length; i++ ) {
616                 var row = rows[i]
617                 if( row && row.nodeType == 1 && 
618                         (row.getAttribute('datatype')=='all' 
619                                 || row.getAttribute('datatype') == dtype)) {
620                         unHideMe(row);
621                 }
622         }
623 }
624
625
626 function oilsRptGetTform(datatype) {
627         for( var i in oilsRptTransforms[datatype] ) 
628                 if( $('oils_rpt_tform_'+datatype+'_'+oilsRptTransforms[datatype][i]).checked )
629                         return oilsRptTransforms[datatype][i];
630         for( var i in oilsRptTransforms.all ) 
631                 if( $('oils_rpt_tform_all_'+oilsRptTransforms.all[i]).checked )
632                         return oilsRptTransforms.all[i];
633         return null;
634 }
635 */
636
637
638 /*
639 function getRptTformParams(type, tform) {
640         switch(type) {
641                 case 'string' :
642                         switch(tform) {
643                                 case 'substring' :
644                                         return [
645                                                 DOM.oils_rpt_tform_string_substring_offset.value, 
646                                                 DOM.oils_rpt_tform_string_substring_length.value];
647                         }
648         }
649 }
650 */
651
652
653 /* given a transform selector, this displays the appropriate 
654         transforms for the given datatype.
655         if aggregate is true, is displays the aggregate transforms */
656 /*
657 function oilsRptSetTransforms(sel, dtype, show_agg, show_noagg) {
658         for( var i = 0; i < sel.options.length; i++ ) {
659                 var opt = sel.options[i];
660                 var t = opt.getAttribute('datatype');
661                 if( t && t != dtype ){
662                         hideMe(opt);
663                 } else {
664                         var ag = opt.getAttribute('aggregate');
665                         if( ag && show_agg )
666                                 unHideMe(opt);
667                         else if( ag && ! show_agg )
668                                 hideMe(opt)
669                         else if( !ag && show_noagg )
670                                 unHideMe(opt);
671                         else
672                                 hideMe(opt);
673                 }
674         }
675 }
676 */
677
678
679 /* displays the correct filter-transforms for the given datatype */
680 /*
681 function oilsRptSetFilters(dtype) {
682
683         DOM.oils_rpt_filter_submit.onclick = function() {
684                 var data = oilsRptDoFilterWidgets();
685                 alert(js2JSON(data));
686         }
687
688         var sel = DOM.oils_rpt_filter_tform_selector;
689         for( var i = 0; i < sel.options.length; i++ ) {
690                 var opt = sel.options[i];
691                 _debug(opt.getAttribute('op'));
692                 var t = opt.getAttribute('datatype');
693                 if( t && t != dtype ) hideMe(opt);
694                 else unHideMe(opt);
695         }
696 }
697 */
698
699 /* hides all of the filter widgets */
700 function oilsRptHideFilterWidgets(node) {
701         if(!node)
702                 node = DOM.oils_rpt_filter_tform_widget_td;
703         if( node.nodeType != 1 ) return;
704         if( node.getAttribute('widget') ) {
705                 hideMe(node);
706         } else {
707                 var cs = node.childNodes;
708                 for( var i = 0; cs && i < cs.length; i++ )
709                         oilsRptHideFilterWidgets(cs[i]);
710         }
711 }
712
713 /* what does this need to do? */
714 function oilsRptSetFilterOpActions() {
715 }
716
717
718
719 /* hides/unhides the appropriate widgets and returns the parameter
720         array appropriate for the selected widget */
721 function oilsRptDoFilterWidgets() {
722         filter = getSelectorVal(DOM.oils_rpt_filter_tform_selector);
723         oilsRptHideFilterWidgets();
724         var op = null;
725         var tform = null;
726         var params = null;
727
728         switch(filter) {
729                 
730                 /* generic transforms */
731                 case 'equals':
732                         if(!op) op = 'equals';
733                 case 'like':
734                         if(!op) op = 'like';
735                 case 'ilike':
736                         if(!op) op = 'ilike';
737                 case 'gt':
738                         if(!op) op = '>';
739                 case 'gte':
740                         if(!op) op = '>=';
741                 case 'lt':
742                         if(!op) op = '<';
743                 case 'lte':
744                         if(!op) op = '<=';
745                 case 'in':
746                         if(!op) op = 'in';
747                 case 'not_in':
748                         if(!op) op = 'not in';
749                 case 'between':
750                         if(!op) op = 'between';
751                 case 'not_between':
752                         if(!op) op = 'not between';
753                         unHideMe(DOM.oils_rpt_filter_tform_input);      
754                         params = [DOM.oils_rpt_filter_tform_input.value];
755                         break;
756
757                 /* timestamp transforms */
758                 case 'date_between':
759                         if(!op) op = 'between';
760                 case 'date_not_between':
761                         if(!op) op = 'not between';
762                         tform = 'date';
763                         var d = new Date();
764                         unHideMe(DOM.oils_rpt_filter_tform_date_1);
765                         unHideMe(DOM.oils_rpt_filter_tform_date_2);
766                         unHideMe(DOM.oils_rpt_filter_tform_date_hint);
767                         DOM.oils_rpt_filter_tform_date_1.value = mkYearMonDay();
768                         DOM.oils_rpt_filter_tform_date_2.value = mkYearMonDay();
769                         params = [
770                                 DOM.oils_rpt_filter_tform_date_1.value,
771                                 DOM.oils_rpt_filter_tform_date_2.value
772                         ];
773                         break;
774
775                 case 'dow_between':
776                         op = 'between';
777                         if(!tform) tform = 'dow';
778                 case 'dow_not_between':
779                         if(!op) op = 'not between';
780                         if(!tform) tform = 'dow';
781                         break;
782
783                 case 'dom_between':
784                         op = 'between';
785                         if(!tform) tform = 'dom';
786                 case 'dom_not_between':
787                         if(!op) op = 'not between';
788                         if(!tform) tform = 'dom';
789                         break;
790
791                 case 'month_between':
792                         op = 'between';
793                         if(!tform) tform = 'moy';
794                 case 'month_not_between':
795                         if(!op) op = 'not between';
796                         if(!tform) tform = 'moy';
797                         break;
798
799                 case 'quarter_between':
800                         op = 'between';
801                         if(!tform) tform = 'qoy';
802                 case 'quarter_not_between':
803                         if(!op) op = 'not between';
804                         if(!tform) tform = 'qoy';
805                         break;
806
807                 case 'year_between':
808                         if(!op) op = 'between';
809                         if(!tform) tform = 'year_trunc';
810                 case 'year_not_between':
811                         if(!op) op = 'not between';
812                         if(!tform) tform = 'year_trunc';
813                         break;
814
815                 case 'age_between':
816                         if(!op) op = 'between';
817                         if(!tform) tform = 'age';
818                 case 'age_not_between':
819                         if(!op) op = 'not between';
820                         if(!tform) tform = 'age';
821                         break;
822
823                 /* string transforms */
824                 case 'substring':
825                         if(!tform) tform = 'substring';
826                         break;
827
828                 case 'lower':
829                         if(!op) op = '';
830                         if(!tform) tform = 'dow';
831
832                 case 'upper':
833                         if(!op) op = '';
834                         if(!tform) tform = 'dow';
835
836                 /* numeric transforms */
837                 case 'round':
838                         if(!op) op = '';
839                         if(!tform) tform = 'dow';
840
841                 case 'int':
842                         if(!op) op = '';
843                         if(!tform) tform = 'dow';
844         }
845
846         return { op : op, params : params, tform : tform };
847 }
848
849
850
851