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