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