collectd-interface 0.3.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (126) hide show
  1. data/bin/collectd-interface-daemon +21 -361
  2. data/bin/collectd-interface-plugins +11 -11
  3. data/lib/collectd/interface/config.rb +117 -0
  4. data/lib/collectd/interface/options.rb +68 -0
  5. data/lib/collectd/interface/service/data.rb +110 -0
  6. data/lib/collectd/interface/service/graph.rb +106 -0
  7. data/lib/collectd/interface/service/report.rb +82 -0
  8. data/lib/collectd/interface/service.rb +44 -0
  9. data/public/images/cpus.png +0 -0
  10. data/public/images/device/ops/sda.png +0 -0
  11. data/public/images/device/ops/sda1.png +0 -0
  12. data/public/images/device/ops/sda2.png +0 -0
  13. data/public/images/device/ops/sda5.png +0 -0
  14. data/public/images/device/ops/sda6.png +0 -0
  15. data/public/images/device/ops/sda7.png +0 -0
  16. data/public/images/device/ops/sda8.png +0 -0
  17. data/public/images/device/ops/sda9.png +0 -0
  18. data/public/images/device/ops/sdb.png +0 -0
  19. data/public/images/device/ops/sdb1.png +0 -0
  20. data/public/images/device/ops/sdh.png +0 -0
  21. data/public/images/device/ops/sdh1.png +0 -0
  22. data/public/images/device/ops/sdh2.png +0 -0
  23. data/public/images/device/ops/sdh3.png +0 -0
  24. data/public/images/device/ops/sdh4.png +0 -0
  25. data/public/images/device/ops/sr0.png +0 -0
  26. data/public/images/device/time/sda.png +0 -0
  27. data/public/images/device/time/sda1.png +0 -0
  28. data/public/images/device/time/sda2.png +0 -0
  29. data/public/images/device/time/sda5.png +0 -0
  30. data/public/images/device/time/sda6.png +0 -0
  31. data/public/images/device/time/sda7.png +0 -0
  32. data/public/images/device/time/sda8.png +0 -0
  33. data/public/images/device/time/sda9.png +0 -0
  34. data/public/images/device/time/sdb.png +0 -0
  35. data/public/images/device/time/sdb1.png +0 -0
  36. data/public/images/device/time/sdh.png +0 -0
  37. data/public/images/device/time/sdh1.png +0 -0
  38. data/public/images/device/time/sdh2.png +0 -0
  39. data/public/images/device/time/sdh3.png +0 -0
  40. data/public/images/device/time/sdh4.png +0 -0
  41. data/public/images/device/time/sr0.png +0 -0
  42. data/public/images/device/traffic/sda.png +0 -0
  43. data/public/images/device/traffic/sda1.png +0 -0
  44. data/public/images/device/traffic/sda2.png +0 -0
  45. data/public/images/device/traffic/sda5.png +0 -0
  46. data/public/images/device/traffic/sda6.png +0 -0
  47. data/public/images/device/traffic/sda7.png +0 -0
  48. data/public/images/device/traffic/sda8.png +0 -0
  49. data/public/images/device/traffic/sda9.png +0 -0
  50. data/public/images/device/traffic/sdb.png +0 -0
  51. data/public/images/device/traffic/sdb1.png +0 -0
  52. data/public/images/device/traffic/sdh.png +0 -0
  53. data/public/images/device/traffic/sdh1.png +0 -0
  54. data/public/images/device/traffic/sdh2.png +0 -0
  55. data/public/images/device/traffic/sdh3.png +0 -0
  56. data/public/images/device/traffic/sdh4.png +0 -0
  57. data/public/images/device/traffic/sr0.png +0 -0
  58. data/public/images/irqs.png +0 -0
  59. data/public/images/load.png +0 -0
  60. data/public/images/memory.png +0 -0
  61. data/public/images/network/packets/eth0.png +0 -0
  62. data/public/images/network/packets/lo.png +0 -0
  63. data/public/images/network/packets/nbr0-nic.png +0 -0
  64. data/public/images/network/packets/nbr0.png +0 -0
  65. data/public/images/network/packets/virbr0.png +0 -0
  66. data/public/images/network/packets/vnet0.png +0 -0
  67. data/public/images/network/packets/vnet1.png +0 -0
  68. data/public/images/network/packets/vnet2.png +0 -0
  69. data/public/images/network/packets/vnet3.png +0 -0
  70. data/public/images/network/packets/vnet4.png +0 -0
  71. data/public/images/network/packets/vnet5.png +0 -0
  72. data/public/images/network/traffic/eth0.png +0 -0
  73. data/public/images/network/traffic/lo.png +0 -0
  74. data/public/images/network/traffic/nbr0-nic.png +0 -0
  75. data/public/images/network/traffic/nbr0.png +0 -0
  76. data/public/images/network/traffic/virbr0.png +0 -0
  77. data/public/images/network/traffic/vnet0.png +0 -0
  78. data/public/images/network/traffic/vnet1.png +0 -0
  79. data/public/images/network/traffic/vnet2.png +0 -0
  80. data/public/images/network/traffic/vnet3.png +0 -0
  81. data/public/images/network/traffic/vnet4.png +0 -0
  82. data/public/images/network/traffic/vnet5.png +0 -0
  83. data/public/images/processes.png +0 -0
  84. data/public/images/users.png +0 -0
  85. data/public/script/table_filter.js +1217 -0
  86. data/public/style/default.css +28 -0
  87. data/test/collectd/interface/config_test.rb +9 -0
  88. data/test/collectd/interface/service_config_test.rb +26 -0
  89. data/test/collectd/interface/service_data_test.rb +46 -0
  90. data/test/start.rb +3 -0
  91. data/views/graph_header.erb +13 -4
  92. data/views/graphs/device/ops.erb +37 -0
  93. data/views/graphs/device/time.erb +37 -0
  94. data/views/graphs/device/traffic.erb +38 -0
  95. data/views/graphs/{irq.erb.disabled → irqs.erb} +8 -8
  96. data/views/graphs/network/packets.erb +35 -0
  97. data/views/graphs/network/traffic.erb +35 -0
  98. data/views/graphs/{users.erb.disabled → users.erb} +0 -0
  99. data/views/report.erb +32 -14
  100. data/views/reports/open-files/local.erb +62 -0
  101. data/views/reports/{processes-cpu-usage.erb → processes.erb} +0 -0
  102. data/views/reports/{system-sockets.erb → sockets.erb} +0 -0
  103. data/views/reports/{disk-free.erb → storage.erb} +1 -1
  104. data/views/template/options/graph.erb +1 -1
  105. metadata +98 -30
  106. data/public/images/cpus.svg +0 -946
  107. data/public/images/disk-traffic-root.png +0 -0
  108. data/public/images/disk-traffic-srv.png +0 -0
  109. data/public/images/disk-traffic-tmp.png +0 -0
  110. data/public/images/disk-traffic-var.png +0 -0
  111. data/public/images/irq.png +0 -0
  112. data/public/images/load.svg +0 -638
  113. data/public/images/memory.svg +0 -741
  114. data/public/images/network-eth0.png +0 -0
  115. data/public/images/network-eth0.svg +0 -609
  116. data/public/images/network-lo.png +0 -0
  117. data/public/images/network-lo.svg +0 -644
  118. data/public/images/processes.svg +0 -832
  119. data/views/graphs/disk-traffic-root.erb +0 -24
  120. data/views/graphs/disk-traffic-srv.erb.disabled +0 -25
  121. data/views/graphs/disk-traffic-tmp.erb.disabled +0 -24
  122. data/views/graphs/disk-traffic-var.erb.disabled +0 -25
  123. data/views/graphs/network-eth0.erb +0 -23
  124. data/views/graphs/network-lo.erb +0 -23
  125. data/views/reports/list-open-files-lustre.erb.disabled +0 -44
  126. data/views/reports/list-open-files-tmp.erb +0 -44
@@ -0,0 +1,1217 @@
1
+ /*====================================================
2
+ - HTML Table Filter Generator v1.6
3
+ - By Max Guglielmi
4
+ - mguglielmi.free.fr/scripts/TableFilter/?l=en
5
+ - please do not change this comment
6
+ - don't forget to give some credit... it's always
7
+ good for the author
8
+ - Special credit to Cedric Wartel and
9
+ cnx.claude@free.fr for contribution and
10
+ inspiration
11
+ =====================================================*/
12
+
13
+ // global vars
14
+ var TblId, SearchFlt, SlcArgs;
15
+ TblId = new Array(), SlcArgs = new Array();
16
+
17
+
18
+ function setFilterGrid(id)
19
+ /*====================================================
20
+ - Checks if id exists and is a table
21
+ - Then looks for additional params
22
+ - Calls fn that generates the grid
23
+ =====================================================*/
24
+ {
25
+ var tbl = grabEBI(id);
26
+ var ref_row, fObj;
27
+ if(tbl != null && tbl.nodeName.toLowerCase() == "table")
28
+ {
29
+ if(arguments.length>1)
30
+ {
31
+ for(var i=0; i<arguments.length; i++)
32
+ {
33
+ var argtype = typeof arguments[i];
34
+
35
+ switch(argtype.toLowerCase())
36
+ {
37
+ case "number":
38
+ ref_row = arguments[i];
39
+ break;
40
+ case "object":
41
+ fObj = arguments[i];
42
+ break;
43
+ }//switch
44
+
45
+ }//for
46
+ }//if
47
+
48
+ ref_row == undefined ? ref_row=2 : ref_row=(ref_row+2);
49
+ var ncells = getCellsNb(id,ref_row);
50
+ tbl.tf_ncells = ncells;
51
+ if(tbl.tf_ref_row==undefined) tbl.tf_ref_row = ref_row;
52
+ tbl.tf_Obj = fObj;
53
+ if( !hasGrid(id) ) AddGrid(id);
54
+ }//if tbl!=null
55
+ }
56
+
57
+ function AddGrid(id)
58
+ /*====================================================
59
+ - adds a row containing the filtering grid
60
+ =====================================================*/
61
+ {
62
+ TblId.push(id);
63
+ var t = grabEBI(id);
64
+ var f = t.tf_Obj, n = t.tf_ncells;
65
+ var inpclass, fltgrid, displayBtn, btntext, enterkey;
66
+ var modfilter_fn, display_allText, on_slcChange;
67
+ var displaynrows, totrows_text, btnreset, btnreset_text;
68
+ var sort_slc, displayPaging, pagingLength, displayLoader;
69
+ var load_text, exactMatch, alternateBgs, colOperation;
70
+ var rowVisibility, colWidth, bindScript;
71
+
72
+ f!=undefined && f["grid"]==false ? fltgrid=false : fltgrid=true;//enables/disables filter grid
73
+ f!=undefined && f["btn"]==true ? displayBtn=true : displayBtn=false;//show/hides filter's validation button
74
+ f!=undefined && f["btn_text"]!=undefined ? btntext=f["btn_text"] : btntext="go";//defines button text
75
+ f!=undefined && f["enter_key"]==false ? enterkey=false : enterkey=true;//enables/disables enter key
76
+ f!=undefined && f["mod_filter_fn"] ? modfilter_fn=true : modfilter_fn=false;//defines alternative fn
77
+ f!=undefined && f["display_all_text"]!=undefined ? display_allText=f["display_all_text"] : display_allText="";//defines 1st option text
78
+ f!=undefined && f["on_change"]==false ? on_slcChange=false : on_slcChange=true;//enables/disables onChange event on combo-box
79
+ f!=undefined && f["rows_counter"]==true ? displaynrows=true : displaynrows=false;//show/hides rows counter
80
+ f!=undefined && f["rows_counter_text"]!=undefined ? totrows_text=f["rows_counter_text"] : totrows_text="Displayed rows: ";//defines rows counter text
81
+ f!=undefined && f["btn_reset"]==true ? btnreset=true : btnreset=false;//show/hides reset link
82
+ f!=undefined && f["btn_reset_text"]!=undefined ? btnreset_text=f["btn_reset_text"] : btnreset_text="Reset";//defines reset text
83
+ f!=undefined && f["sort_select"]==true ? sort_slc=true : sort_slc=false;//enables/disables select options sorting
84
+ f!=undefined && f["paging"]==true ? displayPaging=true : displayPaging=false;//enables/disables table paging
85
+ f!=undefined && f["paging_length"]!=undefined ? pagingLength=f["paging_length"] : pagingLength=10;//defines table paging length
86
+ f!=undefined && f["loader"]==true ? displayLoader=true : displayLoader=false;//enables/disables loader
87
+ f!=undefined && f["loader_text"]!=undefined ? load_text=f["loader_text"] : load_text="Loading...";//defines loader text
88
+ f!=undefined && f["exact_match"]==true ? exactMatch=true : exactMatch=false;//enables/disbles exact match for search
89
+ f!=undefined && f["alternate_rows"]==true ? alternateBgs=true : alternateBgs=false;//enables/disbles rows alternating bg colors
90
+ f!=undefined && f["col_operation"] ? colOperation=true : colOperation=false;//enables/disbles column operation(sum,mean)
91
+ f!=undefined && f["rows_always_visible"] ? rowVisibility=true : rowVisibility=false;//makes a row always visible
92
+ f!=undefined && f["col_width"] ? colWidth=true : colWidth=false;//defines widths of columns
93
+ f!=undefined && f["bind_script"] ? bindScript=true : bindScript=false;
94
+
95
+ // props are added to table in order to be easily accessible from other fns
96
+ t.tf_fltGrid = fltgrid;
97
+ t.tf_displayBtn = displayBtn;
98
+ t.tf_btnText = btntext;
99
+ t.tf_enterKey = enterkey;
100
+ t.tf_isModfilter_fn = modfilter_fn;
101
+ t.tf_display_allText = display_allText;
102
+ t.tf_on_slcChange = on_slcChange;
103
+ t.tf_rowsCounter = displaynrows;
104
+ t.tf_rowsCounter_text = totrows_text;
105
+ t.tf_btnReset = btnreset;
106
+ t.tf_btnReset_text = btnreset_text;
107
+ t.tf_sortSlc = sort_slc;
108
+ t.tf_displayPaging = displayPaging;
109
+ t.tf_pagingLength = pagingLength;
110
+ t.tf_displayLoader = displayLoader;
111
+ t.tf_loadText = load_text;
112
+ t.tf_exactMatch = exactMatch;
113
+ t.tf_alternateBgs = alternateBgs;
114
+ t.tf_startPagingRow = 0;
115
+
116
+ if(modfilter_fn) t.tf_modfilter_fn = f["mod_filter_fn"];// used by DetectKey fn
117
+
118
+ if(fltgrid)
119
+ {
120
+ var fltrow = t.insertRow(0); //adds filter row
121
+ fltrow.className = "fltrow";
122
+ for(var i=0; i<n; i++)// this loop adds filters
123
+ {
124
+ var fltcell = fltrow.insertCell(i);
125
+ //fltcell.noWrap = true;
126
+ i==n-1 && displayBtn==true ? inpclass = "flt_s" : inpclass = "flt";
127
+
128
+ if(f==undefined || f["col_"+i]==undefined || f["col_"+i]=="none")
129
+ {
130
+ var inptype;
131
+ (f==undefined || f["col_"+i]==undefined) ? inptype="text" : inptype="hidden";//show/hide input
132
+ var inp = createElm( "input",["id","flt"+i+"_"+id],["type",inptype],["class",inpclass] );
133
+ inp.className = inpclass;// for ie<=6
134
+ fltcell.appendChild(inp);
135
+ if(enterkey) inp.onkeypress = DetectKey;
136
+ }
137
+ else if(f["col_"+i]=="select")
138
+ {
139
+ var slc = createElm( "select",["id","flt"+i+"_"+id],["class",inpclass] );
140
+ slc.className = inpclass;// for ie<=6
141
+ fltcell.appendChild(slc);
142
+ PopulateOptions(id,i);
143
+ if(displayPaging)//stores arguments for GroupByPage() fn
144
+ {
145
+ var args = new Array();
146
+ args.push(id); args.push(i); args.push(n);
147
+ args.push(display_allText); args.push(sort_slc); args.push(displayPaging);
148
+ SlcArgs.push(args);
149
+ }
150
+ if(enterkey) slc.onkeypress = DetectKey;
151
+ if(on_slcChange)
152
+ {
153
+ (!modfilter_fn) ? slc.onchange = function(){ Filter(id); } : slc.onchange = f["mod_filter_fn"];
154
+ }
155
+ }
156
+
157
+ if(i==n-1 && displayBtn==false)// this adds button
158
+ {
159
+ var btn = createElm(
160
+ "input",
161
+ ["id","btn"+i+"_"+id],["type","button"],
162
+ ["value",btntext],["class","btnflt"]
163
+ );
164
+ btn.className = "btnflt";
165
+
166
+ fltcell.appendChild(btn);
167
+ (!modfilter_fn) ? btn.onclick = function(){ Filter(id); } : btn.onclick = f["mod_filter_fn"];
168
+ }//if
169
+
170
+ }// for i
171
+ }//if fltgrid
172
+
173
+ if(displaynrows || btnreset || displayPaging || displayLoader)
174
+ {
175
+
176
+ /*** div containing rows # displayer + reset btn ***/
177
+ var infdiv = createElm( "div",["id","inf_"+id],["class","inf"] );
178
+ infdiv.className = "inf";// setAttribute method for class attribute doesn't seem to work on ie<=6
179
+ t.parentNode.insertBefore(infdiv, t);
180
+
181
+ if(displaynrows)
182
+ {
183
+ /*** left div containing rows # displayer ***/
184
+ var totrows;
185
+ var ldiv = createElm( "div",["id","ldiv_"+id] );
186
+ displaynrows ? ldiv.className = "ldiv" : ldiv.style.display = "none";
187
+ displayPaging ? totrows = pagingLength : totrows = getRowsNb(id);
188
+
189
+ var totrows_span = createElm( "span",["id","totrows_span_"+id],["class","tot"] ); // tot # of rows displayer
190
+ totrows_span.className = "tot";//for ie<=6
191
+ totrows_span.appendChild( createText(totrows) );
192
+
193
+ var totrows_txt = createText(totrows_text);
194
+ ldiv.appendChild(totrows_txt);
195
+ ldiv.appendChild(totrows_span);
196
+ infdiv.appendChild(ldiv);
197
+ }
198
+
199
+ if(displayLoader)
200
+ {
201
+ /*** div containing loader ***/
202
+ var loaddiv = createElm( "div",["id","load_"+id],["class","loader"] );
203
+ loaddiv.className = "loader";// for ie<=6
204
+ loaddiv.style.display = "none";
205
+ loaddiv.appendChild( createText(load_text) );
206
+ infdiv.appendChild(loaddiv);
207
+ }
208
+
209
+ if(displayPaging)
210
+ {
211
+ /*** mid div containing paging displayer ***/
212
+ var mdiv = createElm( "div",["id","mdiv_"+id] );
213
+ displayPaging ? mdiv.className = "mdiv" : mdiv.style.display = "none";
214
+ infdiv.appendChild(mdiv);
215
+
216
+ var start_row = t.tf_ref_row;
217
+ var row = grabTag(t,"tr");
218
+ var nrows = row.length;
219
+ var npages = Math.ceil( (nrows - start_row)/pagingLength );//calculates page nb
220
+
221
+ var slcPages = createElm( "select",["id","slcPages_"+id] );
222
+ slcPages.onchange = function(){
223
+ if(displayLoader) showLoader(id,"");
224
+ t.tf_startPagingRow = this.value;
225
+ GroupByPage(id);
226
+ if(displayLoader) showLoader(id,"none");
227
+ }
228
+
229
+ var pgspan = createElm( "span",["id","pgspan_"+id] );
230
+ grabEBI("mdiv_"+id).appendChild( createText(" Page ") );
231
+ grabEBI("mdiv_"+id).appendChild(slcPages);
232
+ grabEBI("mdiv_"+id).appendChild( createText(" of ") );
233
+ pgspan.appendChild( createText(npages+" ") );
234
+ grabEBI("mdiv_"+id).appendChild(pgspan);
235
+
236
+ for(var j=start_row; j<nrows; j++)//this sets rows to validRow=true
237
+ {
238
+ row[j].setAttribute("validRow","true");
239
+ }//for j
240
+
241
+ setPagingInfo(id);
242
+ if(displayLoader) showLoader(id,"none");
243
+ }
244
+
245
+ if(btnreset && fltgrid)
246
+ {
247
+ /*** right div containing reset button **/
248
+ var rdiv = createElm( "div",["id","reset_"+id] );
249
+ btnreset ? rdiv.className = "rdiv" : rdiv.style.display = "none";
250
+
251
+ var fltreset = createElm( "a",
252
+ ["href","javascript:clearFilters('"+id+"');Filter('"+id+"');"] );
253
+ fltreset.appendChild(createText(btnreset_text));
254
+ rdiv.appendChild(fltreset);
255
+ infdiv.appendChild(rdiv);
256
+ }
257
+
258
+ }//if displaynrows etc.
259
+
260
+ if(colWidth)
261
+ {
262
+ t.tf_colWidth = f["col_width"];
263
+ setColWidths(id);
264
+ }
265
+
266
+ if(alternateBgs && !displayPaging)
267
+ setAlternateRows(id);
268
+
269
+ if(colOperation)
270
+ {
271
+ t.tf_colOperation = f["col_operation"];
272
+ setColOperation(id);
273
+ }
274
+
275
+ if(rowVisibility)
276
+ {
277
+ t.tf_rowVisibility = f["rows_always_visible"];
278
+ if(displayPaging) setVisibleRows(id);
279
+ }
280
+
281
+ if(bindScript)
282
+ {
283
+ t.tf_bindScript = f["bind_script"];
284
+ if( t.tf_bindScript!=undefined &&
285
+ t.tf_bindScript["target_fn"]!=undefined )
286
+ {//calls a fn if defined
287
+ t.tf_bindScript["target_fn"].call(null,id);
288
+ }
289
+ }//if bindScript
290
+ }
291
+
292
+ function PopulateOptions(id,cellIndex)
293
+ /*====================================================
294
+ - populates select
295
+ - adds only 1 occurence of a value
296
+ =====================================================*/
297
+ {
298
+ var t = grabEBI(id);
299
+ var ncells = t.tf_ncells, opt0txt = t.tf_display_allText;
300
+ var sort_opts = t.tf_sortSlc, paging = t.tf_displayPaging;
301
+ var start_row = t.tf_ref_row;
302
+ var row = grabTag(t,"tr");
303
+ var OptArray = new Array();
304
+ var optIndex = 0; // option index
305
+ var currOpt = new Option(opt0txt,"",false,false); //1st option
306
+ grabEBI("flt"+cellIndex+"_"+id).options[optIndex] = currOpt;
307
+
308
+ for(var k=start_row; k<row.length; k++)
309
+ {
310
+ var cell = getChildElms(row[k]).childNodes;
311
+ var nchilds = cell.length;
312
+ var isPaged = row[k].getAttribute("paging");
313
+
314
+ if(nchilds == ncells){// checks if row has exact cell #
315
+
316
+ for(var j=0; j<nchilds; j++)// this loop retrieves cell data
317
+ {
318
+ if(cellIndex==j)
319
+ {
320
+ var cell_data = getCellText(cell[j]);
321
+ // checks if celldata is already in array
322
+ var isMatched = false;
323
+ for(w in OptArray)
324
+ {
325
+ if( cell_data == OptArray[w] ) isMatched = true;
326
+ }
327
+ if(!isMatched) OptArray.push(cell_data);
328
+ }//if cellIndex==j
329
+ }//for j
330
+ }//if
331
+ }//for k
332
+
333
+ if(sort_opts) OptArray.sort();
334
+ for(y in OptArray)
335
+ {
336
+ optIndex++;
337
+ var currOpt = new Option(OptArray[y],OptArray[y],false,false);
338
+ grabEBI("flt"+cellIndex+"_"+id).options[optIndex] = currOpt;
339
+ }
340
+
341
+ }
342
+
343
+ function Filter(id)
344
+ /*====================================================
345
+ - Filtering fn
346
+ - gets search strings from SearchFlt array
347
+ - retrieves data from each td in every single tr
348
+ and compares to search string for current
349
+ column
350
+ - tr is hidden if all search strings are not
351
+ found
352
+ =====================================================*/
353
+ {
354
+ showLoader(id,"");
355
+ SearchFlt = getFilters(id);
356
+ var t = grabEBI(id);
357
+ t.tf_Obj!=undefined ? fprops = t.tf_Obj : fprops = new Array();
358
+ var SearchArgs = new Array();
359
+ var ncells = getCellsNb(id);
360
+ var totrows = getRowsNb(id), hiddenrows = 0;
361
+ var ematch = t.tf_exactMatch;
362
+ var showPaging = t.tf_displayPaging;
363
+
364
+ for(var i=0; i<SearchFlt.length; i++)
365
+ SearchArgs.push( (grabEBI(SearchFlt[i]).value).toLowerCase() );
366
+
367
+ var start_row = t.tf_ref_row;
368
+ var row = grabTag(t,"tr");
369
+
370
+ for(var k=start_row; k<row.length; k++)
371
+ {
372
+ /*** if table already filtered some rows are not visible ***/
373
+ if(row[k].style.display == "none") row[k].style.display = "";
374
+
375
+ var cell = getChildElms(row[k]).childNodes;
376
+ var nchilds = cell.length;
377
+
378
+ if(nchilds == ncells)// checks if row has exact cell #
379
+ {
380
+ var cell_value = new Array();
381
+ var occurence = new Array();
382
+ var isRowValid = true;
383
+
384
+ for(var j=0; j<nchilds; j++)// this loop retrieves cell data
385
+ {
386
+ var cell_data = getCellText(cell[j]).toLowerCase();
387
+ cell_value.push(cell_data);
388
+
389
+ if(SearchArgs[j]!="")
390
+ {
391
+ var num_cell_data = parseFloat(cell_data);
392
+
393
+ if(/<=/.test(SearchArgs[j]) && !isNaN(num_cell_data)) // first checks if there is an operator (<,>,<=,>=)
394
+ {
395
+ num_cell_data <= parseFloat(SearchArgs[j].replace(/<=/,"")) ? occurence[j] = true : occurence[j] = false;
396
+ }
397
+
398
+ else if(/>=/.test(SearchArgs[j]) && !isNaN(num_cell_data))
399
+ {
400
+ num_cell_data >= parseFloat(SearchArgs[j].replace(/>=/,"")) ? occurence[j] = true : occurence[j] = false;
401
+ }
402
+
403
+ else if(/</.test(SearchArgs[j]) && !isNaN(num_cell_data))
404
+ {
405
+ num_cell_data < parseFloat(SearchArgs[j].replace(/</,"")) ? occurence[j] = true : occurence[j] = false;
406
+ }
407
+
408
+ else if(/>/.test(SearchArgs[j]) && !isNaN(num_cell_data))
409
+ {
410
+ num_cell_data > parseFloat(SearchArgs[j].replace(/>/,"")) ? occurence[j] = true : occurence[j] = false;
411
+ }
412
+
413
+ else
414
+ {
415
+ // Improved by Cedric Wartel (cwl)
416
+ // automatic exact match for selects and special characters are now filtered
417
+ // modif cwl : exact match automatique sur les select
418
+ var regexp;
419
+ if(ematch || fprops["col_"+j]=="select") regexp = new RegExp('(^)'+regexpEscape(SearchArgs[j])+'($)',"gi");
420
+ else regexp = new RegExp(regexpEscape(SearchArgs[j]),"gi");
421
+ occurence[j] = regexp.test(cell_data);
422
+ }
423
+ }//if SearchArgs
424
+ }//for j
425
+
426
+ for(var z=0; z<ncells; z++)
427
+ {
428
+ if(SearchArgs[z]!="" && !occurence[z]) isRowValid = false;
429
+ }//for t
430
+
431
+ }//if
432
+
433
+ if(!isRowValid)
434
+ {
435
+ row[k].style.display = "none"; hiddenrows++;
436
+ if( showPaging ) row[k].setAttribute("validRow","false");
437
+ } else {
438
+ row[k].style.display = "";
439
+ if( showPaging ) row[k].setAttribute("validRow","true");
440
+ }
441
+
442
+ }// for k
443
+
444
+ t.tf_nRows = parseInt( getRowsNb(id) )-hiddenrows;
445
+ if( !showPaging ) applyFilterProps(id);//applies filter props after filtering process
446
+ if( showPaging ){ t.tf_startPagingRow=0; setPagingInfo(id); }//starts paging process
447
+ }
448
+
449
+ function setPagingInfo(id)
450
+ /*====================================================
451
+ - Paging fn
452
+ - calculates page # according to valid rows
453
+ - refreshes paging select according to page #
454
+ - Calls GroupByPage fn
455
+ =====================================================*/
456
+ {
457
+ var t = grabEBI(id);
458
+ var start_row = parseInt( t.tf_ref_row );//filter start row
459
+ var pagelength = t.tf_pagingLength;
460
+ var row = grabTag(t,"tr");
461
+ var mdiv = grabEBI("mdiv_"+id);
462
+ var slcPages = grabEBI("slcPages_"+id);
463
+ var pgspan = grabEBI("pgspan_"+id);
464
+ var nrows = 0;
465
+
466
+ for(var j=start_row; j<row.length; j++)//counts rows to be grouped
467
+ {
468
+ if(row[j].getAttribute("validRow") == "true") nrows++;
469
+ }//for j
470
+
471
+ var npg = Math.ceil( nrows/pagelength );//calculates page nb
472
+ pgspan.innerHTML = npg; //refresh page nb span
473
+ slcPages.innerHTML = "";//select clearing shortcut
474
+
475
+ if( npg>0 )
476
+ {
477
+ mdiv.style.visibility = "visible";
478
+ for(var z=0; z<npg; z++)
479
+ {
480
+ var currOpt = new Option((z+1),z*pagelength,false,false);
481
+ slcPages.options[z] = currOpt;
482
+ }
483
+ } else {/*** if no results paging select is hidden ***/
484
+ mdiv.style.visibility = "hidden";
485
+ }
486
+
487
+ GroupByPage(id);
488
+ }
489
+
490
+ function GroupByPage(id)
491
+ /*====================================================
492
+ - Paging fn
493
+ - Displays current page rows
494
+ =====================================================*/
495
+ {
496
+ showLoader(id,"");
497
+ var t = grabEBI(id);
498
+ var start_row = parseInt( t.tf_ref_row );//filter start row
499
+ var pagelength = parseInt( t.tf_pagingLength );
500
+ var paging_start_row = parseInt( t.tf_startPagingRow );//paging start row
501
+ var paging_end_row = paging_start_row + pagelength;
502
+ var row = grabTag(t,"tr");
503
+ var nrows = 0;
504
+ var validRows = new Array();//stores valid rows index
505
+
506
+ for(var j=start_row; j<row.length; j++)
507
+ //this loop stores valid rows index in validRows Array
508
+ {
509
+ var isRowValid = row[j].getAttribute("validRow");
510
+ if(isRowValid=="true") validRows.push(j);
511
+ }//for j
512
+
513
+ for(h=0; h<validRows.length; h++)
514
+ //this loop shows valid rows of current page
515
+ {
516
+ if( h>=paging_start_row && h<paging_end_row )
517
+ {
518
+ nrows++;
519
+ row[ validRows[h] ].style.display = "";
520
+ } else row[ validRows[h] ].style.display = "none";
521
+ }//for h
522
+
523
+ t.tf_nRows = parseInt(nrows);
524
+ applyFilterProps(id);//applies filter props after filtering process
525
+ }
526
+
527
+ function applyFilterProps(id)
528
+ /*====================================================
529
+ - checks fns that should be called
530
+ after filtering and/or paging process
531
+ =====================================================*/
532
+ {
533
+ t = grabEBI(id);
534
+ var rowsCounter = t.tf_rowsCounter;
535
+ var nRows = t.tf_nRows;
536
+ var rowVisibility = t.tf_rowVisibility;
537
+ var alternateRows = t.tf_alternateBgs;
538
+ var colOperation = t.tf_colOperation;
539
+
540
+ if( rowsCounter ) showRowsCounter( id,parseInt(nRows) );//refreshes rows counter
541
+ if( rowVisibility ) setVisibleRows(id);//shows rows always visible
542
+ if( alternateRows ) setAlternateRows(id);//alterning row colors
543
+ if( colOperation ) setColOperation(id);//makes operation on a col
544
+ showLoader(id,"none");
545
+ }
546
+
547
+ function hasGrid(id)
548
+ /*====================================================
549
+ - checks if table has a filter grid
550
+ - returns a boolean
551
+ =====================================================*/
552
+ {
553
+ var r = false, t = grabEBI(id);
554
+ if(t != null && t.nodeName.toLowerCase() == "table")
555
+ {
556
+ for(i in TblId)
557
+ {
558
+ if(id == TblId[i]) r = true;
559
+ }// for i
560
+ }//if
561
+ return r;
562
+ }
563
+
564
+ function getCellsNb(id,nrow)
565
+ /*====================================================
566
+ - returns number of cells in a row
567
+ - if nrow param is passed returns number of cells
568
+ of that specific row
569
+ =====================================================*/
570
+ {
571
+ var t = grabEBI(id);
572
+ var tr;
573
+ if(nrow == undefined) tr = grabTag(t,"tr")[0];
574
+ else tr = grabTag(t,"tr")[nrow];
575
+ var n = getChildElms(tr);
576
+ return n.childNodes.length;
577
+ }
578
+
579
+ function getRowsNb(id)
580
+ /*====================================================
581
+ - returns total nb of filterable rows starting
582
+ from reference row if defined
583
+ =====================================================*/
584
+ {
585
+ var t = grabEBI(id);
586
+ var s = t.tf_ref_row;
587
+ var ntrs = grabTag(t,"tr").length;
588
+ return parseInt(ntrs-s);
589
+ }
590
+
591
+ function getFilters(id)
592
+ /*====================================================
593
+ - returns an array containing filters ids
594
+ - Note that hidden filters are also returned
595
+ =====================================================*/
596
+ {
597
+ var SearchFltId = new Array();
598
+ var t = grabEBI(id);
599
+ var tr = grabTag(t,"tr")[0];
600
+ var enfants = tr.childNodes;
601
+ if(t.tf_fltGrid)
602
+ {
603
+ for(var i=0; i<enfants.length; i++)
604
+ SearchFltId.push(enfants[i].firstChild.getAttribute("id"));
605
+ }
606
+ return SearchFltId;
607
+ }
608
+
609
+ function clearFilters(id)
610
+ /*====================================================
611
+ - clears grid filters
612
+ =====================================================*/
613
+ {
614
+ SearchFlt = getFilters(id);
615
+ for(i in SearchFlt) grabEBI(SearchFlt[i]).value = "";
616
+ }
617
+
618
+ function showLoader(id,p)
619
+ /*====================================================
620
+ - displays/hides loader div
621
+ =====================================================*/
622
+ {
623
+ var loader = grabEBI("load_"+id);
624
+ if(loader != null && p=="none")
625
+ setTimeout("grabEBI('load_"+id+"').style.display = '"+p+"'",150);
626
+ else if(loader != null && p!="none") loader.style.display = p;
627
+ }
628
+
629
+ function showRowsCounter(id,p)
630
+ /*====================================================
631
+ - Shows total number of filtered rows
632
+ =====================================================*/
633
+ {
634
+ var totrows = grabEBI("totrows_span_"+id);
635
+ if(totrows != null && totrows.nodeName.toLowerCase() == "span" )
636
+ totrows.innerHTML = p;
637
+ }
638
+
639
+ function getChildElms(n)
640
+ /*====================================================
641
+ - checks passed node is a ELEMENT_NODE nodeType=1
642
+ - removes TEXT_NODE nodeType=3
643
+ =====================================================*/
644
+ {
645
+ if(n.nodeType == 1)
646
+ {
647
+ var enfants = n.childNodes;
648
+ for(var i=0; i<enfants.length; i++)
649
+ {
650
+ var child = enfants[i];
651
+ if(child.nodeType == 3) n.removeChild(child);
652
+ }
653
+ return n;
654
+ }
655
+ }
656
+
657
+ function getCellText(n)
658
+ /*====================================================
659
+ - returns text + text of child nodes of a cell
660
+ =====================================================*/
661
+ {
662
+ var s = "";
663
+ var enfants = n.childNodes;
664
+ for(var i=0; i<enfants.length; i++)
665
+ {
666
+ var child = enfants[i];
667
+ if(child.nodeType == 3) s+= child.data;
668
+ else s+= getCellText(child);
669
+ }
670
+ return s;
671
+ }
672
+
673
+ function getColValues(id,colindex,num)
674
+ /*====================================================
675
+ - returns an array containing cell values of
676
+ a column
677
+ - needs following args:
678
+ - filter id (string)
679
+ - column index (number)
680
+ - a boolean set to true if we want only
681
+ numbers to be returned
682
+ =====================================================*/
683
+ {
684
+ var t = grabEBI(id);
685
+ var row = grabTag(t,"tr");
686
+ var nrows = row.length;
687
+ var start_row = parseInt( t.tf_ref_row );//filter start row
688
+ var ncells = getCellsNb( id,start_row );
689
+ var colValues = new Array();
690
+
691
+ for(var i=start_row; i<nrows; i++)//iterates rows
692
+ {
693
+ var cell = getChildElms(row[i]).childNodes;
694
+ var nchilds = cell.length;
695
+
696
+ if(nchilds == ncells)// checks if row has exact cell #
697
+ {
698
+ for(var j=0; j<nchilds; j++)// this loop retrieves cell data
699
+ {
700
+ if(j==colindex && row[i].style.display=="" )
701
+ {
702
+ var cell_data = getCellText( cell[j] ).toLowerCase();
703
+ (num) ? colValues.push( parseFloat(cell_data) ) : colValues.push( cell_data );
704
+ }//if j==k
705
+ }//for j
706
+ }//if nchilds == ncells
707
+ }//for i
708
+ return colValues;
709
+ }
710
+
711
+ function setColWidths(id)
712
+ /*====================================================
713
+ - sets widths of columns
714
+ =====================================================*/
715
+ {
716
+ if( hasGrid(id) )
717
+ {
718
+ var t = grabEBI(id);
719
+ t.style.tableLayout = "fixed";
720
+ var colWidth = t.tf_colWidth;
721
+ var start_row = parseInt( t.tf_ref_row );//filter start row
722
+ var row = grabTag(t,"tr")[0];
723
+ var ncells = getCellsNb(id,start_row);
724
+ for(var i=0; i<colWidth.length; i++)
725
+ {
726
+ for(var k=0; k<ncells; k++)
727
+ {
728
+ cell = row.childNodes[k];
729
+ if(k==i) cell.style.width = colWidth[i];
730
+ }//var k
731
+ }//for i
732
+ }//if hasGrid
733
+ }
734
+
735
+ function setVisibleRows(id)
736
+ /*====================================================
737
+ - makes a row always visible
738
+ =====================================================*/
739
+ {
740
+ if( hasGrid(id) )
741
+ {
742
+ var t = grabEBI(id);
743
+ var row = grabTag(t,"tr");
744
+ var nrows = row.length;
745
+ var showPaging = t.tf_displayPaging;
746
+ var visibleRows = t.tf_rowVisibility;
747
+ for(var i=0; i<visibleRows.length; i++)
748
+ {
749
+ if(visibleRows[i]<=nrows)//row index cannot be > nrows
750
+ {
751
+ if(showPaging)
752
+ row[ visibleRows[i] ].setAttribute("validRow","true");
753
+ row[ visibleRows[i] ].style.display = "";
754
+ }//if
755
+ }//for i
756
+ }//if hasGrid
757
+ }
758
+
759
+ function setAlternateRows(id)
760
+ /*====================================================
761
+ - alternates row colors for better readability
762
+ =====================================================*/
763
+ {
764
+ if( hasGrid(id) )
765
+ {
766
+ var t = grabEBI(id);
767
+ var row = grabTag(t,"tr");
768
+ var nrows = row.length;
769
+ var start_row = parseInt( t.tf_ref_row );//filter start row
770
+ var visiblerows = new Array();
771
+ for(var i=start_row; i<nrows; i++)//visible rows are stored in visiblerows array
772
+ if( row[i].style.display=="" ) visiblerows.push(i);
773
+
774
+ for(var j=0; j<visiblerows.length; j++)//alternates bg color
775
+ (j % 2 == 0) ? row[ visiblerows[j] ].className = "even" : row[ visiblerows[j] ].className = "odd";
776
+
777
+ }//if hasGrid
778
+ }
779
+
780
+ function setColOperation(id)
781
+ /*====================================================
782
+ - Calculates values of a column
783
+ - params are stored in 'colOperation' table's
784
+ attribute
785
+ - colOperation["id"] contains ids of elements
786
+ showing result (array)
787
+ - colOperation["col"] contains index of
788
+ columns (array)
789
+ - colOperation["operation"] contains operation
790
+ type (array, values: sum, mean)
791
+ - colOperation["write_method"] array defines
792
+ which method to use for displaying the
793
+ result (innerHTML, setValue, createTextNode).
794
+ Note that innerHTML is the default value.
795
+
796
+ !!! to be optimised
797
+ =====================================================*/
798
+ {
799
+ if( hasGrid(id) )
800
+ {
801
+ var t = grabEBI(id);
802
+ var labelId = t.tf_colOperation["id"];
803
+ var colIndex = t.tf_colOperation["col"];
804
+ var operation = t.tf_colOperation["operation"];
805
+ var outputType = t.tf_colOperation["write_method"];
806
+ var precision = 2;//decimal precision
807
+
808
+ if( (typeof labelId).toLowerCase()=="object"
809
+ && (typeof colIndex).toLowerCase()=="object"
810
+ && (typeof operation).toLowerCase()=="object" )
811
+ {
812
+ var row = grabTag(t,"tr");
813
+ var nrows = row.length;
814
+ var start_row = parseInt( t.tf_ref_row );//filter start row
815
+ var ncells = getCellsNb( id,start_row );
816
+ var colvalues = new Array();
817
+
818
+ for(var k=0; k<colIndex.length; k++)//this retrieves col values
819
+ {
820
+ colvalues.push( getColValues(id,colIndex[k],true) );
821
+ }//for k
822
+
823
+ for(var i=0; i<colvalues.length; i++)
824
+ {
825
+ var result=0, nbvalues=0;
826
+ for(var j=0; j<colvalues[i].length; j++ )
827
+ {
828
+ var cvalue = colvalues[i][j];
829
+ if( !isNaN(cvalue) )
830
+ {
831
+ switch( operation[i].toLowerCase() )
832
+ {
833
+ case "sum":
834
+ result += parseFloat( cvalue );
835
+ break;
836
+ case "mean":
837
+ nbvalues++;
838
+ result += parseFloat( cvalue );
839
+ break;
840
+ //add cases for other operations
841
+ }//switch
842
+ }
843
+ }//for j
844
+
845
+ switch( operation[i].toLowerCase() )
846
+ {
847
+ case "mean":
848
+ result = result/nbvalues;
849
+ break;
850
+ }
851
+
852
+ if(outputType != undefined && (typeof outputType).toLowerCase()=="object")
853
+ //if outputType is defined
854
+ {
855
+ result = result.toFixed( precision );
856
+ if( grabEBI( labelId[i] )!=undefined )
857
+ {
858
+ switch( outputType[i].toLowerCase() )
859
+ {
860
+ case "innerhtml":
861
+ grabEBI( labelId[i] ).innerHTML = result;
862
+ break;
863
+ case "setvalue":
864
+ grabEBI( labelId[i] ).value = result;
865
+ break;
866
+ case "createtextnode":
867
+ var oldnode = grabEBI( labelId[i] ).firstChild;
868
+ var txtnode = createText( result );
869
+ grabEBI( labelId[i] ).replaceChild( txtnode,oldnode );
870
+ break;
871
+ //other cases could be added
872
+ }//switch
873
+ }
874
+ } else {
875
+ try
876
+ {
877
+ grabEBI( labelId[i] ).innerHTML = result.toFixed( precision );
878
+ } catch(e){ }//catch
879
+ }//else
880
+
881
+ }//for i
882
+
883
+ }//if typeof
884
+ }//if hasGrid
885
+ }
886
+
887
+ function grabEBI(id)
888
+ /*====================================================
889
+ - this is just a getElementById shortcut
890
+ =====================================================*/
891
+ {
892
+ return document.getElementById( id );
893
+ }
894
+
895
+ function grabTag(obj,tagname)
896
+ /*====================================================
897
+ - this is just a getElementsByTagName shortcut
898
+ =====================================================*/
899
+ {
900
+ return obj.getElementsByTagName( tagname );
901
+ }
902
+
903
+ function regexpEscape(s)
904
+ /*====================================================
905
+ - escapes special characters [\^$.|?*+()
906
+ for regexp
907
+ - Many thanks to Cedric Wartel for this fn
908
+ =====================================================*/
909
+ {
910
+ // traite les caract�res sp�ciaux [\^$.|?*+()
911
+ //remplace le carct�re c par \c
912
+ function escape(e)
913
+ {
914
+ a = new RegExp('\\'+e,'g');
915
+ s = s.replace(a,'\\'+e);
916
+ }
917
+
918
+ chars = new Array('\\','[','^','$','.','|','?','*','+','(',')');
919
+ //chars.each(escape); // no prototype framework here...
920
+ for(e in chars) escape(chars[e]);
921
+ return s;
922
+ }
923
+
924
+ function createElm(elm)
925
+ /*====================================================
926
+ - returns an html element with its attributes
927
+ - accepts the following params:
928
+ - a string defining the html element
929
+ to create
930
+ - an undetermined # of arrays containing the
931
+ couple "attribute name","value" ["id","myId"]
932
+ =====================================================*/
933
+ {
934
+ var el = document.createElement( elm );
935
+ if(arguments.length>1)
936
+ {
937
+ for(var i=0; i<arguments.length; i++)
938
+ {
939
+ var argtype = typeof arguments[i];
940
+ switch( argtype.toLowerCase() )
941
+ {
942
+ case "object":
943
+ if( arguments[i].length==2 )
944
+ {
945
+ el.setAttribute( arguments[i][0],arguments[i][1] );
946
+ }//if array length==2
947
+ break;
948
+ }//switch
949
+ }//for i
950
+ }//if args
951
+ return el;
952
+ }
953
+
954
+ function createText(node)
955
+ /*====================================================
956
+ - this is just a document.createTextNode shortcut
957
+ =====================================================*/
958
+ {
959
+ return document.createTextNode( node );
960
+ }
961
+
962
+ function DetectKey(e)
963
+ /*====================================================
964
+ - common fn that detects return key for a given
965
+ element (onkeypress attribute on input)
966
+ =====================================================*/
967
+ {
968
+ var evt=(e)?e:(window.event)?window.event:null;
969
+ if(evt)
970
+ {
971
+ var key=(evt.charCode)?evt.charCode:
972
+ ((evt.keyCode)?evt.keyCode:((evt.which)?evt.which:0));
973
+ if(key=="13")
974
+ {
975
+ var cid, leftstr, tblid, CallFn, Match;
976
+ cid = this.getAttribute("id");
977
+ leftstr = this.getAttribute("id").split("_")[0];
978
+ tblid = cid.substring(leftstr.length+1,cid.length);
979
+ t = grabEBI(tblid);
980
+ (t.tf_isModfilter_fn) ? t.tf_modfilter_fn.call() : Filter(tblid);
981
+ }//if key
982
+ }//if evt
983
+ }
984
+
985
+ function importScript(scriptName,scriptPath)
986
+ {
987
+ var isImported = false;
988
+ var scripts = grabTag(document,"script");
989
+
990
+ for (var i=0; i<scripts.length; i++)
991
+ {
992
+ if(scripts[i].src.match(scriptPath))
993
+ {
994
+ isImported = true;
995
+ break;
996
+ }
997
+ }
998
+
999
+ if( !isImported )//imports script if not available
1000
+ {
1001
+ var head = grabTag(document,"head")[0];
1002
+ var extScript = createElm( "script",
1003
+ ["id",scriptName],
1004
+ ["type","text/javascript"],
1005
+ ["src",scriptPath] );
1006
+ head.appendChild(extScript);
1007
+ }
1008
+ }//fn importScript
1009
+
1010
+
1011
+
1012
+ /*====================================================
1013
+ - Below a collection of public functions
1014
+ for developement purposes
1015
+ - all public methods start with prefix 'TF_'
1016
+ - These methods can be removed safely if not
1017
+ needed
1018
+ =====================================================*/
1019
+
1020
+ function TF_GetFilterIds()
1021
+ /*====================================================
1022
+ - returns an array containing filter grids ids
1023
+ =====================================================*/
1024
+ {
1025
+ try{ return TblId }
1026
+ catch(e){ alert('TF_GetFilterIds() fn: could not retrieve any ids'); }
1027
+ }
1028
+
1029
+ function TF_HasGrid(id)
1030
+ /*====================================================
1031
+ - checks if table has a filter grid
1032
+ - returns a boolean
1033
+ =====================================================*/
1034
+ {
1035
+ return hasGrid(id);
1036
+ }
1037
+
1038
+ function TF_GetFilters(id)
1039
+ /*====================================================
1040
+ - returns an array containing filters ids of a
1041
+ specified grid
1042
+ =====================================================*/
1043
+ {
1044
+ try
1045
+ {
1046
+ var flts = getFilters(id);
1047
+ return flts;
1048
+ } catch(e) {
1049
+ alert('TF_GetFilters() fn: table id not found');
1050
+ }
1051
+
1052
+ }
1053
+
1054
+ function TF_GetStartRow(id)
1055
+ /*====================================================
1056
+ - returns starting row index for filtering
1057
+ process
1058
+ =====================================================*/
1059
+ {
1060
+ try
1061
+ {
1062
+ var t = grabEBI(id);
1063
+ return t.tf_ref_row;
1064
+ } catch(e) {
1065
+ alert('TF_GetStartRow() fn: table id not found');
1066
+ }
1067
+ }
1068
+
1069
+ function TF_GetColValues(id,colindex,num)
1070
+ /*====================================================
1071
+ - returns an array containing cell values of
1072
+ a column
1073
+ - needs following args:
1074
+ - filter id (string)
1075
+ - column index (number)
1076
+ - a boolean set to true if we want only
1077
+ numbers to be returned
1078
+ =====================================================*/
1079
+ {
1080
+ if( hasGrid(id) )
1081
+ {
1082
+ return getColValues(id,colindex,num);
1083
+ }//if TF_HasGrid
1084
+ else alert('TF_GetColValues() fn: table id not found');
1085
+ }
1086
+
1087
+ function TF_Filter(id)
1088
+ /*====================================================
1089
+ - filters a table
1090
+ =====================================================*/
1091
+ {
1092
+ var t = grabEBI(id);
1093
+ if( TF_HasGrid(id) ) Filter(id);
1094
+ else alert('TF_Filter() fn: table id not found');
1095
+ }
1096
+
1097
+ function TF_RemoveFilterGrid(id)
1098
+ /*====================================================
1099
+ - removes a filter grid
1100
+ =====================================================*/
1101
+ {
1102
+ if( TF_HasGrid(id) )
1103
+ {
1104
+ var t = grabEBI(id);
1105
+ clearFilters(id);
1106
+
1107
+ if(grabEBI("inf_"+id)!=null)
1108
+ {
1109
+ t.parentNode.removeChild(t.previousSibling);
1110
+ }
1111
+ // remove paging here
1112
+ var row = grabTag(t,"tr");
1113
+
1114
+ for(var j=0; j<row.length; j++)
1115
+ //this loop shows all rows and removes validRow attribute
1116
+ {
1117
+ row[j].style.display = "";
1118
+ try
1119
+ {
1120
+ if( row[j].hasAttribute("validRow") )
1121
+ row[j].removeAttribute("validRow");
1122
+ } //ie<=6 doesn't support hasAttribute method
1123
+ catch(e){
1124
+ for( var x = 0; x < row[j].attributes.length; x++ )
1125
+ {
1126
+ if( row[j].attributes[x].nodeName.toLowerCase()=="validrow" )
1127
+ row[j].removeAttribute("validRow");
1128
+ }//for x
1129
+ }//catch(e)
1130
+ }//for j
1131
+
1132
+ if( t.tf_alternateBgs )//removes alterning row colors
1133
+ {
1134
+ for(var k=0; k<row.length; k++)
1135
+ //this loop removes bg className
1136
+ {
1137
+ row[k].className = "";
1138
+ }
1139
+ }
1140
+
1141
+ if(t.tf_fltGrid) t.deleteRow(0);
1142
+ for(i in TblId)//removes grid id value from array
1143
+ if(id == TblId[i]) TblId.splice(i,1);
1144
+
1145
+ }//if TF_HasGrid
1146
+ else alert('TF_RemoveFilterGrid() fn: table id not found');
1147
+ }
1148
+
1149
+ function TF_ClearFilters(id)
1150
+ /*====================================================
1151
+ - clears grid filters only, table is not filtered
1152
+ =====================================================*/
1153
+ {
1154
+ if( TF_HasGrid(id) ) clearFilters(id);
1155
+ else alert('TF_ClearFilters() fn: table id not found');
1156
+ }
1157
+
1158
+ function TF_SetFilterValue(id,index,searcharg)
1159
+ /*====================================================
1160
+ - Inserts value in a specified filter
1161
+ - Params:
1162
+ - id: table id (string)
1163
+ - index: filter column index (numeric value)
1164
+ - searcharg: search string
1165
+ =====================================================*/
1166
+ {
1167
+ if( TF_HasGrid(id) )
1168
+ {
1169
+ var flts = getFilters(id);
1170
+ for(i in flts)
1171
+ {
1172
+ if( i==index ) grabEBI(flts[i]).value = searcharg;
1173
+ }
1174
+ } else {
1175
+ alert('TF_SetFilterValue() fn: table id not found');
1176
+ }
1177
+ }
1178
+
1179
+
1180
+
1181
+
1182
+ /*====================================================
1183
+ - bind an external script fns
1184
+ - fns below do not belong to filter grid script
1185
+ and are used to interface with external
1186
+ autocomplete script found at the following URL:
1187
+ http://www.codeproject.com/jscript/jsactb.asp
1188
+ (credit to zichun)
1189
+ - fns used to merge filter grid with external
1190
+ scripts
1191
+ =====================================================*/
1192
+ var colValues = new Array();
1193
+
1194
+ function setAutoComplete(id)
1195
+ {
1196
+ var t = grabEBI(id);
1197
+ var bindScript = t.tf_bindScript;
1198
+ var scriptName = bindScript["name"];
1199
+ var scriptPath = bindScript["path"];
1200
+ initAutoComplete();
1201
+
1202
+ function initAutoComplete()
1203
+ {
1204
+ var filters = TF_GetFilters(id);
1205
+ for(var i=0; i<filters.length; i++)
1206
+ {
1207
+ if( grabEBI(filters[i]).nodeName.toLowerCase()=="input")
1208
+ {
1209
+ colValues.push( getColValues(id,i) );
1210
+ } else colValues.push( '' );
1211
+ }//for i
1212
+
1213
+ try{ actb( grabEBI(filters[0]), colValues[0] ); }
1214
+ catch(e){ alert(scriptPath + " script may not be loaded"); }
1215
+
1216
+ }//fn
1217
+ }