1 dump('entering util/widgets.js\n');
3 if (typeof util == 'undefined') var util = {};
6 util.widgets.EXPORT_OK = [
15 'get_list_from_tree_selection',
16 'disable_accesskeys_in_node_and_children',
17 'enable_accesskeys_in_node_and_children',
22 'apply_vertical_tab_on_enter_handler',
30 'find_descendants_by_name',
31 'render_perm_org_menu'
33 util.widgets.EXPORT_TAGS = { ':all' : util.widgets.EXPORT_OK };
35 util.widgets.get = function(e) {
36 if (typeof e == 'object') {
39 return document.getElementById(e);
43 util.widgets.apply = function(e,attr,attr_value,f) {
44 var node = util.widgets.get(e);
45 var nl = node.getElementsByAttribute(attr,attr_value);
46 for (var i = 0; i < nl.length; i++) {
51 util.widgets.save_xml = function (filename,node) {
53 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
55 JSAN.use('util.file'); var file = new util.file(filename);
57 node = util.widgets.get(node);
58 var xml = util.widgets.serialize_node(node);
60 file.write_content('truncate',xml);
63 alert('Error in util.widgets.save_xml: ' + E);
67 util.widgets.serialize_node = function(node) {
68 var serializer = new XMLSerializer();
69 var xml = serializer.serializeToString(node);
73 util.widgets.xul_from_string = function(xml) {
74 var parser = new DOMParser();
75 var doc = parser.parseFromString(xml, "text/xml");
76 var node = doc.documentElement;
80 util.widgets.store_disable = function() {
81 for (var i = 0; i < arguments.length; i++) {
82 var e = util.widgets.get( arguments[i] );
83 e.setAttribute('_disabled',e.getAttribute('disabled'));
87 util.widgets.restore_disable = function() {
88 for (var i = 0; i < arguments.length; i++) {
89 var e = util.widgets.get( arguments[i] );
90 e.setAttribute('disabled',e.getAttribute('_disabled'));
94 util.widgets.disable = function() {
95 for (var i = 0; i < arguments.length; i++) {
96 var e = util.widgets.get( arguments[i] );
97 e.setAttribute('disabled',true);
101 util.widgets.click = function(e) {
102 var evt = document.createEvent("MouseEvent");
103 evt.initMouseEvent( "click", true, true, window, 0, 0, 0, 0, 0, false,false,false,false,0,null);
104 util.widgets.get(e).dispatchEvent(evt);
107 util.widgets.dispatch = function(ev,el) {
108 var evt = document.createEvent("Events");
109 //var evt = document.createEvent();
110 evt.initEvent( ev, true, true );
111 util.widgets.get(el).dispatchEvent(evt);
114 util.widgets.make_menulist = function( items, dvalue ) {
115 var menulist = document.createElement('menulist');
116 var menupopup = document.createElement('menupopup'); menulist.appendChild(menupopup);
117 for (var i = 0; i < items.length; i++) {
118 if (typeof items[i] == 'undefined') { continue; }
119 var label = items[i][0]; var value = items[i][1]; var disabled = items[i][2]; var indent = items[i][3];
121 for (var j = 0; j < Number(indent); j++) {
122 //label = ' ' + label;
125 var menuitem = document.createElement('menuitem'); menupopup.appendChild(menuitem);
126 menuitem.setAttribute('label',label);
127 menuitem.setAttribute('value',value);
129 menuitem.setAttribute('style','font-family: monospace; padding-left: ' + indent + 'em;');
131 menuitem.setAttribute('style','font-family: monospace;');
133 if ( (disabled == true) || (disabled == "true") ) {
134 menuitem.disabled = true;
135 menuitem.setAttribute('disabled','true');
138 if (typeof dvalue != 'undefined') {
139 menulist.setAttribute('value',dvalue);
144 util.widgets.make_grid = function( cols ) {
145 var grid = document.createElement('grid');
146 var columns = document.createElement('columns'); grid.appendChild(columns);
147 for (var i = 0; i < cols.length; i++) {
148 var column = document.createElement('column'); columns.appendChild(column);
149 for (var j in cols[i]) {
150 column.setAttribute(j,cols[i][j]);
153 var rows = document.createElement('rows'); grid.appendChild(rows);
157 util.widgets.get_list_from_tree_selection = function(tree_w) {
159 var tree = util.widgets.get(tree_w);
161 var start = new Object();
162 var end = new Object();
163 var numRanges = tree.view.selection.getRangeCount();
164 for (var t=0; t<numRanges; t++){
165 tree.view.selection.getRangeAt(t,start,end);
166 for (var v=start.value; v<=end.value; v++){
167 var i = tree.contentView.getItemAtIndex(v);
174 util.widgets.remove_children = function() {
175 for (var i = 0; i < arguments.length; i++) {
176 var e = util.widgets.get( arguments[i] );
177 while(e.lastChild) e.removeChild( e.lastChild );
181 util.widgets.disable_accesskeys_in_node_and_children = function( node ) {
182 return; /* what was I doing here? */
183 if (node.getAttribute('accesskey')) {
184 node.setAttribute('oldaccesskey', node.getAttribute('accesskey'));
185 node.setAttribute('accesskey',''); node.accessKey = '';
187 for (var i = 0; i < node.childNodes.length; i++) {
188 util.widgets.disable_accesskeys_in_node_and_children( node.childNodes[i] );
190 dump('- node = <' + node.id + '> accesskey = <' + node.accessKey + '> accesskey = <' + node.getAttribute('accesskey') + '> oldaccesskey = <' + node.getAttribute('oldaccesskey') + '>\n');
193 util.widgets.enable_accesskeys_in_node_and_children = function( node ) {
194 return; /* what was I doing here? */
195 if (node.getAttribute('oldaccesskey')) {
196 node.setAttribute('accesskey', node.getAttribute('oldaccesskey'));
197 node.accessKey = node.getAttribute('oldaccesskey');
198 node.setAttribute('oldaccesskey','');
200 for (var i = 0; i < node.childNodes.length; i++) {
201 util.widgets.enable_accesskeys_in_node_and_children( node.childNodes[i] );
203 dump('+ node = <' + node.id + '> accesskey = <' + node.accessKey + '> accesskey = <' + node.getAttribute('accesskey') + '> oldaccesskey = <' + node.getAttribute('oldaccesskey') + '>\n');
206 util.widgets.insertAfter = function(parent_node,new_node,sibling_node) {
207 sibling_node = sibling_node.nextSibling;
209 parent_node.insertBefore(new_node,sibling_node);
211 parent_node.appendChild(new_node);
215 util.widgets.apply_vertical_tab_on_enter_handler = function(node,onfailure,no_enter_func) {
217 node.addEventListener(
220 dump('keypress: ev.target.tagName = ' + ev.target.tagName
221 + ' ev.target.nodeName = ' + ev.target.nodeName
222 + ' ev.keyCode = ' + ev.keyCode
223 + ' ev.charCode = ' + ev.charCode + '\n');
224 if (ev.keyCode == 13) {
225 dump('trying vertical tab\n');
226 if (util.widgets.vertical_tab(ev.target)) {
227 ev.preventDefault(); ev.stopPropagation();
230 dump('keypress: attempting onfailure\n');
231 if (typeof onfailure == 'function') return onfailure(ev);
235 if (typeof no_enter_func == 'function') {
244 ].indexOf(ev.keyCode) == -1
246 // really the no_enter, no_arrow_key, no_tab, etc. func :)
259 util.widgets.vertical_tab = function(node) {
261 var rel_vert_pos = node.getAttribute('rel_vert_pos') || 0;
262 dump('vertical_tab -> node = ' + node.nodeName + ' rel_vert_pos = ' + rel_vert_pos + '\n');
264 var nl = document.getElementsByTagName( node.nodeName );
266 var found_self = false; var next_node; var max_rel_vert_pos = 0;
267 for (var i = 0; i < nl.length; i++) {
269 var candidate_node = nl[i];
270 var test_rel_vert_pos = candidate_node.getAttribute('rel_vert_pos') || 0;
272 if (found_self && !next_node && (test_rel_vert_pos == rel_vert_pos) && !candidate_node.disabled) {
274 next_node = candidate_node;
277 if (candidate_node == node) found_self = true;
279 if (test_rel_vert_pos > max_rel_vert_pos) max_rel_vert_pos = test_rel_vert_pos;
282 dump('intermediate: next_node = ' + next_node + ' max_rel_vert_pos = ' + max_rel_vert_pos + '\n');
287 for (var next_pos = rel_vert_pos; next_pos <= max_rel_vert_pos; next_pos++) {
289 for (var i = 0; i < nl.length; i++) {
290 var candidate_node = nl[i];
291 var test_rel_vert_pos = candidate_node.getAttribute('rel_vert_pos') || 0;
293 if (found_self && !next_node && (test_rel_vert_pos == next_pos) && !candidate_node.disabled ) {
294 next_node = candidate_node;
297 if (candidate_node == node) found_self = true;
314 util.widgets.stop_event = function(ev) {
319 util.widgets.set_text = function(n,t) {
320 n = util.widgets.get(n);
324 n.setAttribute('label',t);
327 n.setAttribute('value',t);
330 case 'H1': case 'H2': case 'H3': case 'H4': case 'SPAN': case 'P': case 'BLOCKQUOTE':
331 util.widgets.remove_children(n);
332 n.appendChild( document.createTextNode(t) );
335 n.value = t; n.setAttribute('value',t);
338 alert("FIXME: util.widgets.set_text doesn't know how to handle " + n.nodeName);
343 util.widgets.get_text = function(n) {
344 n = util.widgets.get(n);
348 return n.getAttribute('label');
351 return n.getAttribute('value');
354 case 'H1': case 'H2': case 'H3': case 'H4': case 'SPAN': case 'P': case 'BLOCKQUOTE':
355 return n.textContent;
361 alert("FIXME: util.widgets.get_text doesn't know how to handle " + n.nodeName);
367 util.widgets.save_attributes = function (file,ids_attrs) {
370 for (var element_id in ids_attrs) {
371 var attribute_list = ids_attrs[ element_id ];
372 if (! blob[ element_id ] ) blob[ element_id ] = {};
373 var x = document.getElementById( element_id );
375 for (var j = 0; j < attribute_list.length; j++) {
376 blob[ element_id ][ attribute_list[j] ] = x.getAttribute( attribute_list[j] );
379 dump('Error in util.widgets.save_attributes('+file._file.path+','+js2JSON(ids_attrs)+'):\n');
380 dump('\telement_id = ' + element_id + '\n');
383 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
384 //FIXME - WHY DOES THIS NOT WORK?// JSAN.use('util.file'); var file = new util.file(filename);
385 file.set_object(blob); file.close();
387 alert('Error saving preferences: ' + E);
391 util.widgets.load_attributes = function (file) {
393 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
394 //FIXME - WHY DOES THIS NOT WORK?// JSAN.use('util.file'); var file = new util.file(filename);
395 if (file._file.exists()) {
396 var blob = file.get_object(); file.close();
397 for (var element_id in blob) {
398 for (var attribute in blob[ element_id ]) {
399 var x = document.getElementById( element_id );
401 if (x.nodeName == 'menulist' && attribute == 'value') {
402 var popup = x.firstChild;
403 var children = popup.childNodes;
404 for (var i = 0; i < children.length; i++) {
405 if (children[i].getAttribute('value') == blob[ element_id ][ attribute ]) {
406 dump('setting ' + x.nodeName + ' ' + element_id + ' @value to ' + blob[ element_id ][ attribute ] + '\n' );
407 x.setAttribute(attribute, blob[ element_id ][ attribute ]);
411 dump('setting ' + x.nodeName + ' ' + element_id + ' @value to ' + blob[ element_id ][ attribute ] + '\n');
412 x.setAttribute(attribute, blob[ element_id ][ attribute ]);
415 dump('Error in util.widgets.load_attributes('+file._file.path+'):\n');
416 dump('\telement_id = ' + element_id + '\n');
417 dump('\tattribute = ' + attribute + '\n');
418 dump('\tblob[id][attr] = ' + blob[element_id][attribute] + '\n');
426 alert('Error loading preferences: ' + E);
430 util.widgets.addProperty = function(e,c) {
433 var prop_class_string = e.getAttribute('properties');
434 var prop_class_array;
436 if(prop_class_string)
437 prop_class_array = prop_class_string.split(/\s+/);
439 var string_ip = ""; /*strip out nulls*/
440 for (var prop_class in prop_class_array) {
441 if (prop_class_array[prop_class] == c) { return; }
442 if(prop_class_array[prop_class] !=null)
443 string_ip += prop_class_array[prop_class] + " ";
446 e.setAttribute('properties',string_ip);
449 util.widgets.removeProperty = function(e, c) {
452 var prop_class_string = '';
454 var prop_class_array = e.getAttribute('properties');
455 if( prop_class_array )
456 prop_class_array = prop_class_array.split(/\s+/);
459 for (var prop_class in prop_class_array) {
460 if (prop_class_array[prop_class] != c) {
462 prop_class_string = prop_class_array[prop_class];
465 prop_class_string = prop_class_string + ' ' +
466 prop_class_array[prop_class];
470 e.setAttribute('properties', prop_class_string);
473 util.widgets.find_descendants_by_name = function(top_node,name) {
474 top_node = util.widgets.get(top_node);
475 if (!top_node) { return []; }
476 return top_node.getElementsByAttribute('name',name);
479 util.widgets.render_perm_org_menu = function (perm,org) {
481 JSAN.use('util.functional'); JSAN.use('util.fm_utils');
482 JSAN.use('OpenILS.data'); JSAN.use('util.network');
483 var data = new OpenILS.data(); data.stash_retrieve();
484 var network = new util.network();
486 var work_ous = network.simple_request(
487 'PERM_RETRIEVE_WORK_OU',
490 if (work_ous.length == 0) {
495 for (var i = 0; i < work_ous.length; i++ ) {
496 var perm_depth = data.hash.aout[ data.hash.aou[ work_ous[i] ].ou_type() ].depth();
498 var my_libs_tree = network.simple_request(
499 'FM_AOU_DESCENDANTS_RETRIEVE',
500 [ work_ous[i], perm_depth ]
502 if (!instanceOf(my_libs_tree,aou)) { /* FIXME - workaround for weird descendants call result */
503 my_libs_tree = my_libs_tree[0];
505 my_libs = my_libs.concat( util.fm_utils.flatten_ou_branch( my_libs_tree ) );
508 var default_lib = org || my_libs[0].id();
510 var ml = util.widgets.make_menulist(
511 util.functional.map_list(
515 obj.shortname() + ' : ' + obj.name(),
518 ( data.hash.aout[ obj.ou_type() ].depth() )
528 alert('Error in util.widgets.render_perm_org_menu(): ' + E);
531 dump('exiting util/widgets.js\n');