1 sdump('D_TRACE','Loading util.js\n');
16 function sdump(level,msg) {
18 if (sdump_levels[level])
24 mw.G.sound.play( xp_url_init('chrome://evergreen/content/media/redalert.wav') );
27 function snd_really_bad() {
28 mw.G.sound.play( xp_url_init('chrome://evergreen/content/media/die.wav') );
32 mw.G.sound.play( xp_url_init('chrome://evergreen/content/media/turn.wav') );
35 function snd_circ_good() {
36 mw.G.sound.play( xp_url_init('chrome://evergreen/content/media/clicked.wav') );
39 function snd_circ_bad() {
40 mw.G.sound.play( xp_url_init('chrome://evergreen/content/media/cow.wav') );
43 function snd_logon() {
47 function snd_logoff() {
55 function handle_error(E) {
57 if (instanceOf(E,ex)) {
59 //s += '\n\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n';
60 //s += 'This error was anticipated.\n\n';
61 //s += js2JSON(E).substr(0,200) + '...\n\n';
64 s += '\n\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n';
65 s += 'This is a bug that we will fix later.\n\n';
66 s += js2JSON(E).substr(0,200) + '\n\n';
72 function string_to_array(s) {
74 for (var i = 0; i < s.length; i++ ) {
75 my_array.push( s.charAt(i) );
80 function textbox_checkdigit(ev) {
81 if ( check_checkdigit( ev.target.value ) ) {
82 sdump('D_UTIL', 'success\n');
85 sdump('D_UTIL', 'failure\n');
92 function check_checkdigit(barcode) {
94 var stripped_barcode = barcode.slice(0,-1);
95 var checkdigit = barcode.slice(-1);
97 sdump('D_UTIL', '\n\n=-=***=-=\n\ncheck_checkdigit: barcode = ' + barcode + ' barcode stripped = ' + stripped_barcode + ' checkdigit = ' + checkdigit + '\n');
99 var sum = 0; var mul = 2;
101 var b_array = string_to_array( stripped_barcode ).reverse();
102 sdump('D_UTIL', '\tb_array = ' + b_array + '\n');
104 for (var i in b_array) {
105 var digit = parseInt( b_array[i] );
106 sdump('D_UTIL', '\t\tdigit = ' + digit + '\n');
108 var product = digit * mul;
109 if (mul == 2) { mul = 1; } else { mul = 2; }
111 var p_array = string_to_array( product.toString() );
112 sdump('D_UTIL', '\t\tp_array = ' + p_array + '\n');
114 for (var j in p_array) {
115 var n = parseInt( p_array[j] );
116 sdump('D_UTIL', '\t\t\tn = ' + n + '\n');
121 sdump('D_UTIL', '\tsum = ' + sum + '\n');
123 var s_array = string_to_array( sum.toString() );
124 var calculated_checkdigit = s_array.pop();
125 if (calculated_checkdigit > 0) calculated_checkdigit = 10 - calculated_checkdigit;
126 sdump('D_UTIL', '\tcalculated checkdigit = ' + calculated_checkdigit + '\n\n=-=***=-=\n\n');
128 return ( calculated_checkdigit == checkdigit );
131 function fake_tab_for_textboxes(w,current) {
132 var flag = false; var next_one;
133 if (typeof(w)!='object') {
134 w = document.getElementById(w);
136 sdump('D_UTIL', 'fake_tab_for_textboxes: Current ' + current + '\n');
137 var nl = w.getElementsByTagName('textbox');
138 //var nl = document.getElementsByTagName('textbox');
139 sdump('D_UTIL', 'fake_tab_for_textboxes: nl.length = ' + nl.length + '\n');
140 for (var i = 0; i < nl.length; i++) {
141 sdump('D_UTIL', 'fake_tab_for_textboxes: Considering ' + nl[i] + '...\n');
142 if (flag && !next_one) {
143 sdump('D_UTIL', 'fake_tab_for_textboxes: Setting next_one ' + nl[i] + '\n');
146 if (nl[i] === current) {
147 sdump('D_UTIL','fake_tab_for_textboxes: Found current\n');
152 sdump('D_UTIL','fake_tab_for_textboxes: Out of loop, Setting next_one ' + nl[0] + '\n');
156 next_one.focus(); next_one.select();
158 sdump('D_UTIL','fake_tab_for_textboxes: next_one not set\n');
162 function get_list_from_tree_selection(tree_w) {
163 sdump('D_UTIL','entering get_list_from_tree...\n');
165 if (typeof(tree_w) != 'object') {
166 hitlist = document.getElementById(tree_w);
171 var start = new Object();
172 var end = new Object();
173 var numRanges = hitlist.view.selection.getRangeCount();
174 for (var t=0; t<numRanges; t++){
175 hitlist.view.selection.getRangeAt(t,start,end);
176 for (var v=start.value; v<=end.value; v++){
177 var i = hitlist.contentView.getItemAtIndex(v);
178 //sdump('D_UTIL',i.tagName + '\n');
182 sdump('D_UTIL','leaving get_list_from_tree...\n');
186 function yesno(value) {
188 case true: case 'true': case '1': case 'on':
195 function formatted_date(date,format) {
196 // pass in a Date object or epoch seconds
197 if (typeof(date) == 'string') {
198 date = new Date( parseInt( date + '000' ) );
200 var mm = date.getMonth() + 1;
202 if (mm.length == 1) mm = '0' +mm;
203 var dd = date.getDate().toString();
204 if (dd.length == 1) dd = '0' +dd;
205 var yyyy = date.getFullYear().toString();
206 var s = format.replace( /%m/g, mm );
207 s = s.replace( /%d/g, dd );
208 s = s.replace( /%Y/g, yyyy );
212 function interval_to_seconds ( $interval ) {
214 $interval = $interval.replace( /and/, ',' );
215 $interval = $interval.replace( /,/, ' ' );
218 var results = $interval.match( /\s*\+?\s*(\d+)\s*(\w{1})\w*\s*/g);
219 for (var i in results) {
220 var result = results[i].match( /\s*\+?\s*(\d+)\s*(\w{1})\w*\s*/ );
221 if (result[2] == 's') $amount += result[1] ;
222 if (result[2] == 'm') $amount += 60 * result[1] ;
223 if (result[2] == 'h') $amount += 60 * 60 * result[1] ;
224 if (result[2] == 'd') $amount += 60 * 60 * 24 * result[1] ;
225 if (result[2] == 'w') $amount += 60 * 60 * 24 * 7 * result[1] ;
226 if (result[2] == 'M') $amount += ((60 * 60 * 24 * 365)/12) * result[1] ;
227 if (result[2] == 'y') $amount += 60 * 60 * 24 * 365 * result[1] ;
235 for (var i = 0; i < arguments.length; i++) {
236 s = s + arguments[i];
238 //sdump('D_UTIL','debug:' + s + '\n');
242 function counter_init(id) {
246 function counter_incr(id) {
247 if (! counter[id]) { counter_init(id); }
248 return ++counter[id];
251 function counter_peek(id) {
252 if (! counter[id]) { return 0; }
256 function timer_init(id) {
257 timer[id] = (new Date).getTime();
260 function timer_elapsed(id) {
261 if (! timer[id]) { timer_init(id); }
262 var ms = (new Date).getTime() - timer[id];
263 return( ms + 'ms (' + ms/1000 + 's)' );
266 function dump_ns_node( node ) {
269 node[fieldmap["Fieldmapper::biblio::record_node"].fields.id.position]
271 node[fieldmap["Fieldmapper::biblio::record_node"].fields.intra_doc_id.position]
273 node[fieldmap["Fieldmapper::biblio::record_node"].fields.name.position]
275 node[fieldmap["Fieldmapper::biblio::record_node"].fields.type.position]
276 + '> parent_node=<' +
277 node[fieldmap["Fieldmapper::biblio::record_node"].fields.parent_node.position]
282 function nodeset2tree(ns) {
284 if (ns[i].parent_node) {
295 function ns_addChild(ns,p,c) {
296 if (! ns[p].children ) { ns[p].children = []; }
297 ns[p].children.push(ns[c]);
300 function print_tabs(t) {
302 for (var j = 0; j < t; j++ ) { r = r + "\t"; }
306 function pretty_print(s) {
307 var r = ''; var t = 0;
310 r = r + "\n" + print_tabs(t) + s[i]; t++;
311 r = r + "\n" + print_tabs(t);
312 } else if (s[i] == '[') {
313 r = r + "\n" + print_tabs(t) + s[i]; t++;
314 r = r + "\n" + print_tabs(t);
315 } else if (s[i] == '}') {
316 t--; r = r + "\n" + print_tabs(t) + s[i];
317 r = r + "\n" + print_tabs(t);
318 } else if (s[i] == ']') {
319 t--; r = r + "\n" + print_tabs(t) + s[i];
320 r = r + "\n" + print_tabs(t);
321 } else if (s[i] == ',') {
323 r = r + "\n" + print_tabs(t);
331 function enable_widgets() {
332 for (var i = 0; i < arguments.length; i++) {
333 if (typeof(arguments[i]) == 'object') {
334 sdump('D_UTIL',arguments[i] + '.disabled = false;\n');
335 arguments[i].disabled = false;
337 var w = document.getElementById( arguments[i] );
339 sdump('D_UTIL',w + '.disabled = false;\n');
346 function disable_widgets() {
347 for (var i = 0; i < arguments.length; i++) {
348 if (typeof(arguments[i]) == 'object') {
349 sdump('D_UTIL',arguments[i] + '.disabled = true;\n');
350 arguments[i].disabled = true;
352 var w = document.getElementById( arguments[i] );
354 sdump('D_UTIL',w + '.disabled = true;\n');
361 function focus_widget(e) {
362 if (typeof(e) == 'object') {
365 var w = document.getElementById(e);
366 if (w) { w.focus(); }
370 function empty_widget(e) {
371 if (typeof(e) != 'object') { e = document.getElementById(e); }
372 if (typeof(e) != 'object') { sdump('D_UTIL','Failed on empty_widget\n'); return; }
373 while (e.lastChild) { e.removeChild(e.lastChild); }
376 function empty_listbox(e) {
377 if (typeof(e) != 'object') { e = document.getElementById(e); }
378 if (typeof(e) != 'object') { sdump('D_UTIL','Failed on empty_listbox\n'); return; }
379 var nl = e.getElementsByTagName('listitem');
380 for (var i = 0; i < nl.length; i++) {
381 e.removeChild(nl[i]);
385 function swap_attributes(e,a1,a2) {
386 if (typeof(e) != 'object') { e = document.getElementById(e); }
387 if (typeof(e) != 'object') { sdump('D_UTIL','Failed on swap_attributes\n'); return; }
388 var a1_v = e.getAttribute(a1);
389 var a2_v = e.getAttribute(a2);
390 e.setAttribute(a1,a2_v);
391 e.setAttribute(a2, a1_v);
392 sdump('D_UTIL','before: a1 = ' + a1_v + ' a2 = ' + a2_v + ' and ');
393 sdump('D_UTIL','after: a1 = ' + a2_v + ' a2 = ' + a1_v + '\n');
396 function cycle_attribute(e,a,v) {
398 if (typeof(e) != 'object') { e = document.getElementById(e); }
399 if (typeof(e) != 'object') { throw('typeof e != object : typeof e = ' + typeof(e)); }
400 if (!a) { throw('!a : a = ' + a); }
401 if (! e.getAttribute(a) ) { throw(' ! e.getAttribute(a) : a = ' + a); }
402 if (typeof(v) != 'object') { throw('typeof v != object : typeof v = ' + typeof(v)); }
404 var toggle = e.getAttribute(a);
405 var next_one = false;
406 sdump('D_UTIL','cycling ' + a + ' on ' + e.getAttribute('id') + ' to ');
407 for (var i = 0; i < v.length; i++) {
409 e.setAttribute(a,v[i]);
410 sdump('D_UTIL',v[i] + '\n');
413 if (toggle == v[i]) {
418 e.setAttribute(a,v[0]);
419 sdump('D_UTIL',v[0] + '\n');
422 throw('current value not in list');
425 sdump('D_UTIL','cycle_attribute error: ' + js2JSON(E) + '\n');
426 sdump('D_UTIL','null\n');
432 function radio_checkbox(ev) {
433 var target = ev.target;
434 var group = target.getAttribute('group');
436 var nl = document.getElementsByTagName('checkbox');
438 if (typeof(nl[i])=='object') {
440 var cgroup = c.getAttribute('group');
441 if (cgroup == group) {
446 target.checked = true;
448 sdump('D_UTIL','radio_checkbox: Checkbox must have a group attribute to find peers');
452 function toggle_hidden_grid_rows(grid) {
453 if (typeof(grid) != 'object') {
454 grid = document.getElementById(grid);
456 if (!grid) { return; }
457 var rows = grid.lastChild; if (!rows) { return; }
458 for (var r = 0; r < rows.childNodes.length; r++ ) {
459 var row = rows.childNodes[r];
460 if (typeof(row) == 'object') {
461 //sdump('D_UTIL','toggle row = ' + row + '\n');
462 var hidden = row.getAttribute('hidden');
463 if (hidden == 'true') {
464 row.setAttribute('hidden','false');
466 row.setAttribute('hidden','true');
472 /* The first parameter is the id of the element to set, or an array of ids for elements to set in batch. The second parameter is an object containing the attribute/value pairs to assign to the element or elements */
473 function xul_setAttributes(el,attrs) {
474 if (typeof(el) == 'object') {
476 var w = document.getElementById(e);
477 for (var a in attrs) {
478 w.setAttribute(a,attrs[a]);
482 var w = document.getElementById(el);
483 for (var a in attrs) {
484 w.setAttribute(a,attrs[a]);
489 function append_treeitem() {
490 var id = arguments[0];
491 var treechildren = document.getElementById(id);
492 if (!treechildren) { sdump('D_UTIL','No ' + id + ' to append to\n'); return; }
493 var treeitem = document.createElement('treeitem'); treechildren.appendChild(treeitem);
494 var treerow = document.createElement('treerow'); treeitem.appendChild(treerow);
495 for (var i = 1; i < arguments.length ; i++ ) {
496 var treecell = document.createElement('treecell'); treerow.appendChild(treecell);
497 treecell.setAttribute('label',arguments[i]);
498 treecell.setAttribute('id', 'treeitem_' + treeitem_id + '_' + i);
499 //sdump('D_UTIL','treecell.label = ' + arguments[i] + '\n');
501 return treeitem_id++;
504 function set_decks(params) {
505 for (var deck_id in params) {
506 var deck = document.getElementById( deck_id )
507 if (deck) deck.setAttribute( 'selectedIndex', params[deck_id] );
511 function super_dump(o,t) {
513 for (var ii = 0; ii < t; ii++) { s = s + '\t'; }
515 s = s + 'o.constructor == Array = ' + (o.constructor == Array) + '\n';
516 for (var ii = 0; ii < t; ii++) { s = s + '\t'; }
517 s = s + "typeof = " + typeof(o) + "\n";
519 var string = new XMLSerializer().serializeToString(o);
520 return( string + "\n" );
527 s = s + super_dump(i,t+1);
531 for (var ii = 0; ii < t; ii++) { s = s + '\t'; }
532 s = s + "\tMember#" + c++ + "\tType:" + typeof(value);
533 if (typeof(value) == 'object') {
534 value = super_dump(value,t+1);
536 s = s + "\ttoString:" + i.toString() + "\tvalue:" + value + "\n";
544 function super_dump_norecurse(o,t) {
546 for (var ii = 0; ii < t; ii++) { s = s + '\t'; }
548 s = s + 'o.constructor == Array = ' + (o.constructor == Array) + '\n';
549 for (var ii = 0; ii < t; ii++) { s = s + '\t'; }
550 s = s + "typeof = " + typeof(o) + "\n";
552 var string = new XMLSerializer().serializeToString(o);
553 return( string + "\n" );
561 for (var ii = 0; ii < t; ii++) { s = s + '\t'; }
562 s = s + "\tMember#" + c++ + "\tType:" + typeof(value);
563 s = s + "\ttoString:" + i.toString() + "\n";
571 function get_my_orgs(user_ou) {
573 // self and ancestors
574 var current_item_id = user_ou.id();
575 //sdump('D_UTIL','mw.G[user_ou] = ' + js2JSON(mw.G['user_ou']) + '\n');
576 //sdump('D_UTIL','current_item_id = ' + current_item_id + '\n');
577 var item_ou; var my_orgs = {}; var other_orgs = {};
578 while( item_ou = find_ou(mw.G['org_tree'],current_item_id) ) {
579 //sdump('D_UTIL','\titem_ou = ' + js2JSON(item_ou) + '\n');
580 my_orgs[ item_ou.id() ] = item_ou;
581 current_item_id = item_ou.parent_ou();
582 if (!current_item_id) { break; }
585 current_item_id = user_ou.id();
586 //sdump('D_UTIL','self & ancestors : my_orgs = <<<'+js2JSON(my_orgs)+'>>>\n');
589 var find_ou_result = find_ou(mw.G['org_tree'],current_item_id);
590 if (find_ou_result) {
591 my_children = find_ou_result.children() }
593 sdump('D_UTIL','ERROR: find_ou(org_tree,'+current_item_id+') returned with no properties\n');
595 //sdump('D_UTIL','my_children: ' + my_children + ' : ' + js2JSON(my_children) + '\n');
597 for (var i = 0; i < my_children.length; i++) {
598 var my_child = my_children[i];
599 my_orgs[ my_child.id() ] = my_child;
600 //sdump('D_UTIL','my_child.children(): ' + my_child.children() + ' : ' + js2JSON(my_child.children()) + '\n');
601 if (my_child.children() != null) {
602 for (var j = 0; j < my_child.children().length; j++) {
603 var my_gchild = my_child.children()[j];
604 my_orgs[ my_gchild.id() ] = my_gchild;
609 //sdump('D_UTIL','& descendants : my_orgs = <<<'+js2JSON(my_orgs)+'>>>\n');
613 function get_other_orgs(org,other_orgs) {
616 function flatten_ou_branch(branch) {
617 //sdump('D_UTIL','flatten: branch = ' + js2JSON(branch) + '\n');
618 var my_array = new Array();
619 my_array.push( branch );
620 for (var i in branch.children() ) {
621 var child = branch.children()[i];
623 var temp_array = flatten_ou_branch(child);
624 for (var j in temp_array) {
625 my_array.push( temp_array[j] );
632 function find_ou(tree,id) {
633 if (typeof(id)=='object') { id = id.id(); }
637 for (var i in tree.children()) {
638 var child = tree.children()[i];
639 ou = find_ou( child, id );
640 if (ou) { return ou; }
645 function find_tree_via_children(tree,children_func,find_func) {
646 if (typeof(tree)!='object') tree = document.getElementById(tree);
648 var t = find_func(tree); if (t) return t;
650 var c = children_func(tree);
652 for (var i = 0; i < c.length; i++) {
653 t = find_func( c[i] );
658 function filter_list(list,f) {
660 for (var i in list) {
661 var t = f( list[i] );
662 if (t) new_list.push( list[i] );
667 function find_list(list,f) {
668 for (var i in list) {
669 var t = f( list[i] );
670 if (t) return list[i];
675 function map_list(list,f) {
677 for (var i in list) {
678 new_list.push( f( list[i] ) );
683 function map_object_to_list(obj,f) {
686 new_list.push( f( obj, i ) );
691 function convert_object_list_to_hash(list) {
692 var my_hash = new Object();
694 for (var i = 0; i < list.length; i++) {
695 my_hash[ list[i].id() ] = list[i];
701 function find_id_object_in_list(list,id) {
702 //sdump('D_UTIL','find_id_object_in_list(' + js2JSON(list).substr(0,20) + '... ,' + id + ')\n');
704 for (var i = 0; i < list.length; i++ ) {
706 if ( list[i].id() == id ) {
710 sdump('D_UTIL','find_id_object_in_list error, i = ' + i + ' typeof(list[i]) = ' + typeof(list[i]) + ' list[i] = ' + js2JSON(list[i]) + ' : ' + js2JSON(E) + '\n');
714 //sdump('D_UTIL','not found\n');
718 function find_attr_object_in_list(list,attr,value) {
720 for (var i = 0; i < list.length; i++ ) {
721 sdump('D_UTIL','find_attr_object_in_list: i = ' + i + ' id = ' + list[i].id() + '\n');
723 var command = 'list[' + i + '].'+attr+'() == ' + value;
724 if ( eval(command) ) {
728 sdump('D_UTIL','find_attr_object_in_list error, i = ' + i + ' typeof(list[i]) = ' + typeof(list[i]) + ' list[i] = ' + js2JSON(list[i]) + ' : list = ' + js2JSON(list) + ' : ' + js2JSON(E) + '\n');
735 function find_ou_by_shortname(tree,sn) {
737 if (tree.shortname()==sn) {
740 for (var i in tree.children()) {
741 var child = tree.children()[i];
742 ou = find_ou_by_shortname( child, sn );
743 if (ou) { return ou; }