]> git.evergreen-ils.org Git - Evergreen.git/blob - Evergreen/staff_client/chrome/content/evergreen/util/util.js
let's not rewrite Bill's debug function and see what happens
[Evergreen.git] / Evergreen / staff_client / chrome / content / evergreen / util / util.js
1 dump('Loading util.js\n');
2
3 var timer = {};
4 var counter = {};
5 var treeitem_id = 0;
6
7 function snd_bad() {
8         mw.G.sound.play( xp_url_init('chrome://evergreen/content/media/redalert.wav') );
9 }
10
11 function snd_really_bad() {
12         mw.G.sound.play( xp_url_init('chrome://evergreen/content/media/die.wav') );
13 }
14
15 function snd_good() {
16         mw.G.sound.play( xp_url_init('chrome://evergreen/content/media/turn.wav') );
17 }
18
19 function snd_circ_good() {
20         mw.G.sound.play( xp_url_init('chrome://evergreen/content/media/clicked.wav') );
21 }
22
23 function snd_circ_bad() {
24         mw.G.sound.play( xp_url_init('chrome://evergreen/content/media/cow.wav') );
25 }
26
27 function snd_logon() {
28
29 }
30
31 function snd_logoff() {
32
33 }
34
35 function snd_exit() {
36
37 }
38
39 function handle_error(E) {
40         var s = '';
41         if (instanceOf(E,ex)) {
42                 s += E.err_msg();
43                 //s += '\n\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n';
44                 //s += 'This error was anticipated.\n\n';
45                 //s += js2JSON(E).substr(0,200) + '...\n\n';
46                 snd_bad()
47         } else {
48                 s += '\n\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n';
49                 s += 'This is a bug that we will fix later.\n\n';
50                 s += js2JSON(E).substr(0,200) + '\n\n';
51                 snd_really_bad();
52         }
53         s_alert(s);
54 }
55
56 function string_to_array(s) {
57         var my_array = [];
58         for (var i = 0; i < s.length; i++ ) {
59                 my_array.push( s.charAt(i) );
60         }
61         return my_array;
62 }
63
64 function textbox_checkdigit(ev) {
65         if ( check_checkdigit( ev.target.value ) ) {
66                 dump('success\n');
67                 return true;
68         } else {
69                 dump('failure\n');
70                 ev.preventDefault();
71                 ev.stopPropagation();
72                 return false;
73         }
74 }
75
76 function check_checkdigit(barcode) {
77
78         var stripped_barcode = barcode.slice(0,-1);
79         var checkdigit = barcode.slice(-1);
80
81         dump('\n\n=-=***=-=\n\ncheck_checkdigit: barcode = ' + barcode + ' barcode stripped = ' + stripped_barcode + ' checkdigit = ' + checkdigit + '\n');
82
83         var sum = 0; var mul = 2;
84
85         var b_array = string_to_array( stripped_barcode ).reverse();
86         dump( '\tb_array = ' + b_array + '\n');
87
88         for (var i in b_array) {
89                 var digit = parseInt( b_array[i] );
90                 dump('\t\tdigit = ' + digit + '\n');
91
92                 var product = digit * mul;
93                 if (mul == 2) { mul = 1; } else { mul = 2; }
94
95                 var p_array = string_to_array( product.toString() );
96                 dump( '\t\tp_array = ' + p_array + '\n');
97
98                 for (var j in p_array) { 
99                         var n = parseInt( p_array[j] );
100                         dump('\t\t\tn = ' + n + '\n');
101                         sum += n;
102                 }
103         }
104
105         dump('\tsum = ' + sum + '\n');
106
107         var s_array = string_to_array( sum.toString() );
108         var calculated_checkdigit = s_array.pop();
109         if (calculated_checkdigit > 0) calculated_checkdigit = 10 - calculated_checkdigit;
110         dump('\tcalculated checkdigit = ' + calculated_checkdigit + '\n\n=-=***=-=\n\n');
111
112         return ( calculated_checkdigit == checkdigit );
113 }
114
115 function fake_tab_for_textboxes(w,current) {
116         var flag = false; var next_one;
117         if (typeof(w)!='object') {
118                 w = document.getElementById(w);
119         }
120         dump('fake_tab_for_textboxes: Current ' + current + '\n');
121         var nl = w.getElementsByTagName('textbox');
122         //var nl = document.getElementsByTagName('textbox');
123         dump('fake_tab_for_textboxes: nl.length = ' + nl.length + '\n');
124         for (var i = 0; i < nl.length; i++) {
125                 dump('fake_tab_for_textboxes: Considering ' + nl[i] + '...\n');
126                 if (flag && !next_one) {
127                         dump('fake_tab_for_textboxes: Setting next_one ' + nl[i] + '\n');       
128                         next_one = nl[i];
129                 }
130                 if (nl[i] === current) {
131                         dump('fake_tab_for_textboxes: Found current\n');
132                         flag = true;
133                 }
134         }
135         if (!next_one) {
136                 dump('fake_tab_for_textboxes: Out of loop, Setting next_one ' + nl[0] + '\n');  
137                 next_one = nl[0];
138         }
139         if (next_one) {
140                 next_one.focus(); next_one.select();
141         } else {
142                 dump('fake_tab_for_textboxes: next_one not set\n');
143         }
144 }
145
146 function get_list_from_tree_selection(tree_w) {
147         dump('entering get_list_from_tree...\n');
148         var hitlist;
149         if (typeof(tree_w) != 'object') {
150                 hitlist = document.getElementById(tree_w);
151         } else {
152                 hitlist = tree_w;
153         }
154         var list = [];
155         var start = new Object();
156         var end = new Object();
157         var numRanges = hitlist.view.selection.getRangeCount();
158         for (var t=0; t<numRanges; t++){
159                 hitlist.view.selection.getRangeAt(t,start,end);
160                 for (var v=start.value; v<=end.value; v++){
161                         var i = hitlist.contentView.getItemAtIndex(v);
162                         //dump(i.tagName + '\n');
163                         list.push( i );
164                 }
165         }
166         dump('leaving get_list_from_tree...\n');
167         return list;
168 }
169
170 function yesno(value) {
171         switch(value) {
172                 case true: case 'true': case '1': case 'on':
173                         return 'Yes';
174                 default: 
175                         return 'No';
176         }
177 }
178
179 function formatted_date(date,format) {
180         // pass in a Date object or epoch seconds
181         if (typeof(date) == 'string') {
182                 date = new Date( parseInt( date + '000' ) );
183         }
184         var mm = date.getMonth() + 1;
185         mm = mm.toString();
186         if (mm.length == 1) mm = '0' +mm;
187         var dd = date.getDate().toString();
188         if (dd.length == 1) dd = '0' +dd;
189         var yyyy = date.getFullYear().toString();
190         var s = format.replace( /%m/g, mm );
191         s = s.replace( /%d/g, dd );
192         s = s.replace( /%Y/g, yyyy );
193         return s;
194 }
195
196 function interval_to_seconds ( $interval ) {
197
198         $interval = $interval.replace( /and/, ',' );
199         $interval = $interval.replace( /,/, ' ' );
200
201         var $amount = 0;
202         var results = $interval.match( /\s*\+?\s*(\d+)\s*(\w{1})\w*\s*/g);  
203         for (var i in results) {
204                 var result = results[i].match( /\s*\+?\s*(\d+)\s*(\w{1})\w*\s*/ );
205                 if (result[2] == 's') $amount += result[1] ;
206                 if (result[2] == 'm') $amount += 60 * result[1] ;
207                 if (result[2] == 'h') $amount += 60 * 60 * result[1] ;
208                 if (result[2] == 'd') $amount += 60 * 60 * 24 * result[1] ;
209                 if (result[2] == 'w') $amount += 60 * 60 * 24 * 7 * result[1] ;
210                 if (result[2] == 'M') $amount += ((60 * 60 * 24 * 365)/12) * result[1] ;
211                 if (result[2] == 'y') $amount += 60 * 60 * 24 * 365 * result[1] ;
212         }
213         return $amount;
214 }
215
216 /*
217 function debug() {
218         var s = '';
219         for (var i = 0; i < arguments.length; i++) {
220                 s = s + arguments[i];
221         }
222         //dump('debug:' + s + '\n');
223 }
224 */
225
226 function counter_init(id) {
227         counter[id] = 0;
228 }
229
230 function counter_incr(id) {
231         if (! counter[id]) { counter_init(id); }
232         return ++counter[id];
233 }
234
235 function counter_peek(id) {
236         if (! counter[id]) { return 0; }
237         return counter[id];
238 }
239
240 function timer_init(id) {
241         timer[id] = (new Date).getTime();
242 }
243
244 function timer_elapsed(id) {
245         if (! timer[id]) { timer_init(id); }
246         var ms = (new Date).getTime() - timer[id];
247         return( ms + 'ms (' + ms/1000 + 's)' );
248 }
249
250 function dump_ns_node( node ) {
251         return (
252         'id=<' + 
253         node[fieldmap["Fieldmapper::biblio::record_node"].fields.id.position] 
254         + '>  intra-id=<' + 
255         node[fieldmap["Fieldmapper::biblio::record_node"].fields.intra_doc_id.position]
256         + '>  name=<' + 
257         node[fieldmap["Fieldmapper::biblio::record_node"].fields.name.position]
258         + '>  node_type=<' + 
259         node[fieldmap["Fieldmapper::biblio::record_node"].fields.type.position]
260         + '>  parent_node=<' + 
261         node[fieldmap["Fieldmapper::biblio::record_node"].fields.parent_node.position]
262         + '>  '
263         );
264 }
265
266 function nodeset2tree(ns) {
267         for (var i in ns) {
268                 if (ns[i].parent_node) {
269                         ns_addChild( 
270                                 ns, 
271                                 ns[i].parent_node, 
272                                 ns[i].intra_doc_id 
273                         );
274                 }
275         }
276         return ns;
277 }
278
279 function ns_addChild(ns,p,c) {
280         if (! ns[p].children ) { ns[p].children = []; }
281         ns[p].children.push(ns[c]);
282 }
283
284 function print_tabs(t) {
285         var r = '';
286         for (var j = 0; j < t; j++ ) { r = r + "\t"; }
287         return r;
288 }
289
290 function pretty_print(s) {
291         var r = ''; var t = 0;
292         for (var i in s) {
293                 if (s[i] == '{') {
294                         r = r + "\n" + print_tabs(t) + s[i]; t++;
295                         r = r + "\n" + print_tabs(t);
296                 } else if (s[i] == '[') {
297                         r = r + "\n" + print_tabs(t) + s[i]; t++;
298                         r = r + "\n" + print_tabs(t);
299                 } else if (s[i] == '}') {
300                         t--; r = r + "\n" + print_tabs(t) + s[i]; 
301                         r = r + "\n" + print_tabs(t);
302                 } else if (s[i] == ']') { 
303                         t--; r = r + "\n" + print_tabs(t) + s[i];
304                         r = r + "\n" + print_tabs(t);
305                 } else if (s[i] == ',') {
306                         r = r + s[i]; 
307                         r = r + "\n" + print_tabs(t);
308                 } else {
309                         r = r + s[i];
310                 }
311         }
312         return r;
313 }
314
315 function enable_widgets() {
316         for (var i = 0; i < arguments.length; i++) {
317                 if (typeof(arguments[i]) == 'object') {
318                         dump(arguments[i] + '.disabled = false;\n');
319                         arguments[i].disabled = false;
320                 } else {
321                         var w = document.getElementById( arguments[i] );
322                         if (w) { 
323                                 dump(w + '.disabled = false;\n');
324                                 w.disabled = false; 
325                         }
326                 }
327         }
328 }
329
330 function disable_widgets() {
331         for (var i = 0; i < arguments.length; i++) {
332                 if (typeof(arguments[i]) == 'object') {
333                         dump(arguments[i] + '.disabled = true;\n');
334                         arguments[i].disabled = true;
335                 } else {
336                         var w = document.getElementById( arguments[i] );
337                         if (w) { 
338                                 dump(w + '.disabled = true;\n');
339                                 w.disabled = true; 
340                         }
341                 }
342         }
343 }
344
345 function focus_widget(e) {
346         if (typeof(e) == 'object') {
347                 e.focus();
348         } else {
349                 var w = document.getElementById(e);
350                 if (w) { w.focus(); }
351         }
352 }
353
354 function empty_widget(e) {
355         if (typeof(e) != 'object') { e = document.getElementById(e); }
356         if (typeof(e) != 'object') { dump('Failed on empty_widget\n'); return; }
357         while (e.lastChild) { e.removeChild(e.lastChild); }
358 }
359
360 function empty_listbox(e) {
361         if (typeof(e) != 'object') { e = document.getElementById(e); }
362         if (typeof(e) != 'object') { dump('Failed on empty_listbox\n'); return; }
363         var nl = e.getElementsByTagName('listitem');
364         for (var i = 0; i < nl.length; i++) {
365                 e.removeChild(nl[i]);
366         }
367 }
368
369 function swap_attributes(e,a1,a2) {
370         if (typeof(e) != 'object') { e = document.getElementById(e); }
371         if (typeof(e) != 'object') { dump('Failed on swap_attributes\n'); return; }
372         var a1_v = e.getAttribute(a1);
373         var a2_v = e.getAttribute(a2);
374         e.setAttribute(a1,a2_v);
375         e.setAttribute(a2, a1_v);
376         dump('before: a1 = ' + a1_v + ' a2 = ' + a2_v + ' and ');
377         dump('after: a1 = ' + a2_v + ' a2 = ' + a1_v + '\n');
378 }
379
380 function cycle_attribute(e,a,v) {
381         try {
382                 if (typeof(e) != 'object') { e = document.getElementById(e); }
383                 if (typeof(e) != 'object') { throw('typeof e != object : typeof e = ' + typeof(e)); }
384                 if (!a) { throw('!a : a = ' + a); }
385                 if (! e.getAttribute(a) ) { throw(' ! e.getAttribute(a) : a = ' + a); }
386                 if (typeof(v) != 'object') { throw('typeof v != object : typeof v = ' + typeof(v)); }
387
388                 var toggle = e.getAttribute(a);
389                 var next_one = false;
390                 dump('cycling ' + a + ' on ' + e.getAttribute('id') + ' to ');
391                 for (var i = 0; i < v.length; i++) {
392                         if (next_one) {
393                                 e.setAttribute(a,v[i]);
394                                 dump(v[i] + '\n');
395                                 return v[i];
396                         }
397                         if (toggle == v[i]) {
398                                 next_one = true;
399                         }
400                 }
401                 if (next_one) {
402                         e.setAttribute(a,v[0]);
403                         dump(v[0] + '\n');
404                         return v[0];
405                 } else {
406                         throw('current value not in list');
407                 }
408         } catch(E) {
409                 dump('cycle_attribute error: ' + js2JSON(E) + '\n');
410                 dump('null\n');
411                 return null;
412         }
413 }
414
415
416 function radio_checkbox(ev) {
417         var target = ev.target;
418         var group = target.getAttribute('group');
419         if (group) {
420                 var nl = document.getElementsByTagName('checkbox');
421                 for (var i in nl) {
422                         if (typeof(nl[i])=='object') {
423                                 var c = nl[i];
424                                 var cgroup = c.getAttribute('group');
425                                 if (cgroup == group) {
426                                         c.checked = false;
427                                 }
428                         }
429                 }
430                 target.checked = true;
431         } else {
432                 dump('radio_checkbox: Checkbox must have a group attribute to find peers');
433         }
434 }
435
436 function toggle_hidden_grid_rows(grid) {
437         if (typeof(grid) != 'object') {
438                 grid = document.getElementById(grid);
439         }
440         if (!grid) { return; }
441         var rows = grid.lastChild; if (!rows) { return; }
442         for (var r = 0; r < rows.childNodes.length; r++ ) {
443                 var row = rows.childNodes[r];
444                 if (typeof(row) == 'object') {
445                         //dump('toggle row = ' + row + '\n');
446                         var hidden = row.getAttribute('hidden');
447                         if (hidden == 'true') {
448                                 row.setAttribute('hidden','false');
449                         } else {
450                                 row.setAttribute('hidden','true');
451                         }
452                 }
453         }
454 }
455
456 /* 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 */
457 function xul_setAttributes(el,attrs) {
458         if (typeof(el) == 'object') {
459                 for (var e in el) {
460                         var w = document.getElementById(e);
461                         for (var a in attrs) {
462                                 w.setAttribute(a,attrs[a]);
463                         }
464                 }
465         } else {
466                 var w = document.getElementById(el);
467                 for (var a in attrs) {
468                         w.setAttribute(a,attrs[a]);
469                 }
470         }
471 }
472
473 function append_treeitem() {
474         var id = arguments[0];
475         var treechildren = document.getElementById(id);
476         if (!treechildren) { dump('No ' + id + ' to append to\n'); return; }
477         var treeitem = document.createElement('treeitem'); treechildren.appendChild(treeitem);
478         var treerow = document.createElement('treerow'); treeitem.appendChild(treerow);
479         for (var i = 1; i < arguments.length ; i++ ) {
480                 var treecell = document.createElement('treecell'); treerow.appendChild(treecell);
481                 treecell.setAttribute('label',arguments[i]);
482                         treecell.setAttribute('id', 'treeitem_' + treeitem_id + '_' + i);
483                 //dump('treecell.label = ' + arguments[i] + '\n');
484         }
485         return treeitem_id++;
486 }
487
488 function set_decks(params) {
489         for (var deck_id in params) {
490                 var deck = document.getElementById( deck_id )
491                 if (deck) deck.setAttribute( 'selectedIndex', params[deck_id] );
492         }
493 }
494
495 function super_dump(o,t) {
496         var s = "\n";
497         for (var ii = 0; ii < t; ii++) { s = s + '\t'; }
498         s = s + "=-=-=\n";
499         s = s + 'o.constructor == Array = ' + (o.constructor == Array) + '\n';
500         for (var ii = 0; ii < t; ii++) { s = s + '\t'; }
501         s = s + "typeof = " + typeof(o) + "\n";
502         try {
503                 var string = new XMLSerializer().serializeToString(o);
504                 return( string + "\n" );
505         } catch( E ) {
506                 var i;
507                 var c = 0;
508                 for (i in o) {
509                         switch(typeof(i)) {
510                                 case 'object':
511                                         s = s + super_dump(i,t+1);
512                                         break;
513                                 default :
514                                         var value = o[i];
515                                         for (var ii = 0; ii < t; ii++) { s = s + '\t'; }
516                                         s = s + "\tMember#" + c++ + "\tType:" + typeof(value);
517                                         if (typeof(value) == 'object') {
518                                                 value = super_dump(value,t+1);
519                                         }
520                                         s = s + "\ttoString:" + i.toString() + "\tvalue:" + value + "\n";
521                                         break;
522                         }
523                 }
524                 return( s + "\n" );
525         }
526 }
527
528 function super_dump_norecurse(o,t) {
529         var s = "\n";
530         for (var ii = 0; ii < t; ii++) { s = s + '\t'; }
531         s = s + "=-=-=\n";
532         s = s + 'o.constructor == Array = ' + (o.constructor == Array) + '\n';
533         for (var ii = 0; ii < t; ii++) { s = s + '\t'; }
534         s = s + "typeof = " + typeof(o) + "\n";
535         try {
536                 var string = new XMLSerializer().serializeToString(o);
537                 return( string + "\n" );
538         } catch( E ) {
539                 var i;
540                 var c = 0;
541                 for (i in o) {
542                         switch(typeof(i)) {
543                                 default :
544                                         var value = o[i];
545                                         for (var ii = 0; ii < t; ii++) { s = s + '\t'; }
546                                         s = s + "\tMember#" + c++ + "\tType:" + typeof(value);
547                                         s = s + "\ttoString:" + i.toString() + "\n";
548                                         break;
549                         }
550                 }
551                 return( s + "\n" );
552         }
553 }
554
555 function get_my_orgs(user_ou) {
556
557         // self and ancestors
558         var current_item_id = user_ou.id();
559         //dump('mw.G[user_ou] = ' + js2JSON(mw.G['user_ou']) + '\n');
560         //dump('current_item_id = ' + current_item_id + '\n');
561         var item_ou; var my_orgs = {}; var other_orgs = {};
562         while( item_ou = find_ou(mw.G['org_tree'],current_item_id) ) {
563                 //dump('\titem_ou = ' + js2JSON(item_ou) + '\n');
564                 my_orgs[ item_ou.id() ] = item_ou;
565                 current_item_id = item_ou.parent_ou();
566                 if (!current_item_id) { break; }
567         }
568
569         current_item_id = user_ou.id();
570         //dump('self & ancestors : my_orgs = <<<'+js2JSON(my_orgs)+'>>>\n');
571         // descendants
572         var my_children;
573         var find_ou_result = find_ou(mw.G['org_tree'],current_item_id);
574         if (find_ou_result) { 
575                 my_children = find_ou_result.children() } 
576         else {
577                 dump('ERROR: find_ou(org_tree,'+current_item_id+') returned with no properties\n');
578         };
579         //dump('my_children: ' + my_children + ' : ' + js2JSON(my_children) + '\n');
580         if (my_children) {
581                 for (var i = 0; i < my_children.length; i++) {
582                         var my_child = my_children[i];
583                         my_orgs[ my_child.id() ] = my_child;
584                         //dump('my_child.children(): ' + my_child.children() + ' : ' + js2JSON(my_child.children()) + '\n');
585                         if (my_child.children() != null) {
586                                 for (var j = 0; j < my_child.children().length; j++) {
587                                         var my_gchild = my_child.children()[j];
588                                         my_orgs[ my_gchild.id() ] = my_gchild;
589                                 }
590                         }
591                 }
592         }
593         //dump('& descendants : my_orgs = <<<'+js2JSON(my_orgs)+'>>>\n');
594         return my_orgs;
595 }
596
597 function get_other_orgs(org,other_orgs) {
598 }
599
600 function flatten_ou_branch(branch) {
601         //dump('flatten: branch = ' + js2JSON(branch) + '\n');
602         var my_array = new Array();
603         my_array.push( branch );
604         for (var i in branch.children() ) {
605                 var child = branch.children()[i];
606                 if (child != null) {
607                         var temp_array = flatten_ou_branch(child);
608                         for (var j in temp_array) {
609                                 my_array.push( temp_array[j] );
610                         }
611                 }
612         }
613         return my_array;
614 }
615
616 function find_ou(tree,id) {
617         if (typeof(id)=='object') { id = id.id(); }
618         if (tree.id()==id) {
619                 return tree;
620         }
621         for (var i in tree.children()) {
622                 var child = tree.children()[i];
623                 ou = find_ou( child, id );
624                 if (ou) { return ou; }
625         }
626         return null;
627 }
628
629 function find_tree_via_children(tree,children_func,find_func) {
630         if (typeof(tree)!='object') tree = document.getElementById(tree);
631
632         var t = find_func(tree); if (t) return t;
633
634         var c = children_func(tree);
635
636         for (var i = 0; i < c.length; i++) {
637                 t = find_func( c[i] );
638                 if (t) return t;
639         }
640 }
641
642 function filter_list(list,f) {
643         var new_list = [];
644         for (var i in list) {
645                 var t = f( list[i] );
646                 if (t) new_list.push( list[i] );
647         }
648         return new_list;
649 }
650
651 function find_list(list,f) {
652         for (var i in list) {
653                 var t = f( list[i] );
654                 if (t) return list[i];
655         }
656         return null;
657 }
658
659 function map_list(list,f) {
660         var new_list = [];
661         for (var i in list) {
662                 new_list.push( f( list[i] ) );
663         }
664         return new_list;
665 }
666
667 function map_object_to_list(obj,f) {
668         var new_list = [];
669         for (var i in obj) {
670                 new_list.push( f( obj, i ) );
671         }
672         return new_list;
673 }
674
675 function convert_object_list_to_hash(list) {
676         var my_hash = new Object();
677         if (list) {
678                 for (var i = 0; i < list.length; i++) {
679                         my_hash[ list[i].id() ] = list[i];
680                 }
681         }
682         return my_hash;
683 }
684
685 function find_id_object_in_list(list,id) {
686         //dump('find_id_object_in_list(' + js2JSON(list).substr(0,20) + '... ,' + id + ')\n');
687         if (list) {
688                 for (var i = 0; i < list.length; i++ ) {
689                         try {
690                                 if ( list[i].id() == id ) {
691                                         return list[i];
692                                 }
693                         } catch(E) {
694                                 dump('find_id_object_in_list error, i = ' + i + '  typeof(list[i]) = ' + typeof(list[i]) + '  list[i] = ' + js2JSON(list[i]) + ' : ' + js2JSON(E) + '\n');
695                         }
696                 }
697         }
698         //dump('not found\n');
699         return null;
700 }
701
702 function find_attr_object_in_list(list,attr,value) {
703         if (list) {
704                 for (var i = 0; i < list.length; i++ ) {
705                         dump('find_attr_object_in_list: i = ' + i + '  id = ' + list[i].id() + '\n');
706                         try {
707                                 var command = 'list[' + i + '].'+attr+'() == ' + value;
708                                 if ( eval(command) ) {
709                                         return list[i];
710                                 }
711                         } catch(E) {
712                                 dump('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');
713                         }
714                 }
715         }
716         return null;
717 }
718
719 function find_ou_by_shortname(tree,sn) {
720         var ou = new aou();
721         if (tree.shortname()==sn) {
722                 return tree;
723         }
724         for (var i in tree.children()) {
725                 var child = tree.children()[i];
726                 ou = find_ou_by_shortname( child, sn );
727                 if (ou) { return ou; }
728         }
729         return null;
730 }
731
732 function populate_listbox_with_local_stat_cats_myself(local_stat_cats,local_cat_entries,listbox,libs,app,method,editable) {
733         dump('populate_local_stat_cats: pertinent libs = ' + js2JSON(libs) + '\n');
734
735         local_stat_cats = user_request(
736                 app,
737                 method,
738                 [ mw.G.auth_ses[0], libs ]
739         )[0];
740         //dump('local_stat_cats = ' + pretty_print( js2JSON( local_stat_cats ) ) + '\n');
741
742         var list = listbox;
743         if (typeof list != 'object') list = document.getElementById(list);
744
745         for (var i in local_stat_cats) {
746
747                 var stat_cat = local_stat_cats[i];
748
749                 var listitem = document.createElement('listitem'); 
750                 list.appendChild(listitem);
751                 listitem.setAttribute('allowevents','true');
752                 dump('listitem = ' + listitem + '\n');
753
754                         var label = document.createElement('listcell'); 
755                         listitem.appendChild(label);
756                         label.setAttribute('label',stat_cat.name() );
757                         dump('\tlistcell = ' + label + '\n');
758
759                         var menucell = document.createElement('listcell'); 
760                         listitem.appendChild(menucell);
761                         dump('\tlistcell = ' + menucell + '\n');
762
763                                 var menulist = document.createElement('menulist');
764                                 menucell.appendChild(menulist);
765                                 if (editable) { menulist.setAttribute('editable','true'); }
766                                 menulist.setAttribute('id','menulist_stat_cat_'+stat_cat.id());
767                                 dump('\tmenulist = ' + menulist + '\n');
768
769                                         var menupopup = document.createElement('menupopup');
770                                         menulist.appendChild(menupopup);
771                                         menupopup.setAttribute('stat_cat',stat_cat.id());
772                                         menupopup.setAttribute('oncommand','apply_attribute(event);');
773                                         dump('\t\tmenupopup = ' + menupopup + '\n');
774
775                 for (var j in stat_cat.entries() ) {
776
777                         var stat_entry = stat_cat.entries()[j];
778                         local_stat_cat_entries[stat_entry.id()] = stat_entry;
779
780                         var menuitem = document.createElement('menuitem');
781                         menupopup.appendChild(menuitem);
782                         menuitem.setAttribute('label',stat_entry.value());
783                         if (editable) {
784                                 menuitem.setAttribute('value',stat_entry.value());
785                         } else {
786                                 menuitem.setAttribute('value',stat_entry.id());
787                         }
788                         menuitem.setAttribute('stat_cat',stat_cat.id());
789                         menuitem.setAttribute('id','menuitem_stat_cat_entry_' + stat_entry.id());
790                         dump('\t\t\tmenuitem = ' + menuitem + '\n');
791
792                 }
793
794         }
795
796         //dump('local_stat_cat_entries = ' + pretty_print( js2JSON( local_stat_cat_entries ) ) + '\n');
797
798 }
799
800 function populate_rows_with_local_stat_cats(local_stat_cats,local_stat_cat_entries,rows,editable) {
801         //dump('populate_local_stat_cats: pertinent libs = ' + js2JSON(libs) + '\n');
802
803         /*local_stat_cats = user_request(
804                 app,
805                 method,
806                 [ mw.G.auth_ses[0], libs ]
807         )[0];*/
808         //dump('local_stat_cats = ' + pretty_print( js2JSON( local_stat_cats ) ) + '\n');
809
810         if (typeof rows != 'object') rows = document.getElementById(rows);
811
812         for (var i in local_stat_cats) {
813
814                 var stat_cat = local_stat_cats[i];
815
816                 var row = document.createElement('row');
817                 rows.appendChild(row);
818
819                 var label = document.createElement('label');
820                 label.setAttribute('value',stat_cat.name());
821                 row.appendChild(label);
822
823                 var menulist = document.createElement('menulist');
824                 row.appendChild(menulist);
825                 if (editable) { menulist.setAttribute('editable','true'); }
826                 menulist.setAttribute('id','menulist_stat_cat_'+stat_cat.id());
827                 menulist.setAttribute('stat_cat_id',stat_cat.id());
828                 dump('\tmenulist = ' + menulist + '\n');
829
830                         var menupopup = document.createElement('menupopup');
831                         menulist.appendChild(menupopup);
832                         menupopup.setAttribute('stat_cat',stat_cat.id());
833                         menupopup.setAttribute('command','cmd_apply');
834                         dump('\t\tmenupopup = ' + menupopup + '\n');
835
836                 for (var j in stat_cat.entries() ) {
837
838                         var stat_entry = stat_cat.entries()[j];
839                         local_stat_cat_entries[stat_entry.id()] = stat_entry;
840
841                         var menuitem = document.createElement('menuitem');
842                         menupopup.appendChild(menuitem);
843                         menuitem.setAttribute('label',stat_entry.value());
844                         if (editable) {
845                                 menuitem.setAttribute('value',stat_entry.value());
846                         } else {
847                                 menuitem.setAttribute('value',stat_entry.id());
848                         }
849                         menuitem.setAttribute('stat_cat',stat_cat.id());
850                         menuitem.setAttribute('id','menuitem_stat_cat_entry_' + stat_entry.id());
851                         dump('\t\t\tmenuitem = ' + menuitem + '\n');
852
853                 }
854
855         }
856
857         //dump('local_stat_cat_entries = ' + pretty_print( js2JSON( local_stat_cat_entries ) ) + '\n');
858
859 }
860
861 function populate_copy_status_list(menulist,menupopup,defaultccs) {
862         dump('populate_copy_status_list\n');
863         var popup = document.getElementById(menupopup);
864
865         if (popup) {
866                 empty_widget(popup);
867                 for (var i in mw.G.ccs_list) {
868                         var menuitem = document.createElement('menuitem');
869                         menuitem.setAttribute('label', mw.G.ccs_list[i].name()); 
870                         menuitem.setAttribute('value', mw.G.ccs_list[i].id()); 
871                         menuitem.setAttribute('id', 'ccsitem' + mw.G.ccs_list[i].id()); 
872                         //dump('pop_ccs_list: i = ' + i + ' ccs = ' + mw.G.ccs_list[i] + ' = ' + js2JSON(mw.G.ccs_list[i]) + '\n');
873                         popup.appendChild(menuitem);
874                 }
875                 var list = document.getElementById(menulist);
876                 if (list && defaultccs) {
877                         if (typeof defaultccs == 'object') {
878                                 defaultccs = defaultccs.id();   
879                         }
880                         var menuitem_id = 'ccsitem' + defaultccs;
881                         var menuitem = document.getElementById(
882                                 menuitem_id
883                         );
884                         var  menulist_e = document.getElementById(menulist);
885                         if (menulist_e && menuitem) { 
886                                 dump('Setting default ccs\n');
887                                 menulist_e.selectedItem = menuitem; 
888                         } else {
889                                 dump('Not Setting default ccs\n');
890                         }
891                 }
892         } else {
893                         dump('populate_copy_status_list: Could not find menupopup: ' + menupopup + '\n');
894                         throw('populate_copy_status_list: Could not find menupopup: ' + menupopup + '\n');
895         }
896
897 }
898
899 function populate_copy_location_list(menulist,menupopup,defaultacpl) {
900         dump('populate_copy_location_list\n');
901         var popup = document.getElementById(menupopup);
902
903         if (popup) {
904                 empty_widget(popup);
905                 for (var i in mw.G.acpl_my_orgs) {
906                         var menuitem = document.createElement('menuitem');
907                         menuitem.setAttribute('label', mw.G.acpl_my_orgs[i].name()); 
908                         menuitem.setAttribute('value', mw.G.acpl_my_orgs[i].id()); 
909                         menuitem.setAttribute('id', 'acplitem' + mw.G.acpl_my_orgs[i].id()); 
910                         //dump('populate_copy_location_list: i = ' + i + ' acpl_my_orgs = ' + mw.G.acpl_my_orgs[i] + ' = ' + js2JSON(mw.G.acpl_my_orgs[i]) + '\n');
911                         popup.appendChild(menuitem);
912                 }
913                 var list = document.getElementById(menulist);
914                 if (list && defaultacpl) {
915                         if (typeof defaultacpl == 'object') {
916                                 defaultacpl = defaultacpl.id(); 
917                         }
918                         var menuitem_id = 'acplitem' + defaultacpl;
919                         var menuitem = document.getElementById(
920                                 menuitem_id
921                         );
922                         var menulist_e = document.getElementById(menulist);
923                         if (menulist_e && menuitem) { menulist_e.selectedItem = menuitem; }
924                 }
925         } else {
926                         dump('populate_copy_location_list: Could not find menupopup: ' + menupopup + '\n');
927                         throw('populate_copy_location_list: Could not find menupopup: ' + menupopup + '\n');
928         }
929
930 }
931
932 function populate_lib_list(menulist,menupopup,defaultlib,id_flag) {
933         dump('populate_lib_list\n');
934         var default_menuitem;
935         if (typeof defaultlib == 'object') {
936                 defaultlib = defaultlib.id();   
937         }
938         var popup = menupopup;
939         if (typeof(popup)!='object') { popup = document.getElementById(menupopup); }
940         if (popup) {
941                 //dump('found popup\n');
942                 empty_widget(popup);
943                 var padding_flag = false;
944                 for (var ou in mw.G.my_orgs) {
945                         //dump('\tlooping on my_orgs:  ' + js2JSON(mw.G.my_orgs[ou]) + '\n');
946                         //dump('\tlooping on my_orgs:  ou = ' + ou + '\n');
947                         var menuitem = document.createElement('menuitem');
948                         popup.appendChild(menuitem);
949                         //dump('\t\tmenuitem = ' + menuitem + '\n');
950                         var padding = '';
951                         //var depth = find_id_object_in_list( mw.G.aout_list, mw.G.my_orgs[ou].ou_type() ).depth();
952                         var depth = mw.G.aout_hash[ mw.G.my_orgs[ou].ou_type() ].depth();
953                         if (depth == '0') { padding_flag = true; }
954                         if (padding_flag) {
955                                 for (var i = 0; i < depth; i++) { 
956                                         padding = padding + '  '; 
957                                 }
958                         }
959                         menuitem.setAttribute('label', padding + mw.G.my_orgs[ou].name() );
960                         menuitem.setAttribute('value', mw.G.my_orgs[ou].id() );
961                         if (id_flag) menuitem.setAttribute('id', 'libitem' + mw.G.my_orgs[ou].id() );
962                         //dump('\tname = ' + mw.G.my_orgs[ou].name() + '  id = ' + mw.G.my_orgs[ou].id() + '\n');
963                         if (defaultlib == mw.G.my_orgs[ou].id()) {
964                                 default_menuitem = menuitem;
965                                 dump('Setting defaultlib = ' + defaultlib + '\n');
966                         }
967                 }
968                 var list = menulist;
969                 if (typeof(list)!='object') { list = document.getElementById(menulist); }
970                 if (list && defaultlib && default_menuitem) {
971                         //dump('default_menuitem = ' + default_menuitem + '\n');
972                         if (list) { list.selectedItem = default_menuitem; }
973                 }
974         } else {
975                         dump('populate_lib_list: Could not find ' + menupopup + '\n');
976                         throw('populate_lib_list: Could not find ' + menupopup + '\n');
977         }
978 }
979
980 function populate_lib_list_with_branch(menulist,menupopup,defaultlib,branch,id_flag) {
981         dump('populate_lib_list_with_branch\n');
982         var default_menuitem;
983         if (typeof defaultlib == 'object') {
984                 defaultlib = defaultlib.id();   
985         }
986         var popup = menupopup;
987         if (typeof(popup)!='object') popup = document.getElementById(menupopup);
988         if (popup) {
989                 empty_widget(popup);
990                 var padding_flag = true;
991                 var flat_branch = flatten_ou_branch( branch );
992                 //dump('\n\nflat_branch = ' + js2JSON(flat_branch) + '\n');
993                 for (var i in flat_branch) {
994                         //dump('i = ' + js2JSON(i) + ' flat_branch[i] = ' + js2JSON(flat_branch[i]) + '\n');
995                         var menuitem = document.createElement('menuitem');
996                         var padding = '';
997                         //if (flat_branch[i].ou_type().depth() == '0') { padding_flag = true; }
998                         var depth = mw.G.aout_hash[ flat_branch[i].ou_type() ].depth();
999                         if (padding_flag) {
1000                                 for (var j = 0; j < depth; j++) { 
1001                                         padding = padding + '  '; 
1002                                 }
1003                         }
1004                         menuitem.setAttribute('label', padding + flat_branch[i].name() );
1005                         menuitem.setAttribute('value', flat_branch[i].id() );
1006                         if (id_flag) menuitem.setAttribute('id', 'libitem' + flat_branch[i].id() );
1007                         if (defaultlib == flat_branch[i].id()) {
1008                                 default_menuitem = menuitem;
1009                                 dump('i = ' + i + ' Setting defaultlib = ' + defaultlib + '   menuitem = ' + default_menuitem + '  value = ' + default_menuitem.getAttribute('value') + '\n');
1010                         }
1011                         popup.appendChild(menuitem);
1012                 }
1013                 var list = menulist;
1014                 if (typeof(list)!='object') { list = document.getElementById(menulist); }
1015                 if (list && defaultlib && default_menuitem) {
1016                         //dump('default_menuitem = ' + default_menuitem + ' value = ' + default_menuitem.getAttribute('value') + '\n');
1017                         if (list) { list.selectedItem = default_menuitem; }
1018                 }
1019         } else {
1020                         dump('populate_lib_list_with_branch: Could not find ' + menupopup + '\n');
1021                         throw('populate_lib_list_with_branch: Could not find ' + menupopup + '\n');
1022         }
1023         dump('\tleaving populate_lib_list_with_branch\n');
1024 }
1025
1026 function populate_user_profile(menulist,menupopup,defaultap) {
1027         dump('Entering populate_user_profile\n');
1028         var popup = document.getElementById(menupopup);
1029         if (popup) {
1030                 empty_widget(popup);
1031                 for (var i in mw.G.ap_list) {
1032                         var menuitem = document.createElement('menuitem');
1033                         menuitem.setAttribute('label', mw.G.ap_list[i].name()); 
1034                         menuitem.setAttribute('value', mw.G.ap_list[i].id()); 
1035                         menuitem.setAttribute('id', 'apitem' + mw.G.ap_list[i].id()); 
1036                         //dump('pop_ap_list: i = ' + i + ' ap = ' + mw.G.ap_list[i] + ' = ' + js2JSON(mw.G.ap_list[i]) + '\n');
1037                         popup.appendChild(menuitem);
1038                 }
1039                 var list = document.getElementById(menulist);
1040                 if (list && defaultap) {
1041                         if (typeof defaultap == 'object') {
1042                                 defaultap = defaultap.id();     
1043                         }
1044                         var menuitem_id = 'apitem' + defaultap;
1045                         var menuitem = document.getElementById(
1046                                 menuitem_id
1047                         );
1048                         var  menulist_e = document.getElementById(menulist);
1049                         if (menulist_e) { menulist_e.selectedItem = menuitem; }
1050                 }
1051         } else {
1052                         dump('populate_user_profile: Could not find menupopup: ' + menupopup + '\n');
1053                         throw('populate_user_profile: Could not find menupopup: ' + menupopup + '\n');
1054         }
1055 }
1056
1057 function populate_ident_types(menulist,menupopup,repeatid,defaultcit) {
1058         dump('Entering populate_ident_types\n');
1059         var popup = document.getElementById(menupopup);
1060         if (popup) {
1061                 empty_widget(popup);
1062                 for (var i in mw.G.cit_list) {
1063                         var menuitem = document.createElement('menuitem');
1064                         menuitem.setAttribute('label', mw.G.cit_list[i].name()); 
1065                         menuitem.setAttribute('value', mw.G.cit_list[i].id()); 
1066                         menuitem.setAttribute('id', 'cit' + repeatid + 'item' + mw.G.cit_list[i].id()); 
1067                         //dump('pop_cit_list: i = ' + i + ' cit = ' + mw.G.cit_list[i] + ' = ' + js2JSON(mw.G.cit_list[i]) + '\n');
1068                         popup.appendChild(menuitem);
1069                 }
1070                 if (list && defaultcit) {
1071                         if (typeof defaultcit == 'object') {
1072                                 defaultcit = defaultcit.id();   
1073                         }
1074                         var menuitem_id = 'cit' + repeatid + 'item' + defaultcit;
1075                         var menuitem = document.getElementById(
1076                                 menuitem_id
1077                         );
1078                         var  menulist_e = document.getElementById(menulist);
1079                         if (menulist_e) { menulist_e.selectedItem = menuitem; }
1080                 }
1081         } else {
1082                         dump('populate_ident_types: Could not find menupopup: ' + menupopup + '\n');
1083                         throw('populate_ident_types: Could not find menupopup: ' + menupopup + '\n');
1084         }
1085 }
1086
1087
1088
1089 function populate_name_prefix(menulist,menupopup,defaultvalue) {
1090         var popup = document.getElementById(menupopup);
1091         if (popup) {
1092                 empty_widget(popup);
1093                 var prefix_list = [
1094                         'Mr','Mrs','Ms','Miss', 'Dr',
1095                         '',
1096                         'Advisor',
1097                         'Airman',
1098                         'Admiral',
1099                         'Agent',
1100                         'Ambassador',
1101                         'Baron',
1102                         'Baroness',
1103                         'Bishop',
1104                         'Brother',
1105                         'Cadet',
1106                         'Captain',
1107                         'Cardinal',
1108                         'Chairperson',
1109                         'Chancellor',
1110                         'Chief',
1111                         'Colonel', 
1112                         'Commander',
1113                         'Commodore',
1114                         'Congressman',
1115                         'Congresswoman',
1116                         'Constable',
1117                         'Consul',
1118                         'Corporal',
1119                         'Councilperson',
1120                         'Counselor',
1121                         'Dean',
1122                         'Duchess',
1123                         'Duke',
1124                         'Elder',
1125                         'Ensign',
1126                         'Father',
1127                         'General',
1128                         'Governor',
1129                         'Judge',
1130                         'Justice',
1131                         'King',
1132                         'Lady',
1133                         'Lieutenant',
1134                         'Lord',
1135                         'Major',
1136                         'Marshal',
1137                         'Mayor',
1138                         'Midshipman',
1139                         'Minister',
1140                         'Monsignor',
1141                         'Officer',
1142                         'Pastor',
1143                         'Petty Officer',
1144                         'Pope',
1145                         'Prince',
1146                         'Princess',
1147                         'President',
1148                         'Private',
1149                         'Prof',
1150                         'Queen',
1151                         'Rabbi',
1152                         'Representative',
1153                         'Reverend',
1154                         'Seaman',
1155                         'Secretary',
1156                         'Senator',
1157                         'Sergeant',
1158                         'Sheriff',
1159                         'Sir',
1160                         'Sister',
1161                         'Speaker',
1162                         'Specialist',
1163                         'Treasurer',
1164                         'Vice President',
1165                         'Warrant Officer'
1166                 ];
1167                 for (var i in prefix_list) {
1168                         var menuitem = document.createElement('menuitem');
1169                         menuitem.setAttribute('label', prefix_list[i]); 
1170                         menuitem.setAttribute('value', prefix_list[i]); 
1171                         popup.appendChild(menuitem);
1172                 }
1173                 var list = document.getElementById(menulist);
1174                 if (list) {
1175                         if (defaultvalue) { 
1176                                 list.value = defaultvalue;
1177                         }
1178                 } else {
1179                         dump('populate_name_prefix: Could not find menulist: ' + menulist + '\n');
1180                         throw('populate_name_prefix: Could not find menulist: ' + menulist + '\n');
1181                 }
1182         } else {
1183                         dump('populate_name_prefix: Could not find menupopup: ' + menupopup + '\n');
1184                         throw('populate_name_prefix: Could not find menupopup: ' + menupopup + '\n');
1185         }
1186
1187 }
1188
1189 function populate_name_suffix(menulist,menupopup,defaultvalue) {
1190         var popup = document.getElementById(menupopup);
1191         if (popup) {
1192                 empty_widget(popup);
1193                 var suffix_list = [
1194                         'Jr','Sr','II','III',
1195                         '',
1196                         'AA',
1197                         'AS',
1198                         'AAS',
1199                         'BA',
1200                         'BS',
1201                         'CFPIM',
1202                         'CPA',
1203                         'CPIM',
1204                         'CPM',
1205                         'CXE',
1206                         'DC',
1207                         'DDS',
1208                         'DO', 
1209                         'DPM',
1210                         'DVM',
1211                         'Esq',
1212                         'FACAAI',
1213                         'FACP',
1214                         'FACS',
1215                         'FACEP',
1216                         'FCP',
1217                         'FICS',
1218                         'GYN',
1219                         'JD',
1220                         'LPN',
1221                         'MA',
1222                         'MCSE',
1223                         'MD', 
1224                         'MS',
1225                         'NMD',
1226                         'OB',
1227                         'PhD',
1228                         'RN'
1229                 ];
1230                 for (var i in suffix_list) {
1231                         var menuitem = document.createElement('menuitem');
1232                         menuitem.setAttribute('label', suffix_list[i]); 
1233                         menuitem.setAttribute('value', suffix_list[i]); 
1234                         popup.appendChild(menuitem);
1235                 }
1236                 var list = document.getElementById(menulist);
1237                 if (list) { 
1238                         if (defaultvalue) { 
1239                                 list.value = defaultvalue;
1240                         }
1241                 } else {
1242                         dump('populate_name_suffix: Could not find ' + menulist + '\n');
1243                         throw('populate_name_suffix: Could not find ' + menulist + '\n');
1244                 }
1245         } else {
1246                         dump('populate_name_suffix: Could not find ' + menupopup + '\n');
1247                         throw('populate_name_suffix: Could not find ' + menupopup + '\n');
1248         }
1249
1250 }
1251