]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/chrome/content/util/widgets.js
indent and disable some menu options
[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         'store_disable',
9         'restore_disable',
10         'disable',
11         'get_list_from_tree_selection',
12         'disable_accesskeys_in_node_and_children', 
13         'enable_accesskeys_in_node_and_children', 
14         'remove_children',
15         'make_grid',
16         'make_menulist',
17         'insertAfter',
18         'apply_vertical_tab_on_enter_handler',
19         'vertical_tab',
20         'click',
21         'dispatch',
22 ];
23 util.widgets.EXPORT_TAGS        = { ':all' : util.widgets.EXPORT_OK };
24
25 util.widgets.get = function(e) {
26         if (typeof e == 'object') {
27                 return e;
28         } else {
29                 return document.getElementById(e);
30         }
31 }
32
33 util.widgets.store_disable = function() {
34         for (var i = 0; i < arguments.length; i++) {
35                 var e = util.widgets.get( arguments[i] );
36                 e.setAttribute('_disabled',e.getAttribute('disabled'));
37         }
38 }
39
40 util.widgets.restore_disable = function() {
41         for (var i = 0; i < arguments.length; i++) {
42                 var e = util.widgets.get( arguments[i] );
43                 e.setAttribute('disabled',e.getAttribute('_disabled'));
44         }
45 }
46
47 util.widgets.disable = function() {
48         for (var i = 0; i < arguments.length; i++) {
49                 var e = util.widgets.get( arguments[i] );
50                 e.setAttribute('disabled',true);
51         }
52 }
53
54 util.widgets.click = function(e) {
55         var evt = document.createEvent("MouseEvent");
56         evt.initMouseEvent( "click", true, true, window, 0, 0, 0, 0, 0, false,false,false,false,0,null);
57         util.widgets.get(e).dispatchEvent(evt);
58 }
59
60 util.widgets.dispatch = function(ev,el) {
61         var evt = document.createEvent("Events");
62         //var evt = document.createEvent();
63         evt.initEvent( ev, true, true );
64         util.widgets.get(el).dispatchEvent(evt);
65 }
66
67 util.widgets.make_menulist = function( items, dvalue ) {
68         var menulist = document.createElement('menulist');
69         var menupopup = document.createElement('menupopup'); menulist.appendChild(menupopup);
70         for (var i = 0; i < items.length; i++) {
71                 var label = items[i][0]; var value = items[i][1]; var disabled = items[i][2]; var indent = items[i][3];
72                 if (indent) {
73                         for (var j = 0; j < Number(indent); j++) {
74                                 label = ' ' + label;
75                         }
76                 }
77                 var menuitem = document.createElement('menuitem'); menupopup.appendChild(menuitem);
78                 menuitem.setAttribute('label',label);
79                 menuitem.setAttribute('value',value);
80                 if (disabled) {
81                         menuitem.disabled = true;
82                         menuitem.setAttribute('disabled','true');
83                 }
84         }
85         menulist.setAttribute('value',dvalue);
86         return menulist;
87 }
88
89 util.widgets.make_grid = function( cols ) {
90         var grid = document.createElement('grid');
91         var columns = document.createElement('columns'); grid.appendChild(columns);
92         for (var i = 0; i < cols.length; i++) {
93                 var column = document.createElement('column'); columns.appendChild(column);
94                 for (var j in cols[i]) {
95                         column.setAttribute(j,cols[i][j]);
96                 }
97         }
98         var rows = document.createElement('rows'); grid.appendChild(rows);
99         return grid;
100 }
101
102 util.widgets.get_list_from_tree_selection = function(tree_w) {
103         var hitlist;
104         var tree = util.widgets.get(tree_w);
105         var list = [];
106         var start = new Object();
107         var end = new Object();
108         var numRanges = tree.view.selection.getRangeCount();
109         for (var t=0; t<numRanges; t++){
110                 tree.view.selection.getRangeAt(t,start,end);
111                 for (var v=start.value; v<=end.value; v++){
112                         var i = tree.contentView.getItemAtIndex(v);
113                         list.push( i );
114                 }
115         }
116         return list;
117 }
118
119 util.widgets.remove_children = function() {
120         for (var i = 0; i < arguments.length; i++) {
121                 var e = util.widgets.get( arguments[i] );
122                 while(e.lastChild) e.removeChild( e.lastChild );
123         }
124 }
125
126 util.widgets.disable_accesskeys_in_node_and_children = function( node ) {
127         if (node.getAttribute('accesskey')) {
128                 node.setAttribute('oldaccesskey', node.getAttribute('accesskey'));
129                 node.setAttribute('accesskey',''); node.accessKey = '';
130         }
131         for (var i = 0; i < node.childNodes.length; i++) {
132                 util.widgets.disable_accesskeys_in_node_and_children( node.childNodes[i] );
133         }
134         dump('- node = <' + node.id + '> accesskey = <' + node.accessKey + '> accesskey = <' + node.getAttribute('accesskey') + '> oldaccesskey = <' + node.getAttribute('oldaccesskey') + '>\n');
135 }
136
137 util.widgets.enable_accesskeys_in_node_and_children = function( node ) {
138         if (node.getAttribute('oldaccesskey')) {
139                 node.setAttribute('accesskey', node.getAttribute('oldaccesskey'));
140                 node.accessKey = node.getAttribute('oldaccesskey'); 
141                 node.setAttribute('oldaccesskey','');
142         }
143         for (var i = 0; i < node.childNodes.length; i++) {
144                 util.widgets.enable_accesskeys_in_node_and_children( node.childNodes[i] );
145         }
146         dump('+ node = <' + node.id + '> accesskey = <' + node.accessKey + '> accesskey = <' + node.getAttribute('accesskey') + '> oldaccesskey = <' + node.getAttribute('oldaccesskey') + '>\n');
147 }
148
149 util.widgets.insertAfter = function(parent_node,new_node,sibling_node) {
150         sibling_node = sibling_node.nextSibling;
151         if (sibling_node) {
152                 parent_node.insertBefore(new_node,sibling_node);
153         } else {
154                 parent_node.appendChild(new_node);
155         }
156 }
157
158 util.widgets.apply_vertical_tab_on_enter_handler = function(node,onfailure) {
159         try {
160                 node.addEventListener(
161                         'keypress',
162                         function(ev) {
163                                 dump('keypress: ev.target.tagName = ' + ev.target.tagName 
164                                         + ' ev.target.nodeName = ' + ev.target.nodeName 
165                                         + ' ev.keyCode = ' + ev.keyCode 
166                                         + ' ev.charCode = ' + ev.charCode + '\n');
167                                 if (ev.keyCode == 13) {
168                                         dump('trying vertical tab\n');
169                                         if (util.widgets.vertical_tab(ev.target)) {
170                                                 ev.preventDefault(); ev.stopPropagation();
171                                                 return true;
172                                         } else {
173                                                 if (typeof onfailure == 'function') onfailure(ev);
174                                                 return util.widgets.vertical_tab(ev.target);
175                                         }
176                                 }
177                         },
178                         false
179                 );
180         } catch(E) {
181                 alert(E);
182         }
183 }
184
185 util.widgets.vertical_tab = function(node) {
186         try {
187                 var rel_vert_pos = node.getAttribute('rel_vert_pos') || 0;
188                 dump('vertical_tab -> node = ' + node.nodeName + ' rel_vert_pos = ' + rel_vert_pos + '\n');
189
190                 var nl = document.getElementsByTagName( node.nodeName );
191
192                 var found_self = false; var next_node; var max_rel_vert_pos = 0;
193                 for (var i = 0; i < nl.length; i++) {
194
195                         var candidate_node = nl[i];
196                         var test_rel_vert_pos = candidate_node.getAttribute('rel_vert_pos') || 0;
197
198                         if (found_self && !next_node && (test_rel_vert_pos == rel_vert_pos) && !candidate_node.disabled) {
199                         
200                                 next_node = candidate_node;
201
202                         }
203                         if (candidate_node == node) found_self = true;
204
205                         if (test_rel_vert_pos > max_rel_vert_pos) max_rel_vert_pos = test_rel_vert_pos;
206                 }
207
208                 dump('intermediate: next_node = ' + next_node + ' max_rel_vert_pos = ' + max_rel_vert_pos + '\n');
209
210                 if (!next_node) {
211
212                         found_self = false;
213                         for (var next_pos = rel_vert_pos; next_pos <= max_rel_vert_pos; next_pos++) {
214
215                                 for (var i = 0; i < nl.length; i++) {
216                                         var candidate_node = nl[i];
217                                         var test_rel_vert_pos = candidate_node.getAttribute('rel_vert_pos') || 0;
218
219                                         if (found_self && !next_node && (test_rel_vert_pos == next_pos) && !candidate_node.disabled ) {
220                                                 next_node = candidate_node;
221                                         }
222
223                                         if (candidate_node == node) found_self = true;
224                                 }
225
226                         }
227
228                 }
229
230                 if (next_node) {
231                         dump('focusing\n');
232                         next_node.focus();
233                 }
234                 return next_node;
235         } catch(E) {
236                 alert(E);
237         }
238 }
239
240
241 dump('exiting util/widgets.js\n');