]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/chrome/content/util/widgets.js
fixed auto-focus bug for creating 1 volume
[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 ];
28 util.widgets.EXPORT_TAGS        = { ':all' : util.widgets.EXPORT_OK };
29
30 util.widgets.get = function(e) {
31         if (typeof e == 'object') {
32                 return e;
33         } else {
34                 return document.getElementById(e);
35         }
36 }
37
38 util.widgets.apply = function(e,attr,attr_value,f) {
39         var node = util.widgets.get(e);
40         var nl = node.getElementsByAttribute(attr,attr_value);
41         for (var i = 0; i < nl.length; i++) {
42                 f( nl[i] );
43         }
44 }
45
46 util.widgets.save_xml = function (filename,node) {
47         netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
48
49         JSAN.use('util.file'); var file = new util.file(filename);
50
51         node = util.widgets.get(node);
52         var xml = util.widgets.serialize_node(node);
53
54         file.write_content('truncate',xml);
55         file.close();
56 }
57
58 util.widgets.serialize_node = function(node) {
59         var serializer = new XMLSerializer();
60         var xml = serializer.serializeToString(node);
61         return xml;
62 }
63
64 util.widgets.xul_from_string = function(xml) {
65         var parser = new DOMParser(); 
66         var doc = parser.parseFromString(xml, "text/xml"); 
67         var node = doc.documentElement;
68         return node;
69 }
70
71 util.widgets.store_disable = function() {
72         for (var i = 0; i < arguments.length; i++) {
73                 var e = util.widgets.get( arguments[i] );
74                 e.setAttribute('_disabled',e.getAttribute('disabled'));
75         }
76 }
77
78 util.widgets.restore_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.disable = function() {
86         for (var i = 0; i < arguments.length; i++) {
87                 var e = util.widgets.get( arguments[i] );
88                 e.setAttribute('disabled',true);
89         }
90 }
91
92 util.widgets.click = function(e) {
93         var evt = document.createEvent("MouseEvent");
94         evt.initMouseEvent( "click", true, true, window, 0, 0, 0, 0, 0, false,false,false,false,0,null);
95         util.widgets.get(e).dispatchEvent(evt);
96 }
97
98 util.widgets.dispatch = function(ev,el) {
99         var evt = document.createEvent("Events");
100         //var evt = document.createEvent();
101         evt.initEvent( ev, true, true );
102         util.widgets.get(el).dispatchEvent(evt);
103 }
104
105 util.widgets.make_menulist = function( items, dvalue ) {
106         var menulist = document.createElement('menulist');
107         var menupopup = document.createElement('menupopup'); menulist.appendChild(menupopup);
108         for (var i = 0; i < items.length; i++) {
109                 var label = items[i][0]; var value = items[i][1]; var disabled = items[i][2]; var indent = items[i][3];
110                 if (indent) {
111                         for (var j = 0; j < Number(indent); j++) {
112                                 //label = ' ' + label;
113                         }
114                 }
115                 var menuitem = document.createElement('menuitem'); menupopup.appendChild(menuitem);
116                 menuitem.setAttribute('label',label);
117                 menuitem.setAttribute('value',value);
118                 menuitem.setAttribute('style','font-family: monospace; padding-left: ' + indent + 'em;');
119                 if ( (disabled == true) || (disabled == "true") ) {
120                         menuitem.disabled = true;
121                         menuitem.setAttribute('disabled','true');
122                 }
123         }
124         menulist.setAttribute('value',dvalue);
125         return menulist;
126 }
127
128 util.widgets.make_grid = function( cols ) {
129         var grid = document.createElement('grid');
130         var columns = document.createElement('columns'); grid.appendChild(columns);
131         for (var i = 0; i < cols.length; i++) {
132                 var column = document.createElement('column'); columns.appendChild(column);
133                 for (var j in cols[i]) {
134                         column.setAttribute(j,cols[i][j]);
135                 }
136         }
137         var rows = document.createElement('rows'); grid.appendChild(rows);
138         return grid;
139 }
140
141 util.widgets.get_list_from_tree_selection = function(tree_w) {
142         var hitlist;
143         var tree = util.widgets.get(tree_w);
144         var list = [];
145         var start = new Object();
146         var end = new Object();
147         var numRanges = tree.view.selection.getRangeCount();
148         for (var t=0; t<numRanges; t++){
149                 tree.view.selection.getRangeAt(t,start,end);
150                 for (var v=start.value; v<=end.value; v++){
151                         var i = tree.contentView.getItemAtIndex(v);
152                         list.push( i );
153                 }
154         }
155         return list;
156 }
157
158 util.widgets.remove_children = function() {
159         for (var i = 0; i < arguments.length; i++) {
160                 var e = util.widgets.get( arguments[i] );
161                 while(e.lastChild) e.removeChild( e.lastChild );
162         }
163 }
164
165 util.widgets.disable_accesskeys_in_node_and_children = function( node ) {
166         if (node.getAttribute('accesskey')) {
167                 node.setAttribute('oldaccesskey', node.getAttribute('accesskey'));
168                 node.setAttribute('accesskey',''); node.accessKey = '';
169         }
170         for (var i = 0; i < node.childNodes.length; i++) {
171                 util.widgets.disable_accesskeys_in_node_and_children( node.childNodes[i] );
172         }
173         dump('- node = <' + node.id + '> accesskey = <' + node.accessKey + '> accesskey = <' + node.getAttribute('accesskey') + '> oldaccesskey = <' + node.getAttribute('oldaccesskey') + '>\n');
174 }
175
176 util.widgets.enable_accesskeys_in_node_and_children = function( node ) {
177         if (node.getAttribute('oldaccesskey')) {
178                 node.setAttribute('accesskey', node.getAttribute('oldaccesskey'));
179                 node.accessKey = node.getAttribute('oldaccesskey'); 
180                 node.setAttribute('oldaccesskey','');
181         }
182         for (var i = 0; i < node.childNodes.length; i++) {
183                 util.widgets.enable_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.insertAfter = function(parent_node,new_node,sibling_node) {
189         sibling_node = sibling_node.nextSibling;
190         if (sibling_node) {
191                 parent_node.insertBefore(new_node,sibling_node);
192         } else {
193                 parent_node.appendChild(new_node);
194         }
195 }
196
197 util.widgets.apply_vertical_tab_on_enter_handler = function(node,onfailure) {
198         try {
199                 node.addEventListener(
200                         'keypress',
201                         function(ev) {
202                                 dump('keypress: ev.target.tagName = ' + ev.target.tagName 
203                                         + ' ev.target.nodeName = ' + ev.target.nodeName 
204                                         + ' ev.keyCode = ' + ev.keyCode 
205                                         + ' ev.charCode = ' + ev.charCode + '\n');
206                                 if (ev.keyCode == 13) {
207                                         dump('trying vertical tab\n');
208                                         if (util.widgets.vertical_tab(ev.target)) {
209                                                 ev.preventDefault(); ev.stopPropagation();
210                                                 return true;
211                                         } else {
212                                                 if (typeof onfailure == 'function') return onfailure(ev);
213                                                 return false;
214                                         }
215                                 }
216                         },
217                         false
218                 );
219         } catch(E) {
220                 alert(E);
221         }
222 }
223
224 util.widgets.vertical_tab = function(node) {
225         try {
226                 var rel_vert_pos = node.getAttribute('rel_vert_pos') || 0;
227                 dump('vertical_tab -> node = ' + node.nodeName + ' rel_vert_pos = ' + rel_vert_pos + '\n');
228
229                 var nl = document.getElementsByTagName( node.nodeName );
230
231                 var found_self = false; var next_node; var max_rel_vert_pos = 0;
232                 for (var i = 0; i < nl.length; i++) {
233
234                         var candidate_node = nl[i];
235                         var test_rel_vert_pos = candidate_node.getAttribute('rel_vert_pos') || 0;
236
237                         if (found_self && !next_node && (test_rel_vert_pos == rel_vert_pos) && !candidate_node.disabled) {
238                         
239                                 next_node = candidate_node;
240
241                         }
242                         if (candidate_node == node) found_self = true;
243
244                         if (test_rel_vert_pos > max_rel_vert_pos) max_rel_vert_pos = test_rel_vert_pos;
245                 }
246
247                 dump('intermediate: next_node = ' + next_node + ' max_rel_vert_pos = ' + max_rel_vert_pos + '\n');
248
249                 if (!next_node) {
250
251                         found_self = false;
252                         for (var next_pos = rel_vert_pos; next_pos <= max_rel_vert_pos; next_pos++) {
253
254                                 for (var i = 0; i < nl.length; i++) {
255                                         var candidate_node = nl[i];
256                                         var test_rel_vert_pos = candidate_node.getAttribute('rel_vert_pos') || 0;
257
258                                         if (found_self && !next_node && (test_rel_vert_pos == next_pos) && !candidate_node.disabled ) {
259                                                 next_node = candidate_node;
260                                         }
261
262                                         if (candidate_node == node) found_self = true;
263                                 }
264
265                         }
266
267                 }
268
269                 if (next_node) {
270                         dump('focusing\n');
271                         next_node.focus();
272                 }
273                 return next_node;
274         } catch(E) {
275                 alert(E);
276         }
277 }
278
279 util.widgets.stop_event = function(ev) {
280         ev.preventDefault();
281         return false;
282 }
283
284 dump('exiting util/widgets.js\n');