]> git.evergreen-ils.org Git - Evergreen.git/blob - Evergreen/staff_client/chrome/content/evergreen/util/widgets.js
debug stuff
[Evergreen.git] / Evergreen / staff_client / chrome / content / evergreen / util / widgets.js
1 sdump('D_WIDGETS',"Loading widgets.js\n");
2
3 // This was originally used in circ.js for checkin and checkout lists.
4 // The first argument is the treechildren element for the tree.
5 // Subsequent arguments are treated as textual values for treecells in that treeitem.
6 var treeitem_id = 0;
7 function append_treeitem(d,e) {
8         sdump('D_WIDGETS',arg_dump(arguments));
9         if (typeof(e) != 'object') { e = d.getElementById(e); }
10         if (typeof(e) != 'object') { throw('typeof e != object : typeof e = ' + typeof(e)); }
11         var treechildren = e;
12
13         if (!treechildren) { sdump('D_WIDGETS','No ' + id + ' to append to\n'); return; }
14
15         var treeitem = elem('treeitem'); treechildren.appendChild(treeitem);
16         var treerow = elem('treerow'); treeitem.appendChild(treerow);
17         for (var i = 2; i < arguments.length ; i++ ) {
18                 var treecell = elem(
19                         'treecell',
20                         { 'label': arguments[i], 'id' : 'treeitem_' + treeitem_id + '_' + i }
21                 );
22                 treerow.appendChild(treecell);
23                 //sdump('D_WIDGETS','treecell.label = ' + arguments[i] + '\n');
24         }
25         return treeitem_id++;
26 }
27
28 // This was used in browse_list.js as a more flexible alternative to swap_attribute.
29 // The first argument is the element, the second argument is the pertinant attribute,
30 // and the third argument is an array of values to cycle through for setting the
31 // element's attribute.  Ex: var toggle = cycle_attribute( target,'toggle',['1','2','3'] );
32 function cycle_attribute(d,e,a,v) {
33         sdump('D_WIDGETS',arg_dump(arguments));
34         try {
35                 if (typeof(e) != 'object') { e = d.getElementById(e); }
36                 if (typeof(e) != 'object') { throw('typeof e != object : typeof e = ' + typeof(e)); }
37                 if (!a) { throw('!a : a = ' + a); }
38                 if (! e.getAttribute(a) ) { throw(' ! e.getAttribute(a) : a = ' + a); }
39                 if (typeof(v) != 'object') { throw('typeof v != object : typeof v = ' + typeof(v)); }
40
41                 var toggle = e.getAttribute(a);
42                 var next_one = false;
43                 sdump('D_WIDGETS','cycling ' + a + ' on ' + e.getAttribute('id') + ' to ');
44                 for (var i = 0; i < v.length; i++) {
45                         if (next_one) {
46                                 e.setAttribute(a,v[i]);
47                                 sdump('D_WIDGETS',v[i] + '\n');
48                                 return v[i];
49                         }
50                         if (toggle == v[i]) {
51                                 next_one = true;
52                         }
53                 }
54                 if (next_one) {
55                         e.setAttribute(a,v[0]);
56                         sdump('D_WIDGETS',v[0] + '\n');
57                         return v[0];
58                 } else {
59                         throw('current value not in list');
60                 }
61         } catch(E) {
62                 sdump('D_WIDGETS','cycle_attribute error: ' + js2JSON(E) + '\n');
63                 sdump('D_WIDGETS','null\n');
64                 return null;
65         }
66 }
67
68 // Treats each argument as an element to disable 
69 function disable_widgets(d) {
70         sdump('D_WIDGETS',arg_dump(arguments));
71         for (var i = 1; i < arguments.length; i++) {
72                 if (typeof(arguments[i]) == 'object') {
73                         sdump('D_WIDGETS',arguments[i] + '.disabled = true;\n');
74                         arguments[i].disabled = true;
75                 } else {
76                         var w = d.getElementById( arguments[i] );
77                         if (w) { 
78                                 sdump('D_WIDGETS',w + '.disabled = true;\n');
79                                 w.disabled = true; 
80                         }
81                 }
82         }
83 }
84
85 // removes listitems from listboxes
86 function empty_listbox(d,e) {
87         sdump('D_WIDGETS',arg_dump(arguments));
88         if (typeof(e) != 'object') { e = d.getElementById(e); }
89         if (typeof(e) != 'object') { sdump('D_WIDGETS','Failed on empty_listbox\n'); return; }
90         var nl = e.getElementsByTagName('listitem');
91         for (var i = 0; i < nl.length; i++) {
92                 e.removeChild(nl[i]);
93         }
94 }
95
96 // removes all of an element's children
97 function empty_widget(d,e) {
98         sdump('D_WIDGETS',arg_dump(arguments));
99         if (typeof(e) != 'object') { e = d.getElementById(e); }
100         if (typeof(e) != 'object') { sdump('D_WIDGETS','Failed on empty_widget\n'); return; }
101         while (e.lastChild) { e.removeChild(e.lastChild); }
102 }
103
104
105 // Treats each argument as an element to enable 
106 function enable_widgets(d) {
107         sdump('D_WIDGETS',arg_dump(arguments));
108         for (var i = 1; i < arguments.length; i++) {
109                 if (typeof(arguments[i]) == 'object') {
110                         sdump('D_WIDGETS',arguments[i] + '.disabled = false;\n');
111                         arguments[i].disabled = false;
112                 } else {
113                         var w = d.getElementById( arguments[i] );
114                         if (w) { 
115                                 sdump('D_WIDGETS',w + '.disabled = false;\n');
116                                 w.disabled = false; 
117                         }
118                 }
119         }
120 }
121
122 // Originally used in volume.js after intercepting Enter presses on the keyboard.
123 // The first argument is the element to search for textboxes, and the second
124 // argument is the current textbox.  This function finds the next textbox and
125 // gives it focus.
126 function fake_tab_for_textboxes(d,w,current) {
127         sdump('D_WIDGETS',arg_dump(arguments));
128         var flag = false; var next_one;
129         if (typeof(w)!='object') {
130                 w = d.getElementById(w);
131         }
132         sdump('D_WIDGETS', 'fake_tab_for_textboxes: Current ' + current + '\n');
133         var nl = w.getElementsByTagName('textbox');
134         //var nl = d.getElementsByTagName('textbox');
135         sdump('D_WIDGETS', 'fake_tab_for_textboxes: nl.length = ' + nl.length + '\n');
136         for (var i = 0; i < nl.length; i++) {
137                 sdump('D_WIDGETS', 'fake_tab_for_textboxes: Considering ' + nl[i] + '...\n');
138                 if (flag && !next_one) {
139                         sdump('D_WIDGETS', 'fake_tab_for_textboxes: Setting next_one ' + nl[i] + '\n'); 
140                         next_one = nl[i];
141                 }
142                 if (nl[i] === current) {
143                         sdump('D_WIDGETS','fake_tab_for_textboxes: Found current\n');
144                         flag = true;
145                 }
146         }
147         if (!next_one) {
148                 sdump('D_WIDGETS','fake_tab_for_textboxes: Out of loop, Setting next_one ' + nl[0] + '\n');     
149                 next_one = nl[0];
150         }
151         if (next_one) {
152                 next_one.focus(); next_one.select();
153         } else {
154                 sdump('D_WIDGETS','fake_tab_for_textboxes: next_one not set\n');
155         }
156 }
157
158
159 // Not actually used anywhere.  I'm not sure what this is :D
160 // Ah, looks like it could handle XUL trees and fieldmapper trees
161 // Ex. find( org_tree, function(o){return o.children();}, function(o){return (o.id == 'the winner');})
162 function find_tree_via_children(d,tree,children_func,find_func) {
163         sdump('D_WIDGETS',arg_dump(arguments));
164         if (typeof(tree)!='object') tree = d.getElementById(tree);
165
166         var t = find_func(tree); if (t) return t;
167
168         var c = children_func(tree);
169
170         for (var i = 0; i < c.length; i++) {
171                 t = find_func( c[i] );
172                 if (t) return t;
173         }
174 }
175
176
177 // Give this element focus
178 function focus_widget(d,e) {
179         sdump('D_WIDGETS',arg_dump(arguments));
180         if (typeof(e) == 'object') {
181                 e.focus();
182         } else {
183                 var w = d.getElementById(e);
184                 if (w) { w.focus(); }
185         }
186 }
187
188 // Returns a list of selected treeitems from the specified tree
189 function get_list_from_tree_selection(d,tree_w) {
190         sdump('D_WIDGETS',arg_dump(arguments));
191         sdump('D_WIDGETS','entering get_list_from_tree...\n');
192         var hitlist;
193         if (typeof(tree_w) != 'object') {
194                 hitlist = d.getElementById(tree_w);
195         } else {
196                 hitlist = tree_w;
197         }
198         var list = [];
199         var start = new Object();
200         var end = new Object();
201         var numRanges = hitlist.view.selection.getRangeCount();
202         for (var t=0; t<numRanges; t++){
203                 hitlist.view.selection.getRangeAt(t,start,end);
204                 for (var v=start.value; v<=end.value; v++){
205                         var i = hitlist.contentView.getItemAtIndex(v);
206                         //sdump('D_WIDGETS',i.tagName + '\n');
207                         list.push( i );
208                 }
209         }
210         sdump('D_WIDGETS','leaving get_list_from_tree...\n');
211         return list;
212 }
213
214 // Make sure we a widget
215 function get_widget(d,e) {
216         sdump('D_WIDGETS',arg_dump(arguments));
217         if (typeof(e) == 'object') {
218                 return e;
219         } else {
220                 var w = d.getElementById(e);
221                 if (w) return w;
222         }
223         return null;
224 }
225
226 // Increment a XUL progressmeter
227 function incr_progressmeter(d,meter,increment) {
228         sdump('D_WIDGETS',arg_dump(arguments));
229         if (typeof(meter)!='object') 
230                 meter = d.getElementById(meter);
231         if (typeof(meter)!='object')
232                 return;
233
234         var real = meter.getAttribute('_real');
235
236         if (!real)
237                 real = 0;
238         real = parseFloat( real ) + parseFloat( increment );
239
240         if (real > 100)
241                 real = 100;
242         else if ( real < 0)
243                 real = 0;
244
245         meter.setAttribute('_real',real);
246         meter.value = Math.ceil( real );
247 }
248
249 // Populate a treeitem row
250 function map_array_to_treecells_via_treeitem( cols, treeitem ) {
251         sdump('D_WIDGETS',arg_dump(arguments),{0:true});
252         var treerow = treeitem.firstChild;
253         for (var i = 0; i < treerow.childNodes.length; i++) {
254                 var treecell = treerow.childNodes[i];
255                 treecell.setAttribute('label',cols[i]);
256                 sdump('D_WIDGETS','treeitem = ' + treeitem + ' treerow = ' + treerow + ' treecell = ' + treecell + ' cols[ ' + i + '] = ' + cols[i] + '\n');
257         }
258 }
259
260 // Simulates radio buttons with checkboxes.  Include this in command event listeners
261 // for the pertinent textboxes.  For any set of checkboxes that have the same 'group'
262 // attribute, only one can be checked at a time.
263 function radio_checkbox(d,ev) {
264         sdump('D_WIDGETS',arg_dump(arguments));
265         var target = ev.target;
266         var group = target.getAttribute('group');
267         if (group) {
268                 var nl = d.getElementsByTagName('checkbox');
269                 for (var i in nl) {
270                         if (typeof(nl[i])=='object') {
271                                 var c = nl[i];
272                                 var cgroup = c.getAttribute('group');
273                                 if (cgroup == group) {
274                                         c.checked = false;
275                                 }
276                         }
277                 }
278                 target.checked = true;
279         } else {
280                 sdump('D_WIDGETS','radio_checkbox: Checkbox must have a group attribute to find peers');
281         }
282 }
283
284 // simpler version of set_decks
285 function set_deck(d,deck,idx) {
286         sdump('D_WIDGETS',arg_dump(arguments));
287         set_decks(d,{ deck : idx });
288 }
289
290 // Takes a hash with key:value => deck element id : page index
291 // Sets each deck to the corresponding index
292 function set_decks(d,params) {
293         sdump('D_WIDGETS',arg_dump(arguments));
294         for (var deck_id in params) {
295                 var deck;
296                 if (typeof(deck) != 'object')
297                         deck = d.getElementById( deck_id )
298                 if (deck) deck.setAttribute( 'selectedIndex', params[deck_id] );
299         }
300 }
301
302 // swaps the values of two attributes for an element
303 function swap_attributes(d,e,a1,a2) {
304         sdump('D_WIDGETS',arg_dump(arguments));
305         if (typeof(e) != 'object') { e = d.getElementById(e); }
306         if (typeof(e) != 'object') { sdump('D_WIDGETS','Failed on swap_attributes\n'); return; }
307         var a1_v = e.getAttribute(a1);
308         var a2_v = e.getAttribute(a2);
309         e.setAttribute(a1,a2_v);
310         e.setAttribute(a2, a1_v);
311         sdump('D_WIDGETS','before: a1 = ' + a1_v + ' a2 = ' + a2_v + ' and ');
312         sdump('D_WIDGETS','after: a1 = ' + a2_v + ' a2 = ' + a1_v + '\n');
313 }
314
315 // Flips the hidden value for each row in a grid
316 function toggle_hidden_grid_rows(d,grid) {
317         sdump('D_WIDGETS',arg_dump(arguments));
318         if (typeof(grid) != 'object') {
319                 grid = d.getElementById(grid);
320         }
321         if (!grid) { return; }
322         var rows = grid.lastChild; if (!rows) { return; }
323         for (var r = 0; r < rows.childNodes.length; r++ ) {
324                 var row = rows.childNodes[r];
325                 if (typeof(row) == 'object') {
326                         //sdump('D_WIDGETS','toggle row = ' + row + '\n');
327                         var hidden = row.getAttribute('hidden');
328                         if (hidden == 'true') {
329                                 row.setAttribute('hidden','false');
330                         } else {
331                                 row.setAttribute('hidden','true');
332                         }
333                 }
334         }
335 }
336
337 /* The first parameter is the id of the element to set, or an array of ids for elements to set in batch.  The second parameter is an object containing the attribute/value pairs to assign to the element or elements */
338 function xul_setAttributes(d,el,attrs) {
339         sdump('D_WIDGETS',arg_dump(arguments));
340         if (typeof(el) == 'object') {
341                 for (var e in el) {
342                         var w = d.getElementById(e);
343                         for (var a in attrs) {
344                                 w.setAttribute(a,attrs[a]);
345                         }
346                 }
347         } else {
348                 var w = d.getElementById(el);
349                 for (var a in attrs) {
350                         w.setAttribute(a,attrs[a]);
351                 }
352         }
353 }
354