29cf4f29f04e93841ee00d13160921bcc1c525f2
[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 ];
31 util.widgets.EXPORT_TAGS        = { ':all' : util.widgets.EXPORT_OK };
32
33 util.widgets.get = function(e) {
34         if (typeof e == 'object') {
35                 return e;
36         } else {
37                 return document.getElementById(e);
38         }
39 }
40
41 util.widgets.apply = function(e,attr,attr_value,f) {
42         var node = util.widgets.get(e);
43         var nl = node.getElementsByAttribute(attr,attr_value);
44         for (var i = 0; i < nl.length; i++) {
45                 f( nl[i] );
46         }
47 }
48
49 util.widgets.save_xml = function (filename,node) {
50         try { 
51                 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
52
53                 JSAN.use('util.file'); var file = new util.file(filename);
54
55                 node = util.widgets.get(node);
56                 var xml = util.widgets.serialize_node(node);
57
58                 file.write_content('truncate',xml);
59                 file.close();
60         } catch(E) {
61                 alert('Error in util.widgets.save_xml: ' + E);
62         }
63 }
64
65 util.widgets.serialize_node = function(node) {
66         var serializer = new XMLSerializer();
67         var xml = serializer.serializeToString(node);
68         return xml;
69 }
70
71 util.widgets.xul_from_string = function(xml) {
72         var parser = new DOMParser(); 
73         var doc = parser.parseFromString(xml, "text/xml"); 
74         var node = doc.documentElement;
75         return node;
76 }
77
78 util.widgets.store_disable = function() {
79         for (var i = 0; i < arguments.length; i++) {
80                 var e = util.widgets.get( arguments[i] );
81                 e.setAttribute('_disabled',e.getAttribute('disabled'));
82         }
83 }
84
85 util.widgets.restore_disable = function() {
86         for (var i = 0; i < arguments.length; i++) {
87                 var e = util.widgets.get( arguments[i] );
88                 e.setAttribute('disabled',e.getAttribute('_disabled'));
89         }
90 }
91
92 util.widgets.disable = function() {
93         for (var i = 0; i < arguments.length; i++) {
94                 var e = util.widgets.get( arguments[i] );
95                 e.setAttribute('disabled',true);
96         }
97 }
98
99 util.widgets.click = function(e) {
100         var evt = document.createEvent("MouseEvent");
101         evt.initMouseEvent( "click", true, true, window, 0, 0, 0, 0, 0, false,false,false,false,0,null);
102         util.widgets.get(e).dispatchEvent(evt);
103 }
104
105 util.widgets.dispatch = function(ev,el) {
106         var evt = document.createEvent("Events");
107         //var evt = document.createEvent();
108         evt.initEvent( ev, true, true );
109         util.widgets.get(el).dispatchEvent(evt);
110 }
111
112 util.widgets.make_menulist = function( items, dvalue ) {
113         var menulist = document.createElement('menulist');
114         var menupopup = document.createElement('menupopup'); menulist.appendChild(menupopup);
115         for (var i = 0; i < items.length; i++) {
116                 var label = items[i][0]; var value = items[i][1]; var disabled = items[i][2]; var indent = items[i][3];
117                 if (indent) {
118                         for (var j = 0; j < Number(indent); j++) {
119                                 //label = ' ' + label;
120                         }
121                 }
122                 var menuitem = document.createElement('menuitem'); menupopup.appendChild(menuitem);
123                 menuitem.setAttribute('label',label);
124                 menuitem.setAttribute('value',value);
125                 if (indent) {
126                         menuitem.setAttribute('style','font-family: monospace; padding-left: ' + indent + 'em;');
127                 } else {
128                         menuitem.setAttribute('style','font-family: monospace;');
129                 }
130                 if ( (disabled == true) || (disabled == "true") ) {
131                         menuitem.disabled = true;
132                         menuitem.setAttribute('disabled','true');
133                 }
134         }
135         menulist.setAttribute('value',dvalue);
136         return menulist;
137 }
138
139 util.widgets.make_grid = function( cols ) {
140         var grid = document.createElement('grid');
141         var columns = document.createElement('columns'); grid.appendChild(columns);
142         for (var i = 0; i < cols.length; i++) {
143                 var column = document.createElement('column'); columns.appendChild(column);
144                 for (var j in cols[i]) {
145                         column.setAttribute(j,cols[i][j]);
146                 }
147         }
148         var rows = document.createElement('rows'); grid.appendChild(rows);
149         return grid;
150 }
151
152 util.widgets.get_list_from_tree_selection = function(tree_w) {
153         var hitlist;
154         var tree = util.widgets.get(tree_w);
155         var list = [];
156         var start = new Object();
157         var end = new Object();
158         var numRanges = tree.view.selection.getRangeCount();
159         for (var t=0; t<numRanges; t++){
160                 tree.view.selection.getRangeAt(t,start,end);
161                 for (var v=start.value; v<=end.value; v++){
162                         var i = tree.contentView.getItemAtIndex(v);
163                         list.push( i );
164                 }
165         }
166         return list;
167 }
168
169 util.widgets.remove_children = function() {
170         for (var i = 0; i < arguments.length; i++) {
171                 var e = util.widgets.get( arguments[i] );
172                 while(e.lastChild) e.removeChild( e.lastChild );
173         }
174 }
175
176 util.widgets.disable_accesskeys_in_node_and_children = function( node ) {
177         return; /* what was I doing here? */
178         if (node.getAttribute('accesskey')) {
179                 node.setAttribute('oldaccesskey', node.getAttribute('accesskey'));
180                 node.setAttribute('accesskey',''); node.accessKey = '';
181         }
182         for (var i = 0; i < node.childNodes.length; i++) {
183                 util.widgets.disable_accesskeys_in_node_and_children( node.childNodes[i] );
184         }
185         dump('- node = <' + node.id + '> accesskey = <' + node.accessKey + '> accesskey = <' + node.getAttribute('accesskey') + '> oldaccesskey = <' + node.getAttribute('oldaccesskey') + '>\n');
186 }
187
188 util.widgets.enable_accesskeys_in_node_and_children = function( node ) {
189         return; /* what was I doing here? */
190         if (node.getAttribute('oldaccesskey')) {
191                 node.setAttribute('accesskey', node.getAttribute('oldaccesskey'));
192                 node.accessKey = node.getAttribute('oldaccesskey'); 
193                 node.setAttribute('oldaccesskey','');
194         }
195         for (var i = 0; i < node.childNodes.length; i++) {
196                 util.widgets.enable_accesskeys_in_node_and_children( node.childNodes[i] );
197         }
198         dump('+ node = <' + node.id + '> accesskey = <' + node.accessKey + '> accesskey = <' + node.getAttribute('accesskey') + '> oldaccesskey = <' + node.getAttribute('oldaccesskey') + '>\n');
199 }
200
201 util.widgets.insertAfter = function(parent_node,new_node,sibling_node) {
202         sibling_node = sibling_node.nextSibling;
203         if (sibling_node) {
204                 parent_node.insertBefore(new_node,sibling_node);
205         } else {
206                 parent_node.appendChild(new_node);
207         }
208 }
209
210 util.widgets.apply_vertical_tab_on_enter_handler = function(node,onfailure) {
211         try {
212                 node.addEventListener(
213                         'keypress',
214                         function(ev) {
215                                 dump('keypress: ev.target.tagName = ' + ev.target.tagName 
216                                         + ' ev.target.nodeName = ' + ev.target.nodeName 
217                                         + ' ev.keyCode = ' + ev.keyCode 
218                                         + ' ev.charCode = ' + ev.charCode + '\n');
219                                 if (ev.keyCode == 13) {
220                                         dump('trying vertical tab\n');
221                                         if (util.widgets.vertical_tab(ev.target)) {
222                                                 ev.preventDefault(); ev.stopPropagation();
223                                                 return true;
224                                         } else {
225                                                 if (typeof onfailure == 'function') return onfailure(ev);
226                                                 return false;
227                                         }
228                                 }
229                         },
230                         false
231                 );
232         } catch(E) {
233                 alert(E);
234         }
235 }
236
237 util.widgets.vertical_tab = function(node) {
238         try {
239                 var rel_vert_pos = node.getAttribute('rel_vert_pos') || 0;
240                 dump('vertical_tab -> node = ' + node.nodeName + ' rel_vert_pos = ' + rel_vert_pos + '\n');
241
242                 var nl = document.getElementsByTagName( node.nodeName );
243
244                 var found_self = false; var next_node; var max_rel_vert_pos = 0;
245                 for (var i = 0; i < nl.length; i++) {
246
247                         var candidate_node = nl[i];
248                         var test_rel_vert_pos = candidate_node.getAttribute('rel_vert_pos') || 0;
249
250                         if (found_self && !next_node && (test_rel_vert_pos == rel_vert_pos) && !candidate_node.disabled) {
251                         
252                                 next_node = candidate_node;
253
254                         }
255                         if (candidate_node == node) found_self = true;
256
257                         if (test_rel_vert_pos > max_rel_vert_pos) max_rel_vert_pos = test_rel_vert_pos;
258                 }
259
260                 dump('intermediate: next_node = ' + next_node + ' max_rel_vert_pos = ' + max_rel_vert_pos + '\n');
261
262                 if (!next_node) {
263
264                         found_self = false;
265                         for (var next_pos = rel_vert_pos; next_pos <= max_rel_vert_pos; next_pos++) {
266
267                                 for (var i = 0; i < nl.length; i++) {
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 == next_pos) && !candidate_node.disabled ) {
272                                                 next_node = candidate_node;
273                                         }
274
275                                         if (candidate_node == node) found_self = true;
276                                 }
277
278                         }
279
280                 }
281
282                 if (next_node) {
283                         dump('focusing\n');
284                         next_node.focus();
285                 }
286                 return next_node;
287         } catch(E) {
288                 alert(E);
289         }
290 }
291
292 util.widgets.stop_event = function(ev) {
293         ev.preventDefault();
294         return false;
295 }
296
297 util.widgets.set_text = function(n,t) {
298         n = util.widgets.get(n);
299         switch(n.nodeName) {
300                 case 'button' :
301                 case 'caption' :
302                         n.setAttribute('label',t);
303                 break;
304                 case 'label' : 
305                         n.setAttribute('value',t); 
306                 break;
307                 case 'description' : 
308                 case 'H1': case 'H2': case 'H3': case 'H4': case 'SPAN': case 'P': case 'BLOCKQUOTE':
309                         util.widgets.remove_children(n); 
310                         n.appendChild( document.createTextNode(t) );
311                 break;
312                 case 'textbox' :
313                         n.value = t; n.setAttribute('value',t);
314                 break;
315                 default:
316                         alert("FIXME: util.widgets.set_text doesn't know how to handle " + n.nodeName);
317                 break;
318         }
319 }
320
321 util.widgets.save_attributes = function (file,ids_attrs) {
322         try {
323                 var blob = {};
324                 for (var element_id in ids_attrs) {
325                         var attribute_list = ids_attrs[ element_id ];
326                         if (! blob[ element_id ] ) blob[ element_id ] =  {};
327             var x = document.getElementById( element_id );
328             if (x) {
329                 for (var j = 0; j < attribute_list.length; j++) {
330                     blob[ element_id ][ attribute_list[j] ] = x.getAttribute( attribute_list[j] );
331                 }
332             } else {
333                 dump('Error in util.widgets.save_attributes('+file._file.path+','+js2JSON(ids_attrs)+'):\n');
334                 dump('\telement_id = ' + element_id + '\n');
335             }
336                 }
337                 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
338                 //FIXME - WHY DOES THIS NOT WORK?// JSAN.use('util.file'); var file = new util.file(filename);
339                 file.set_object(blob); file.close();
340         } catch(E) {
341                 alert('Error saving preferences: ' + E);
342         }
343 }
344
345 util.widgets.load_attributes = function (file) {                
346         try {
347                 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
348                 //FIXME - WHY DOES THIS NOT WORK?// JSAN.use('util.file'); var file = new util.file(filename);
349                 if (file._file.exists()) {
350                         var blob = file.get_object(); file.close();
351                         for (var element_id in blob) {
352                                 for (var attribute in blob[ element_id ]) {
353                                         var x = document.getElementById( element_id );
354                     if (x) {
355                         x.setAttribute(attribute, blob[ element_id ][ attribute ]);
356                     } else {
357                         dump('Error in util.widgets.load_attributes('+file._file.path+'):\n');
358                         dump('\telement_id = ' + element_id + '\n');
359                         dump('\tattribute = ' + attribute + '\n');
360                         dump('\tblob[id][attr] = ' + blob[element_id][attribute] + '\n');
361                     }
362                                 }
363                         }
364             return blob;
365                 }
366         return {};
367         } catch(E) {
368                 alert('Error loading preferences: ' + E);
369         }
370 }
371
372 dump('exiting util/widgets.js\n');