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