]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/chrome/content/util/widgets.js
4867256e9ebbf9ccd00718adbe45e9c6d777862b
[Evergreen.git] / Open-ILS / xul / staff_client / chrome / content / util / widgets.js
1 dump('entering util/widgets.js\n');
2
3 if (typeof util == 'undefined') var util = {};
4 util.widgets = {};
5
6 util.widgets.EXPORT_OK    = [ 
7     'get',
8     'apply',
9     'save_xml',
10     'serialize_node',
11     'xul_from_string',
12     'store_disable',
13     'restore_disable',
14     'disable',
15     'get_list_from_tree_selection',
16     'disable_accesskeys_in_node_and_children', 
17     'enable_accesskeys_in_node_and_children', 
18     'remove_children',
19     'make_grid',
20     'make_menulist',
21     'insertAfter',
22     'apply_vertical_tab_on_enter_handler',
23     'vertical_tab',
24     'click',
25     'dispatch',
26     'stop_event',
27     'set_text',
28     'save_attributes',
29     'load_attributes',
30     'find_descendants_by_name'
31 ];
32 util.widgets.EXPORT_TAGS    = { ':all' : util.widgets.EXPORT_OK };
33
34 util.widgets.get = function(e) {
35     if (typeof e == 'object') {
36         return e;
37     } else {
38         return document.getElementById(e);
39     }
40 }
41
42 util.widgets.apply = function(e,attr,attr_value,f) {
43     var node = util.widgets.get(e);
44     var nl = node.getElementsByAttribute(attr,attr_value);
45     for (var i = 0; i < nl.length; i++) {
46         f( nl[i] );
47     }
48 }
49
50 util.widgets.save_xml = function (filename,node) {
51     try { 
52         netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
53
54         JSAN.use('util.file'); var file = new util.file(filename);
55
56         node = util.widgets.get(node);
57         var xml = util.widgets.serialize_node(node);
58
59         file.write_content('truncate',xml);
60         file.close();
61     } catch(E) {
62         alert('Error in util.widgets.save_xml: ' + E);
63     }
64 }
65
66 util.widgets.serialize_node = function(node) {
67     var serializer = new XMLSerializer();
68     var xml = serializer.serializeToString(node);
69     return xml;
70 }
71
72 util.widgets.xul_from_string = function(xml) {
73     var parser = new DOMParser(); 
74     var doc = parser.parseFromString(xml, "text/xml"); 
75     var node = doc.documentElement;
76     return node;
77 }
78
79 util.widgets.store_disable = function() {
80     for (var i = 0; i < arguments.length; i++) {
81         var e = util.widgets.get( arguments[i] );
82         e.setAttribute('_disabled',e.getAttribute('disabled'));
83     }
84 }
85
86 util.widgets.restore_disable = function() {
87     for (var i = 0; i < arguments.length; i++) {
88         var e = util.widgets.get( arguments[i] );
89         e.setAttribute('disabled',e.getAttribute('_disabled'));
90     }
91 }
92
93 util.widgets.disable = function() {
94     for (var i = 0; i < arguments.length; i++) {
95         var e = util.widgets.get( arguments[i] );
96         e.setAttribute('disabled',true);
97     }
98 }
99
100 util.widgets.click = function(e) {
101     var evt = document.createEvent("MouseEvent");
102     evt.initMouseEvent( "click", true, true, window, 0, 0, 0, 0, 0, false,false,false,false,0,null);
103     util.widgets.get(e).dispatchEvent(evt);
104 }
105
106 util.widgets.dispatch = function(ev,el) {
107     var evt = document.createEvent("Events");
108     //var evt = document.createEvent();
109     evt.initEvent( ev, true, true );
110     util.widgets.get(el).dispatchEvent(evt);
111 }
112
113 util.widgets.make_menulist = function( items, dvalue ) {
114     var menulist = document.createElement('menulist');
115     var menupopup = document.createElement('menupopup'); menulist.appendChild(menupopup);
116     for (var i = 0; i < items.length; i++) {
117         if (typeof items[i] == 'undefined') { continue; }
118         var label = items[i][0]; var value = items[i][1]; var disabled = items[i][2]; var indent = items[i][3];
119         if (indent) {
120             for (var j = 0; j < Number(indent); j++) {
121                 //label = ' ' + label;
122             }
123         }
124         var menuitem = document.createElement('menuitem'); menupopup.appendChild(menuitem);
125         menuitem.setAttribute('label',label);
126         menuitem.setAttribute('value',value);
127         if (indent) {
128             menuitem.setAttribute('style','font-family: monospace; padding-left: ' + indent + 'em;');
129         } else {
130             menuitem.setAttribute('style','font-family: monospace;');
131         }
132         if ( (disabled == true) || (disabled == "true") ) {
133             menuitem.disabled = true;
134             menuitem.setAttribute('disabled','true');
135         }
136     }
137     if (typeof dvalue != 'undefined') {
138         menulist.setAttribute('value',dvalue);
139     }
140     return menulist;
141 }
142
143 util.widgets.make_grid = function( cols ) {
144     var grid = document.createElement('grid');
145     var columns = document.createElement('columns'); grid.appendChild(columns);
146     for (var i = 0; i < cols.length; i++) {
147         var column = document.createElement('column'); columns.appendChild(column);
148         for (var j in cols[i]) {
149             column.setAttribute(j,cols[i][j]);
150         }
151     }
152     var rows = document.createElement('rows'); grid.appendChild(rows);
153     return grid;
154 }
155
156 util.widgets.get_list_from_tree_selection = function(tree_w) {
157     var hitlist;
158     var tree = util.widgets.get(tree_w);
159     var list = [];
160     var start = new Object();
161     var end = new Object();
162     var numRanges = tree.view.selection.getRangeCount();
163     for (var t=0; t<numRanges; t++){
164         tree.view.selection.getRangeAt(t,start,end);
165         for (var v=start.value; v<=end.value; v++){
166             var i = tree.contentView.getItemAtIndex(v);
167             list.push( i );
168         }
169     }
170     return list;
171 }
172
173 util.widgets.remove_children = function() {
174     for (var i = 0; i < arguments.length; i++) {
175         var e = util.widgets.get( arguments[i] );
176         while(e.lastChild) e.removeChild( e.lastChild );
177     }
178 }
179
180 util.widgets.disable_accesskeys_in_node_and_children = function( node ) {
181     return; /* what was I doing here? */
182     if (node.getAttribute('accesskey')) {
183         node.setAttribute('oldaccesskey', node.getAttribute('accesskey'));
184         node.setAttribute('accesskey',''); node.accessKey = '';
185     }
186     for (var i = 0; i < node.childNodes.length; i++) {
187         util.widgets.disable_accesskeys_in_node_and_children( node.childNodes[i] );
188     }
189     dump('- node = <' + node.id + '> accesskey = <' + node.accessKey + '> accesskey = <' + node.getAttribute('accesskey') + '> oldaccesskey = <' + node.getAttribute('oldaccesskey') + '>\n');
190 }
191
192 util.widgets.enable_accesskeys_in_node_and_children = function( node ) {
193     return; /* what was I doing here? */
194     if (node.getAttribute('oldaccesskey')) {
195         node.setAttribute('accesskey', node.getAttribute('oldaccesskey'));
196         node.accessKey = node.getAttribute('oldaccesskey'); 
197         node.setAttribute('oldaccesskey','');
198     }
199     for (var i = 0; i < node.childNodes.length; i++) {
200         util.widgets.enable_accesskeys_in_node_and_children( node.childNodes[i] );
201     }
202     dump('+ node = <' + node.id + '> accesskey = <' + node.accessKey + '> accesskey = <' + node.getAttribute('accesskey') + '> oldaccesskey = <' + node.getAttribute('oldaccesskey') + '>\n');
203 }
204
205 util.widgets.insertAfter = function(parent_node,new_node,sibling_node) {
206     sibling_node = sibling_node.nextSibling;
207     if (sibling_node) {
208         parent_node.insertBefore(new_node,sibling_node);
209     } else {
210         parent_node.appendChild(new_node);
211     }
212 }
213
214 util.widgets.apply_vertical_tab_on_enter_handler = function(node,onfailure,no_enter_func) {
215     try {
216         node.addEventListener(
217             'keypress',
218             function(ev) {
219                 dump('keypress: ev.target.tagName = ' + ev.target.tagName 
220                     + ' ev.target.nodeName = ' + ev.target.nodeName 
221                     + ' ev.keyCode = ' + ev.keyCode 
222                     + ' ev.charCode = ' + ev.charCode + '\n');
223                 if (ev.keyCode == 13) {
224                     dump('trying vertical tab\n');
225                     if (util.widgets.vertical_tab(ev.target)) {
226                         ev.preventDefault(); ev.stopPropagation();
227                         return true;
228                     } else {
229                         dump('keypress: attempting onfailure\n');
230                         if (typeof onfailure == 'function') return onfailure(ev);
231                         return false;
232                     }
233                 } else {
234                     if (typeof no_enter_func == 'function') {
235                         if ([
236                                 35 /* end */,
237                                 36 /* home */,
238                                 37 /* left */,
239                                 38 /* up */,
240                                 39 /* right */,
241                                 40 /* down */,
242                                 9 /* tab */
243                             ].indexOf(ev.keyCode) == -1
244                         ) {
245                             // really the no_enter, no_arrow_key, no_tab, etc. func :)
246                             no_enter_func(ev);
247                         }
248                     }
249                 }
250             },
251             false
252         );
253     } catch(E) {
254         alert(E);
255     }
256 }
257
258 util.widgets.vertical_tab = function(node) {
259     try {
260         var rel_vert_pos = node.getAttribute('rel_vert_pos') || 0;
261         dump('vertical_tab -> node = ' + node.nodeName + ' rel_vert_pos = ' + rel_vert_pos + '\n');
262
263         var nl = document.getElementsByTagName( node.nodeName );
264
265         var found_self = false; var next_node; var max_rel_vert_pos = 0;
266         for (var i = 0; i < nl.length; i++) {
267
268             var candidate_node = nl[i];
269             var test_rel_vert_pos = candidate_node.getAttribute('rel_vert_pos') || 0;
270
271             if (found_self && !next_node && (test_rel_vert_pos == rel_vert_pos) && !candidate_node.disabled) {
272             
273                 next_node = candidate_node;
274
275             }
276             if (candidate_node == node) found_self = true;
277
278             if (test_rel_vert_pos > max_rel_vert_pos) max_rel_vert_pos = test_rel_vert_pos;
279         }
280
281         dump('intermediate: next_node = ' + next_node + ' max_rel_vert_pos = ' + max_rel_vert_pos + '\n');
282
283         if (!next_node) {
284
285             found_self = false;
286             for (var next_pos = rel_vert_pos; next_pos <= max_rel_vert_pos; next_pos++) {
287
288                 for (var i = 0; i < nl.length; i++) {
289                     var candidate_node = nl[i];
290                     var test_rel_vert_pos = candidate_node.getAttribute('rel_vert_pos') || 0;
291
292                     if (found_self && !next_node && (test_rel_vert_pos == next_pos) && !candidate_node.disabled ) {
293                         next_node = candidate_node;
294                     }
295
296                     if (candidate_node == node) found_self = true;
297                 }
298
299             }
300
301         }
302
303         if (next_node) {
304             dump('focusing\n');
305             next_node.focus();
306         }
307         return next_node;
308     } catch(E) {
309         alert(E);
310     }
311 }
312
313 util.widgets.stop_event = function(ev) {
314     ev.preventDefault();
315     return false;
316 }
317
318 util.widgets.set_text = function(n,t) {
319     n = util.widgets.get(n);
320     switch(n.nodeName) {
321         case 'button' :
322         case 'caption' :
323             n.setAttribute('label',t);
324         break;
325         case 'label' : 
326             n.setAttribute('value',t); 
327         break;
328         case 'description' : 
329         case 'H1': case 'H2': case 'H3': case 'H4': case 'SPAN': case 'P': case 'BLOCKQUOTE':
330             util.widgets.remove_children(n); 
331             n.appendChild( document.createTextNode(t) );
332         break;
333         case 'textbox' :
334             n.value = t; n.setAttribute('value',t);
335         break;
336         default:
337             alert("FIXME: util.widgets.set_text doesn't know how to handle " + n.nodeName);
338         break;
339     }
340 }
341
342 util.widgets.get_text = function(n) {
343     n = util.widgets.get(n);
344     switch(n.nodeName) {
345         case 'button' :
346         case 'caption' :
347             return n.getAttribute('label');
348         break;
349         case 'label' : 
350             return n.getAttribute('value'); 
351         break;
352         case 'description' : 
353         case 'H1': case 'H2': case 'H3': case 'H4': case 'SPAN': case 'P': case 'BLOCKQUOTE':
354             return n.textContent;
355         break;
356         case 'textbox' :
357             return n.value;
358         break;
359         default:
360             alert("FIXME: util.widgets.get_text doesn't know how to handle " + n.nodeName);
361             return null;
362         break;
363     }
364 }
365
366 util.widgets.save_attributes = function (file,ids_attrs) {
367     try {
368         var blob = {};
369         for (var element_id in ids_attrs) {
370             var attribute_list = ids_attrs[ element_id ];
371             if (! blob[ element_id ] ) blob[ element_id ] =  {};
372             var x = document.getElementById( element_id );
373             if (x) {
374                 for (var j = 0; j < attribute_list.length; j++) {
375                     blob[ element_id ][ attribute_list[j] ] = x.getAttribute( attribute_list[j] );
376                 }
377             } else {
378                 dump('Error in util.widgets.save_attributes('+file._file.path+','+js2JSON(ids_attrs)+'):\n');
379                 dump('\telement_id = ' + element_id + '\n');
380             }
381         }
382         netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
383         //FIXME - WHY DOES THIS NOT WORK?// JSAN.use('util.file'); var file = new util.file(filename);
384         file.set_object(blob); file.close();
385     } catch(E) {
386         alert('Error saving preferences: ' + E);
387     }
388 }
389
390 util.widgets.load_attributes = function (file) {        
391     try {
392         netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
393         //FIXME - WHY DOES THIS NOT WORK?// JSAN.use('util.file'); var file = new util.file(filename);
394         if (file._file.exists()) {
395             var blob = file.get_object(); file.close();
396             for (var element_id in blob) {
397                 for (var attribute in blob[ element_id ]) {
398                     var x = document.getElementById( element_id );
399                     if (x) {
400                         if (x.nodeName == 'menulist' && attribute == 'value') {
401                             var popup = x.firstChild;
402                             var children = popup.childNodes;
403                             for (var i = 0; i < children.length; i++) {
404                                 if (children[i].getAttribute('value') == blob[ element_id ][ attribute ]) {
405                                     dump('setting ' + x.nodeName + ' ' + element_id + ' @value to ' + blob[ element_id ][ attribute ] + '\n' );
406                                     x.setAttribute(attribute, blob[ element_id ][ attribute ]);
407                                 }
408                             }
409                         } else {
410                             dump('setting ' + x.nodeName + ' ' + element_id + ' @value to ' + blob[ element_id ][ attribute ] + '\n');
411                             x.setAttribute(attribute, blob[ element_id ][ attribute ]);
412                         }
413                     } else {
414                         dump('Error in util.widgets.load_attributes('+file._file.path+'):\n');
415                         dump('\telement_id = ' + element_id + '\n');
416                         dump('\tattribute = ' + attribute + '\n');
417                         dump('\tblob[id][attr] = ' + blob[element_id][attribute] + '\n');
418                     }
419                 }
420             }
421             return blob;
422         }
423         return {};
424     } catch(E) {
425         alert('Error loading preferences: ' + E);
426     }
427 }
428
429 util.widgets.addProperty = function(e,c) {
430         if(!e || !c) return;
431
432         var prop_class_string = e.getAttribute('properties');
433         var prop_class_array;
434
435         if(prop_class_string)
436                 prop_class_array = prop_class_string.split(/\s+/);
437
438         var string_ip = ""; /*strip out nulls*/
439         for (var prop_class in prop_class_array) {
440                 if (prop_class_array[prop_class] == c) { return; }
441                 if(prop_class_array[prop_class] !=null)
442                         string_ip += prop_class_array[prop_class] + " ";
443         }
444         string_ip += c;
445         e.setAttribute('properties',string_ip);
446 }
447
448 util.widgets.removeProperty = function(e, c) {
449         if(!e || !c) return;
450
451         var prop_class_string = '';
452
453         var prop_class_array = e.getAttribute('properties');
454         if( prop_class_array )
455                 prop_class_array = prop_class_array.split(/\s+/);
456
457         var first = 1;
458         for (var prop_class in prop_class_array) {
459                 if (prop_class_array[prop_class] != c) {
460                         if (first == 1) {
461                                 prop_class_string = prop_class_array[prop_class];
462                                 first = 0;
463                         } else {
464                                 prop_class_string = prop_class_string + ' ' +
465                                         prop_class_array[prop_class];
466                         }
467                 }
468         }
469         e.setAttribute('properties', prop_class_string);
470 }
471
472 util.widgets.find_descendants_by_name = function(top_node,name) {
473     top_node = util.widgets.get(top_node);
474     if (!top_node) { return []; }
475     return top_node.getElementsByAttribute('name',name);
476 }
477
478 dump('exiting util/widgets.js\n');