1 sdump('D_WIDGETS',"Loading widgets.js\n");
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.
7 function append_treeitem() {
8 sdump('D_WIDGETS',arg_dump(arguments));
10 if (arguments.length == 1) {
15 if (typeof(e) != 'object') { e = d.getElementById(e); }
17 if (typeof(e) != 'object') { throw('typeof e != object : typeof e = ' + typeof(e)); }
20 if (!treechildren) { sdump('D_WIDGETS','No ' + id + ' to append to\n'); return; }
22 var treeitem = elem('treeitem'); treechildren.appendChild(treeitem);
23 var treerow = elem('treerow'); treeitem.appendChild(treerow);
24 for (var i = 2; i < arguments.length ; i++ ) {
27 { 'label': arguments[i], 'id' : 'treeitem_' + treeitem_id + '_' + i }
29 treerow.appendChild(treecell);
30 //sdump('D_WIDGETS','treecell.label = ' + arguments[i] + '\n');
35 // This was used in browse_list.js as a more flexible alternative to swap_attribute.
36 // The first argument is the element, the second argument is the pertinant attribute,
37 // and the third argument is an array of values to cycle through for setting the
38 // element's attribute. Ex: var toggle = cycle_attribute( target,'toggle',['1','2','3'] );
39 function cycle_attribute() {
40 sdump('D_WIDGETS',arg_dump(arguments));
41 var d; var e; var a; var v;
42 if (arguments.length == 3) {
51 if (typeof(e) != 'object') { e = d.getElementById(e); }
54 if (typeof(e) != 'object') { throw('typeof e != object : typeof e = ' + typeof(e)); }
55 if (!a) { throw('!a : a = ' + a); }
56 if (! e.getAttribute(a) ) { throw(' ! e.getAttribute(a) : a = ' + a); }
57 if (typeof(v) != 'object') { throw('typeof v != object : typeof v = ' + typeof(v)); }
59 var toggle = e.getAttribute(a);
61 sdump('D_WIDGETS','cycling ' + a + ' on ' + e.getAttribute('id') + ' to ');
62 for (var i = 0; i < v.length; i++) {
64 e.setAttribute(a,v[i]);
65 sdump('D_WIDGETS',v[i] + '\n');
73 e.setAttribute(a,v[0]);
74 sdump('D_WIDGETS',v[0] + '\n');
77 throw('current value not in list');
80 sdump('D_WIDGETS','cycle_attribute error: ' + js2JSON(E) + '\n');
81 sdump('D_WIDGETS','null\n');
86 // Treats each argument as an element to disable
87 function disable_widgets() {
88 sdump('D_WIDGETS',arg_dump(arguments));
89 var d = document; var idx = 0;
90 if (arguments[0].nodeName == '#document') {
91 idx = 1; d = arguments[0];
93 for (var i = idx; i < arguments.length; i++) {
94 if (typeof(arguments[i]) == 'object') {
95 sdump('D_WIDGETS',arguments[i] + '.disabled = true;\n');
96 arguments[i].disabled = true;
98 var w = d.getElementById( arguments[i] );
100 sdump('D_WIDGETS',w + '.disabled = true;\n');
107 // removes listitems from listboxes
108 function empty_listbox() {
109 sdump('D_WIDGETS',arg_dump(arguments));
111 if (arguments.length == 1) {
116 if (typeof(e) != 'object') { e = d.getElementById(e); }
118 if (typeof(e) != 'object') { sdump('D_WIDGETS','Failed on empty_listbox\n'); return; }
119 var nl = e.getElementsByTagName('listitem');
120 for (var i = 0; i < nl.length; i++) {
121 e.removeChild(nl[i]);
125 // removes all of an element's children
126 function empty_widget() {
127 sdump('D_WIDGETS',arg_dump(arguments));
129 if (arguments.length == 1) {
134 if (typeof(e) != 'object') { e = d.getElementById(e); }
136 if (typeof(e) != 'object') { sdump('D_WIDGETS','Failed on empty_widget\n'); return; }
137 while (e.lastChild) { e.removeChild(e.lastChild); }
141 // Treats each argument as an element to enable
142 function enable_widgets() {
143 sdump('D_WIDGETS',arg_dump(arguments));
144 var d = document; var idx = 0;
145 if (arguments[0].nodeName == '#document') {
146 idx = 1; d = arguments[0];
148 for (var i = idx; i < arguments.length; i++) {
149 if (typeof(arguments[i]) == 'object') {
150 sdump('D_WIDGETS',arguments[i] + '.disabled = false;\n');
151 arguments[i].disabled = false;
153 var w = d.getElementById( arguments[i] );
155 sdump('D_WIDGETS',w + '.disabled = false;\n');
162 // Originally used in volume.js after intercepting Enter presses on the keyboard.
163 // The first argument is the element to search for textboxes, and the second
164 // argument is the current textbox. This function finds the next textbox and
166 function fake_tab_for_textboxes() {
167 sdump('D_WIDGETS',arg_dump(arguments));
168 var d; var w; var current;
169 if (arguments.length == 2) {
171 current = arguments[1];
175 current = arguments[2];
176 if (typeof(w)!='object') { w = d.getElementById(w); }
178 var flag = false; var next_one;
179 sdump('D_WIDGETS', 'fake_tab_for_textboxes: Current ' + current + '\n');
180 var nl = w.getElementsByTagName('textbox');
181 //var nl = d.getElementsByTagName('textbox');
182 sdump('D_WIDGETS', 'fake_tab_for_textboxes: nl.length = ' + nl.length + '\n');
183 for (var i = 0; i < nl.length; i++) {
184 sdump('D_WIDGETS', 'fake_tab_for_textboxes: Considering ' + nl[i] + '...\n');
185 if (flag && !next_one) {
186 sdump('D_WIDGETS', 'fake_tab_for_textboxes: Setting next_one ' + nl[i] + '\n');
189 if (nl[i] === current) {
190 sdump('D_WIDGETS','fake_tab_for_textboxes: Found current\n');
195 sdump('D_WIDGETS','fake_tab_for_textboxes: Out of loop, Setting next_one ' + nl[0] + '\n');
199 next_one.focus(); next_one.select();
201 sdump('D_WIDGETS','fake_tab_for_textboxes: next_one not set\n');
206 // Not actually used anywhere. I'm not sure what this is :D
207 // Ah, looks like it could handle XUL trees and fieldmapper trees
208 // Ex. find( org_tree, function(o){return o.children();}, function(o){return (o.id == 'the winner');})
209 function find_tree_via_children() {
210 sdump('D_WIDGETS',arg_dump(arguments));
211 var d; var tree; var children_func; var find_func;
212 if (arguments.length == 3) {
214 children_func = arguments[1];
215 find_func = arguments[2];
219 children_func = arguments[2];
220 find_func = arguments[3];
221 if (typeof(tree)!='object') tree = d.getElementById(tree);
224 var t = find_func(tree); if (t) return t;
226 var c = children_func(tree);
228 for (var i = 0; i < c.length; i++) {
229 t = find_func( c[i] );
235 // Give this element focus
236 function focus_widget() {
237 sdump('D_WIDGETS',arg_dump(arguments));
238 var d = document; var e;
239 if (arguments.length == 1) {
245 if (typeof(e) == 'object') {
248 var w = d.getElementById(e);
249 if (w) { w.focus(); }
253 // Returns a list of selected treeitems from the specified tree
254 function get_list_from_tree_selection() {
255 sdump('D_WIDGETS',arg_dump(arguments));
256 var d = document; var tree_w;
257 if (arguments.length == 1) {
258 tree_w = arguments[0];
261 tree_w = arguments[1];
264 if (typeof(tree_w) != 'object') {
265 hitlist = d.getElementById(tree_w);
270 var start = new Object();
271 var end = new Object();
272 var numRanges = hitlist.view.selection.getRangeCount();
273 for (var t=0; t<numRanges; t++){
274 hitlist.view.selection.getRangeAt(t,start,end);
275 for (var v=start.value; v<=end.value; v++){
276 var i = hitlist.contentView.getItemAtIndex(v);
277 //sdump('D_WIDGETS',i.tagName + '\n');
284 // Make sure we a widget
285 function get_widget() {
286 sdump('D_WIDGETS',arg_dump(arguments));
287 var d = document; var e;
288 if (arguments.length == 1) {
294 if (typeof(e) == 'object') {
297 var w = d.getElementById(e);
303 // Increment a XUL progressmeter
304 function incr_progressmeter() {
305 sdump('D_WIDGETS',arg_dump(arguments));
306 var d = document; var meter; var increment;
307 if (arguments.length == 2) {
308 meter = arguments[0];
309 increment = arguments[1];
312 meter = arguments[1];
313 increment = arguments[2];
315 if (typeof(meter)!='object')
316 meter = d.getElementById(meter);
317 if (typeof(meter)!='object')
320 var real = meter.getAttribute('_real');
324 real = parseFloat( real ) + parseFloat( increment );
331 meter.setAttribute('_real',real);
332 meter.value = Math.ceil( real );
335 // Populate a treeitem row
336 function map_array_to_treecells_via_treeitem( cols, treeitem ) {
337 sdump('D_WIDGETS',arg_dump(arguments),{0:true});
338 var treerow = treeitem.firstChild;
339 for (var i = 0; i < treerow.childNodes.length; i++) {
340 var treecell = treerow.childNodes[i];
341 treecell.setAttribute('label',cols[i]);
342 sdump('D_WIDGETS','treeitem = ' + treeitem + ' treerow = ' + treerow + ' treecell = ' + treecell + ' cols[ ' + i + '] = ' + cols[i] + '\n');
346 // Simulates radio buttons with checkboxes. Include this in command event listeners
347 // for the pertinent textboxes. For any set of checkboxes that have the same 'group'
348 // attribute, only one can be checked at a time.
349 function radio_checkbox() {
350 sdump('D_WIDGETS',arg_dump(arguments));
351 var d = document; var ev;
352 if (arguments.length == 1) {
358 var target = ev.target;
359 var group = target.getAttribute('group');
361 var nl = d.getElementsByTagName('checkbox');
363 if (typeof(nl[i])=='object') {
365 var cgroup = c.getAttribute('group');
366 if (cgroup == group) {
371 target.checked = true;
373 sdump('D_WIDGETS','radio_checkbox: Checkbox must have a group attribute to find peers');
377 // simpler version of set_decks
378 function set_deck() {
379 sdump('D_WIDGETS',arg_dump(arguments));
380 var d = document; var deck; var idx;
381 if (arguments.length == 2) {
384 set_decks({ deck : idx });
389 set_decks(d,{ deck : idx });
393 // Takes a hash with key:value => deck element id : page index
394 // Sets each deck to the corresponding index
395 function set_decks() {
396 sdump('D_WIDGETS',arg_dump(arguments));
397 var d = document; var params;
398 if (arguments.length == 1) {
399 params = arguments[0];
402 params = arguments[1];
404 for (var deck_id in params) {
406 if (typeof(deck) != 'object')
407 deck = d.getElementById( deck_id )
409 deck.setAttribute( 'selectedIndex', params[deck_id] );
410 deck.selectedIndex = params[deck_id];
415 // For setting a widget's displayable text
416 function set_widget_value_for_display(e,v) {
417 sdump('D_WIDGETS',arg_dump(arguments,{1:true}));
418 if (v == null || v == undefined) v = '.....';
419 sdump('D_WIDGETS','e.tagName = ' + e.tagName + '\n');
420 sdump('D_WIDGETS','e.nodeName = ' + e.nodeName + '\n');
422 case 'textbox' : e.value = v; break;
423 case 'label' : e.setAttribute('value',v); break;
424 case 'image' : e.setAttribute('src',v); break;
425 case 'menulist' : e.value = v;
426 var menupopup = menulist.firstChild;
428 for (var i = 0; i < menupopup.childNodes.length; i++) {
429 if (menupopup.childNodes[i].getAttribute('value') == v ) menuitem = menupopup.childNodes[i];
431 if (menuitem) e.selectedItem = menuitem;
433 default: try {e.setAttribute('value',v); e.value = v;} catch(E) {} break;
437 // swaps the values of two attributes for an element
438 function swap_attributes() {
439 sdump('D_WIDGETS',arg_dump(arguments));
440 var d = document; var e; var a1; var a2;
441 if (arguments.length == 3) {
450 if (typeof(e) != 'object') { e = d.getElementById(e); }
452 if (typeof(e) != 'object') { sdump('D_WIDGETS','Failed on swap_attributes\n'); return; }
453 var a1_v = e.getAttribute(a1);
454 var a2_v = e.getAttribute(a2);
455 e.setAttribute(a1,a2_v);
456 e.setAttribute(a2, a1_v);
457 sdump('D_WIDGETS','before: a1 = ' + a1_v + ' a2 = ' + a2_v + ' and ');
458 sdump('D_WIDGETS','after: a1 = ' + a2_v + ' a2 = ' + a1_v + '\n');
461 // Flips the hidden value for each row in a grid
462 function toggle_hidden_grid_rows() {
463 sdump('D_WIDGETS',arg_dump(arguments));
464 if (arguments.length == 1) {
470 if (typeof(grid) != 'object') {
471 grid = d.getElementById(grid);
473 if (!grid) { return; }
474 var rows = grid.lastChild; if (!rows) { return; }
475 for (var r = 0; r < rows.childNodes.length; r++ ) {
476 var row = rows.childNodes[r];
477 if (typeof(row) == 'object') {
478 //sdump('D_WIDGETS','toggle row = ' + row + '\n');
479 var hidden = row.getAttribute('hidden');
480 if (hidden == 'true') {
481 row.setAttribute('hidden','false');
483 row.setAttribute('hidden','true');
489 /* 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 */
490 function xul_setAttributes() {
491 sdump('D_WIDGETS',arg_dump(arguments));
492 var d = document; var el; var attrs;
493 if (arguments.length == 2) {
495 attrs = arguments[1];
499 attrs = arguments[2];
501 if (typeof(el) == 'object') {
503 var w = d.getElementById(e);
504 for (var a in attrs) {
505 w.setAttribute(a,attrs[a]);
509 var w = d.getElementById(el);
510 for (var a in attrs) {
511 w.setAttribute(a,attrs[a]);