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