]> git.evergreen-ils.org Git - Evergreen.git/blob - Evergreen/staff_client/chrome/content/evergreen/patron/patron_edit_legacy.js
surveys, licked
[Evergreen.git] / Evergreen / staff_client / chrome / content / evergreen / patron / patron_edit_legacy.js
1 mw.sdump('D_LEGACY','Loading patron.js\n');
2 //var newdoctype = document.implementation.createDocumentType("HTML", "-//W3C//DTD HTML 4.01 Transitional//EN","");
3 var HTMLdoc;// = document.implementation.createDocument("", "", newdoctype);
4 try {
5         if (typeof(PATRON)=='object') { 
6                 mw.sdump('D_LEGACY','Already loaded\n');
7                 exit; 
8         }
9 } catch(E) {
10 }
11 var PATRON = {};
12 PATRON['search'] = {};
13 PATRON['search_results'] = [];
14 PATRON['checkouts'] = [];
15 var hash_aua = {};
16 var hash_au = {};
17 var hash_ac = {};
18 var backup_au = {};
19 //var hash_ap = {};
20 var response_list = [];
21 var local_stat_cats = [];
22 var local_stat_cat_entries = {};
23 var patron_hits_per_page = 20;
24
25 var new_id = -1;
26
27 var patron_list_columns = [ 
28         { 'f' : 'prefix', 'v' : 'Prefix', 'hidden' : true },
29         { 'f' : 'family_name', 'v' : 'Family Name', 'primary' : true },
30         { 'f' : 'first_given_name', 'v' : 'First Name' },
31         { 'f' : 'second_given_name', 'v' : 'Middle Name' },
32         { 'f' : 'suffix', 'v' : 'Suffix', 'hidden' : false },
33         { 'f' : 'email', 'v' : 'Email', 'hidden' : true  },
34         { 'f' : 'day_phone', 'v' : 'Day Phone', 'hidden' : false },
35         { 'f' : 'evening_phone', 'v' : 'Evening Phone', 'hidden' : true },
36         { 'f' : 'other_phone', 'v' : 'Other Phone', 'hidden' : true },
37         { 'f' : 'ident_value', 'v' : 'Ident Value', 'hidden' : false },
38         { 'f' : 'ident_type', 'v' : 'Ident Type', 'hidden' : true },
39         { 'f' : 'ident_value2', 'v' : 'Ident Value 2', 'hidden' : true },
40         { 'f' : 'ident_type2', 'v' : 'Ident Type 2', 'hidden' : true},
41         { 'f' : 'dob', 'v' : 'Date of Birth', 'hidden' : true},
42         { 'f' : 'active', 'v' : 'Active', 'hidden' : true},
43         { 'f' : 'expire_date', 'v' : 'Expire Date', 'hidden' : true},
44         { 's' : 'home_ou', 'f' : 'shortname', 'v' : 'Home Lib', 'hidden' : true},
45         { 'f' : 'usrname', 'v' : 'Login Name', 'hidden' : true},
46         { 'f' : 'usrgroup', 'v' : 'Group', 'hidden' : true},
47         { 's' : 'mailing_address', 'f' : 'street1', 'v' : 'Mailing Address - Street 1', 'hidden' : true},
48         { 's' : 'mailing_address', 'f' : 'street2', 'v' : 'Mailing Address - Street 2', 'hidden' : true},
49         { 's' : 'mailing_address', 'f' : 'city', 'v' : 'Mailing Address - City', 'hidden' : true},
50         { 's' : 'mailing_address', 'f' : 'state', 'v' : 'Mailing Address - State', 'hidden' : true},
51         { 's' : 'mailing_address', 'f' : 'post_code', 'v' : 'Mailing Address - ZIP', 'hidden' : false},
52         { 's' : 'billing_address', 'f' : 'street1', 'v' : 'Physical Address - Street 1', 'hidden' : true},
53         { 's' : 'billing_address', 'f' : 'street2', 'v' : 'Physical Address - Street 2', 'hidden' : true},
54         { 's' : 'billing_address', 'f' : 'city', 'v' : 'Physical Address - City', 'hidden' : true},
55         { 's' : 'billing_address', 'f' : 'state', 'v' : 'Physical Address - State', 'hidden' : true},
56         { 's' : 'billing_address', 'f' : 'post_code', 'v' : 'Physical Address - ZIP', 'hidden' : false}
57 ];
58
59
60 function patron_init() {
61         mw.sdump('D_LEGACY','**** TESTING: patron.js: patron_init(): ' + mw.G.main_test_variable + '\n');
62         mw.sdump('D_LEGACY','PATRON = ' + js2JSON(PATRON) + '\n');
63         var textbox = document.getElementById('patron_scan_textbox');
64         if (textbox) textbox.addEventListener("keypress",patron_handle_keypress,false);
65         /* 
66         Originally, the idea here was to setup the PATRON object based on barcode if the bundle loader
67         set a params.barcode.  This would also switch the barcode scan prompt to the patron summary
68         sidebar.
69         */
70         patron_init_if_barcode();
71 }
72
73 function patron_handle_keypress(ev) {
74         if (ev.keyCode && ev.keyCode == 13) {
75                 switch(this) {
76                         case document.getElementById('patron_scan_textbox') :
77                                 ev.preventDefault();
78                                 PATRON.scan_submit(ev);
79                         break;
80                         default:
81                         break;
82                 }
83         }
84 }
85
86 function patron_new_init() {
87         mw.sdump('D_LEGACY','**** TESTING: patron.js: patron_new_init(): ' + mw.G.main_test_variable + '\n');
88         mw.sdump('D_LEGACY','PATRON = ' + js2JSON(PATRON) + '\n');
89         PATRON.au = new au();
90         PATRON.au.id( new_id-- );
91         PATRON.au.isnew( '1' );
92         PATRON.au.profile( mw.G.ap_list[0].id() );
93         PATRON.au.ident_type( mw.G.cit_list[0].id() );
94         PATRON.au.home_ou( mw.G.user_ou.id() );
95         PATRON.au.addresses( [] );
96         PATRON.au.stat_cat_entries( [] );
97
98                 var card = new ac();
99                 card.id( new_id-- );
100                 card.isnew( '1' );
101                 card.barcode( 'REQUIRED' );
102                 //PATRON.barcode = 'REQUIRED';
103                 card.usr( PATRON.au.id() );
104                 hash_ac[ card.id() ] =  card;
105
106         PATRON.au.card( card );
107         PATRON.au.cards( [ card ] );
108         PATRON.related_refresh(PATRON.au.id());
109
110         var passwd = document.getElementById( 'patron_edit_system_new_passwd_textbox' );
111         passwd.value = Math.floor( (Math.random() * 9000) + 1000 );
112         PATRON.au.passwd( passwd.value );
113
114         var textbox = document.getElementById( 'patron_edit_system_barcode_textbox' );
115         textbox.select(); textbox.focus();
116 }
117
118 function patron_edit_init() {
119         mw.sdump('D_LEGACY','**** TESTING: patron.js: patron_edit_init(): ' + mw.G.main_test_variable + '\n');
120         mw.sdump('D_LEGACY','PATRON = ' + js2JSON(PATRON) + '\n');
121         //mw.sdump('D_LEGACY','PATRON.au.array.length = ' + PATRON.au.array.length + '\n');
122         populate_patron_edit_library_menu();
123         populate_patron_edit_prefix_menu();
124         populate_patron_edit_suffix_menu();
125         populate_patron_edit_profile_menu();
126         populate_patron_edit_ident_type_menu();
127         populate_patron_edit_ident_type_menu2();
128         PATRON.summary_refresh();
129         local_stat_cats = mw.G.actsc_list;
130         populate_rows_with_local_stat_cats(
131                 local_stat_cats,
132                 local_stat_cat_entries,
133                 'pescg_rows',
134                 true
135         );
136         PATRON.summary_refresh();
137 }
138
139 function patron_init_if_barcode() {
140         try {
141                 if ( params.barcode ) {
142                         mw.sdump('D_LEGACY','patron_init(): patron.refresh()\n');
143                         PATRON.retrieve_patron(params.barcode);
144                         var deck = document.getElementById('patron_scan_deck');
145                         if (deck) { deck.setAttribute('selectedIndex','1'); }
146                 }
147         } catch(E) {
148                 //mw.sdump('D_LEGACY','patron_init_if_barcode ERROR: ' + js2JSON(E) + '\n');
149                 mw.sdump('D_LEGACY','patron_init_if_barcode failed\n');
150         }
151 }
152
153 function populate_patron_edit_library_menu() {
154         try {
155                 //populate_lib_list(
156                 populate_lib_list_with_branch(
157                         'patron_edit_system_library_menulist',
158                         'patron_edit_system_library_menupopup',
159                         mw.G.user_ou,
160                         mw.G.org_tree,
161                         true
162                 );
163         } catch(E) {
164                 mw.sdump('D_LEGACY','populate_patron_edit_library_menu ERROR: ' + js2JSON(E) + '\n');
165                 //mw.sdump('D_LEGACY','populate_patron_edit_library_menu failed\n');
166         }
167 }
168
169 function set_patron_edit_library_menu() {
170         var menuitem_id = 
171                 'libitem' +
172                 find_ou(
173                         mw.G.org_tree,
174                         PATRON.au.home_ou()
175                 ).id();
176         var menuitem = document.getElementById(
177                 menuitem_id
178         );
179         var homelib_e = document.getElementById('patron_edit_system_library_menulist');
180         if (homelib_e) { 
181                 homelib_e.selectedItem = menuitem; 
182                 mw.sdump('D_LEGACY','\tShould be set\n');
183         }
184 }
185
186 function populate_patron_edit_prefix_menu() {
187         try {
188                 populate_name_prefix(
189                         'patron_edit_system_prefix_menulist',
190                         'patron_edit_system_prefix_menupopup'   
191                 );
192         } catch(E) {
193                 //mw.sdump('D_LEGACY','populate_patron_edit_prefix_menu ERROR: ' + js2JSON(E) + '\n');
194                 mw.sdump('D_LEGACY','populate_patron_edit_prefix_menu failed\n');
195         }
196 }
197
198 function populate_patron_edit_suffix_menu() {
199         try {
200                 populate_name_suffix(
201                         'patron_edit_system_suffix_menulist',   
202                         'patron_edit_system_suffix_menupopup'   
203                 );
204         } catch(E) {
205                 //mw.sdump('D_LEGACY','populate_patron_edit_suffix_menu ERROR: ' + js2JSON(E) + '\n');
206                 mw.sdump('D_LEGACY','populate_patron_edit_suffix_menu failed\n');
207         }
208 }
209
210 function populate_patron_edit_profile_menu() {
211         try {
212                 populate_user_profile(
213                         'patron_edit_system_profile_menulist',  
214                         'patron_edit_system_profile_menupopup'
215                 );
216         } catch(E) {
217                 //mw.sdump('D_LEGACY','populate_patron_edit_profile_menu ERROR: ' + js2JSON(E) + '\n');
218                 mw.sdump('D_LEGACY','populate_patron_edit_profile_menu failed\n');
219         }
220 }
221
222 function set_patron_edit_profile_menu() {
223         var menuitem_id = 'profileitem' + PATRON.au.profile();
224         var menuitem = document.getElementById(
225                 menuitem_id
226         );
227         var profile_e = document.getElementById('patron_edit_system_profile_menulist');
228         if (profile_e) { profile_e.selectedItem = menuitem; }
229 }
230
231 function populate_patron_edit_ident_type_menu() {
232         try {
233                 populate_ident_types(
234                         'patron_edit_system_id1type_menulist',  
235                         'patron_edit_system_id1type_menupopup',
236                         '1'
237                 );
238         } catch(E) {
239                 mw.sdump('D_LEGACY','populate_patron_edit_ident_type_menu ERROR: ' + js2JSON(E) + '\n');
240                 //mw.sdump('D_LEGACY','populate_patron_edit_ident_type_menu failed\n');
241         }
242 }
243
244 function set_patron_edit_ident_type_menu() {
245         var menuitem_id = 'ident1item' + PATRON.au.ident_type();
246         var menuitem = document.getElementById(
247                 menuitem_id
248         );
249         var id1 = document.getElementById('patron_edit_system_id1type_menulist');
250         if (id1) { id1.selectedItem = menuitem; }
251 }
252
253 function populate_patron_edit_ident_type_menu2() {
254         try {
255                 populate_ident_types(
256                         'patron_edit_system_id2type_menulist',  
257                         'patron_edit_system_id2type_menupopup',
258                         '2'
259                 );
260         } catch(E) {
261                 //mw.sdump('D_LEGACY','populate_patron_edit_ident_type_menu2 ERROR: ' + js2JSON(E) + '\n');
262                 mw.sdump('D_LEGACY','populate_patron_edit_ident_type_menu2 failed\n');
263         }
264 }
265
266 function set_patron_edit_ident_type_menu2() {
267         var menuitem_id = 'ident2item' + PATRON.au.ident_type2();
268         var menuitem = document.getElementById(
269                 menuitem_id
270         );
271         var id2_e = document.getElementById('patron_edit_system_id2type_menulist');
272         if (id2_e) { id2_e.selectedItem = menuitem; }
273 }
274
275 function populate_patron_survey_grid(grid) {
276         if (typeof(grid) != 'object') {
277                 grid = document.getElementById(grid);
278         }
279         if (!grid) { return; }
280         var rows = grid.lastChild; if (!rows) { return; }
281         try {
282                 empty_widget( rows );
283                 // 'open-ils.circ.survey.required.retrieve',
284                 // 'open-ils.circ.survey.retrieve.all',
285                 var result = mw.user_request(
286                         'open-ils.circ',
287                         'open-ils.circ.survey.retrieve.required',
288                         [ mw.G.auth_ses[0] ]
289                 )[0];
290                 if (typeof(result) != 'object') { throw('survey.retrieve.all did not return an object'); }
291                 var desc_1 = new Object();
292                 var desc_3 = new Object();
293                 var survey_hash = new Object();
294                 for (var i in result) {
295                         var survey = result[i];
296                         survey_hash[ survey.id() ] = survey; 
297                         if ( (survey.required() == '0') && (survey.usr_summary() == '0') ) { continue; }
298                         mw.sdump('D_LEGACY','Survey: ' + survey.id() + ' : ' + survey.name() + '\n');
299                         var row = document.createElement('row');
300                         rows.appendChild(row);
301                         desc_1[ survey.id() ] = document.createElement('description');
302                                 desc_1[ survey.id() ].setAttribute('value', 'Not Taken');
303                         row.appendChild(desc_1[ survey.id() ]);
304                         var desc_2 = document.createElement('label');
305                                 desc_2.setAttribute('class','link');
306                                 desc_2.setAttribute('onclick','survey_test(event,' + survey.id() + ');');
307                         row.appendChild(desc_2);
308                         desc_2.setAttribute('value', survey.name() );
309                         desc_3[ survey.id() ] = document.createElement('description');
310                         row.appendChild(desc_3[ survey.id() ]);
311
312                         if (survey.required() == '1') {
313                                 row.setAttribute('hidden','false');
314                         } else {
315                                 row.setAttribute('hidden','true');
316                         }
317                         mw.sdump('D_LEGACY','creating desc_1: ' + desc_1 + '\n');
318                         var result2 = mw.user_async_request(
319                                 'open-ils.circ',
320                                 'open-ils.circ.survey.response.retrieve',
321                                 [ mw.G.auth_ses[0], survey.id(), PATRON.au.id() ],
322                                 function (request) {
323                                         var result2 = request.getResultObject();
324                                         mw.sdump('D_LEGACY','result2 = ' + js2JSON(result2) + '\n');
325                                         if (result2.length > 0) {
326                                                 var last_response = result2.pop();
327                                                 mw.sdump('D_LEGACY','desc_1 = ' + desc_1[ last_response.survey() ] + '\n');
328                                                 mw.sdump('D_LEGACY','effective_date = [' + last_response.effective_date() + ']  answer_date = [' + last_response.answer_date() + ']\n');
329                                                 var date = last_response.effective_date().substr(0,10);
330                                                 if (!date) { date = last_response.answer_date().substr(0,10); }
331                                                 var first_answer = '';
332                                                 try {
333                                                         first_answer = find_id_object_in_list(
334                                                                 find_id_object_in_list(
335                                                                         survey_hash[ last_response.survey() ].questions(),
336                                                                         last_response.question()
337                                                                 ).answers(),
338                                                                 last_response.answer()
339                                                         ).answer();
340                                                 } catch(E) {
341                                                         mw.sdump('D_LEGACY',js2JSON(E) + '\n');
342                                                 }
343                                                 desc_1[ last_response.survey() ].setAttribute('value', date);
344                                                 desc_3[ last_response.survey() ].setAttribute('value', first_answer);
345                                                 mw.sdump('D_LEGACY','desc_1 = ' + date + '\n');
346                                         }
347                                 }
348                         );
349                 }
350         } catch(E) {
351                 mw.sdump('D_LEGACY','populate_patron_edit_survey_grid ERROR: ' + js2JSON(E) + '\n');
352                 mw.handle_error(E);
353         }
354 }
355
356 function toggle_patron_survey_grid_rows(e,grid) {
357         var label = e.target.getAttribute('label');
358         var alt_label = e.target.getAttribute('alt_label');
359         e.target.setAttribute('label',alt_label);
360         e.target.setAttribute('alt_label',label);
361         toggle_hidden_grid_rows(grid);  
362 }
363
364 function retrieve_patron_by_barcode(barcode,method) {
365         if (!barcode) { barcode = PATRON.barcode(); }
366         mw.sdump('D_LEGACY','Entering PATRON.retrieve_patron() with barcode: ' + barcode + '\n');
367         //unregister_patron_window(this);
368         var result;
369         if (!method) method = 'open-ils.actor.user.fleshed.retrieve_by_barcode';
370         try {
371                 result = mw.user_request(
372                                 'open-ils.actor',
373                                 method,
374                                 [ mw.G.auth_ses[0], barcode ]
375                         );
376                 if (typeof(result[0]) != 'object') {
377                         mw.sdump('D_LEGACY','unexpected result1 : ' + typeof(result[0]) + ' : ' + js2JSON(result) + '\n');
378                         throw('unexpected result1 : ' + typeof(result[0]) + ' : ' + js2JSON(result) + '\n');
379                 }
380         } catch(E) {
381                 mw.sdump('D_LEGACY','error in search.actor.user.barcode\n' + js2JSON(E) + '\n');
382                 mw.handle_error(E);
383                 return false;
384         }
385         /*for (var i in result[0]) {
386                 var element = result[0][i];
387                 if (typeof(element) != 'function') {
388                         mw.sdump('D_LEGACY','Copying ' + i + ' to PATRON\n');
389                         PATRON[i] = element;
390                 }
391         }*/
392         PATRON.au = result[0];
393         //register_patron_window(this);
394         //PATRON.barcode = find_id_object_in_list(PATRON.au.cards(),PATRON.au.card()).barcode();
395         patron_callback('retrieve_patron');
396         return PATRON.related_refresh(PATRON.au.id());
397 }
398 PATRON.retrieve_patron_by_barcode = retrieve_patron_by_barcode;
399 PATRON.retrieve_patron = retrieve_patron_by_barcode;
400 PATRON.retrieve_via_method = retrieve_patron_by_barcode;
401 PATRON.refresh = retrieve_patron_by_barcode;
402
403 function get_barcode() {
404         try {
405                 //mw.sdump('D_LEGACY','PATRON.au.array.length = ' + PATRON.au.array.length + '\n');
406                 //mw.sdump('D_LEGACY','get_barcode: PATRON.au = ' + js2JSON(PATRON.au) + '\n.cards() = ' + js2JSON(PATRON.au.cards()) + '\n.card() = ' + js2JSON(PATRON.au.card()) + '\n');
407                 //return find_id_object_in_list(PATRON.au.cards(),PATRON.au.card()).barcode();
408                 return PATRON.au.card().barcode();
409         } catch(E) {
410                 mw.sdump('D_LEGACY','get_barcode() error == ' + js2JSON(E) + '\n');
411                 return '';
412         }
413 }
414 PATRON.barcode = get_barcode;
415
416 function validate_patron() {
417         //mw.sdump('D_LEGACY','validate_patron: PATRON.au = ' + js2JSON(PATRON.au) + '\nPATRON.au.array.length = ' + PATRON.au.array.length + '\n');
418         var s = '';
419         if ( PATRON.barcode() == 'REQUIRED') {
420                 if (!s) {
421                         var textbox = document.getElementById( 'patron_edit_system_barcode_textbox' );
422                         textbox.select(); textbox.focus();
423                 }
424                 s += ('Barcode required\n');
425         }
426         if ( ! PATRON.au.usrname() ) {
427                 if (!s) {
428                         var textbox = document.getElementById( 'patron_edit_system_usrname_textbox' );
429                         textbox.select(); textbox.focus();
430                 }
431                 s += ('Login Name required\n');
432         }
433
434         if ( ! PATRON.au.family_name() ) {
435                 if (!s) {
436                         var textbox = document.getElementById( 'patron_edit_system_family_name_textbox' );
437                         textbox.select(); textbox.focus();
438                 }
439                 s += ('Family Name required\n');
440         }
441         if ( ! PATRON.au.first_given_name() ) {
442                 if (!s) {
443                         var textbox = document.getElementById( 'patron_edit_system_first_given_name_textbox' );
444                         textbox.select(); textbox.focus();
445                 }
446                 s += ('First Given Name required\n');
447         }
448         if ( ! PATRON.au.ident_value() ) {
449                 if (!s) {
450                         var textbox = document.getElementById( 'patron_edit_system_id1value_textbox' );
451                         textbox.select(); textbox.focus();
452                 }
453                 s += ('Identification required\n');
454         }
455         if ( ! PATRON.au.dob() ) {
456                 if (!s) {
457                         var textbox = document.getElementById( 'patron_edit_system_dob_textbox' );
458                         textbox.select(); textbox.focus();
459                 }
460                 s += ('Date of Birth required\n');
461         }
462         if ( ! PATRON.au.mailing_address() ) {
463                 s += ('Mailing Address required\n');
464         }
465         if ( ! PATRON.au.billing_address() ) {
466                 s += ('Billing Address required\n');
467         }
468         if (s) {
469                 mw.sdump('D_LEGACY',s); alert(s); return false;
470         }
471         return true;
472 }
473
474 function backup_patron(P) {
475         backup_au = P.au.clone();
476 }
477
478 function restore_patron(P) {
479         P.au = backup_au.clone();
480         //hash_ac[ P.au.card() ] = find_id_object_in_list( P.au.cards(), P.au.card() );
481         hash_ac[ P.au.card().id() ] = P.au.card();
482         hash_au[ P.au.id() ] = P.au;
483 }
484
485 function save_patron() {
486         mw.sdump('D_LEGACY','Entering PATRON.save()\n\n=-=-=-=-=-=-=-=\n\n');
487         mw.sdump('D_LEGACY','PATRON.au = ' + js2JSON(PATRON.au) + '\n');
488         mw.sdump('D_LEGACY','PATRON.au.a.length = ' + PATRON.au.a.length + '\n\n');
489         //var backup_json = js2JSON(PATRON.au);
490         //mw.sdump('D_LEGACY','backup_json = ' + backup_json + '\n\n');
491         backup_patron(PATRON);
492         mw.sdump('D_LEGACY','\n\n=-=-=-=-=-=-=-=-=-=-\n\n');
493         check_for_new_addresses();
494         check_for_new_stat_cats();
495         if (! validate_patron() ) { 
496                 mw.sdump('D_LEGACY','restoring backup\n');
497                 restore_patron(PATRON);
498                 return false; 
499         }
500         if (! PATRON.au.usrname() ) { 
501                 PATRON.au.usrname( 
502                         PATRON.barcode()
503                 );
504         }
505         PATRON.au.survey_responses( response_list );
506         mw.sdump('D_LEGACY','before PATRON.au = ' + js2JSON(PATRON.au) + '\n');
507         var result;
508         try {
509                 result = mw.user_request(
510                                 'open-ils.actor',
511                                 'open-ils.actor.patron.update',
512                                 [ mw.G.auth_ses[0], PATRON.au ]
513                         );
514                 if (typeof(result[0]) != 'object') {
515                         mw.sdump('D_LEGACY','unexpected result1 : ' + typeof(result[0]) + ' : ' + js2JSON(result) + '\n');
516                         throw('unexpected result1 : ' + typeof(result[0]) + ' : ' + js2JSON(result) + '\n');
517                 }
518         } catch(E) {
519                 mw.sdump('D_LEGACY','error in \n' + js2JSON(E) + '\n');
520                 mw.sdump('D_LEGACY','restoring backup 2\n');
521                 restore_patron(PATRON);
522                 mw.handle_error(E);
523                 //mw.sdump('D_LEGACY','PATRON.au = ' + js2JSON(PATRON.au) + '\nPATRON.au.a.length = ' + PATRON.au.a.length + '\n');
524                 //PATRON.summary_refresh();
525                 return false;
526         }
527         PATRON.au = result[0];
528         if (! PATRON.au) { 
529                 mw.sdump('D_LEGACY','Restoring backup\n'); 
530                 restore_patron(PATRON);
531                 mw.handle_error('Save Failed'); 
532                 return; 
533         }
534         hash_aua = {};
535         response_list = [];
536         mw.sdump('D_LEGACY','after  PATRON.au = ' + js2JSON(PATRON.au) + '\n');
537         //PATRON.barcode = find_id_object_in_list(PATRON.au.cards(),PATRON.au.card()).barcode();
538         PATRON.summary_refresh();
539         patron_callback('save');
540         var refresh_result = PATRON.related_refresh(PATRON.au.id());
541         alert('Patron successfully updated.');
542         return refresh_result;
543 }
544 PATRON.save = save_patron;
545
546 function check_for_new_addresses() {
547         for (var id in hash_aua) {
548                 if ( (id < 0) && ( hash_aua[id].ischanged() ) ) {
549                         mw.sdump('D_LEGACY','Pushing new address\n');
550                         if (!PATRON.au.addresses()) { PATRON.au.addresses( [] ); }
551                         PATRON.au.addresses().push( hash_aua[id] );
552                 }
553         }
554 }
555
556 function check_for_new_stat_cats() {
557         var entries = new Array();
558         var grid = document.getElementById('patron_edit_stat_cat_grid');
559         var nl = grid.getElementsByTagName('menulist');
560         for (var i = 0; i < nl.length; i++) {
561                 var menulist = nl[i];
562                 if (menulist.getAttribute('original') != menulist.value) {
563                         var n_actscecm = new actscecm();
564                         var id = menulist.getAttribute('entry_id')
565                         //alert('check_for_new_stat_cats: id = ' + id );
566                         if (id) {
567                                 n_actscecm.ischanged('1');
568                                 n_actscecm.id( id );
569                         } else {
570                                 n_actscecm.isnew('1');
571                                 n_actscecm.id( new_id-- );
572                         }
573                         n_actscecm.stat_cat( menulist.getAttribute('stat_cat_id') );
574                         n_actscecm.stat_cat_entry( menulist.value );
575                         n_actscecm.target_usr( PATRON.au.id() );
576                         entries.push( n_actscecm );
577                 }
578
579         }
580         //alert( 'entries = ' + js2JSON( entries ) );
581         PATRON.au.stat_cat_entries( entries );
582 }
583
584 function retrieve_patron_related_info(id) {
585         if (!id) { id = PATRON.au.id(); }
586         mw.sdump('D_LEGACY','Entering PATRON.related_refresh() with id: ' + id + '\n');
587         /*
588         var checkouts = [];
589         if (id > 0) {
590                 try {
591                         checkouts = mw.user_request(
592                                 'open-ils.circ',
593                                 'open-ils.circ.actor.user.checked_out',
594                                 [ mw.G.auth_ses[0], id ]
595                         )[0];
596                 } catch(E) {
597                         mw.handle_error(E);
598                 }
599         }
600         PATRON.checkouts = checkouts;
601         PATRON.nearest_due = '';
602         for (var i in checkouts) {
603                 var checkout = checkouts[i];
604                 mw.sdump('D_LEGACY','checkout = ' + js2JSON(checkout) + '\n');
605         }
606         PATRON.holds = [];
607         PATRON.bills = [];
608         PATRON.summary_refresh();
609         try {
610                 //circ_init_list();
611         } catch(E) {
612                 mw.sdump('D_LEGACY',js2JSON(E) + '\n');
613         }
614         patron_callback('related_refresh');
615         */
616         return true;
617 }
618 PATRON.related_refresh = retrieve_patron_related_info;
619
620 /* patron_scan_overlay functions */
621
622 function patron_callback(s,params) {
623         try {
624                 switch(s) {
625                         case 'scan_submit' : return patron_scan_submit_callback(params); break;
626                         case 'related_refresh' : return patron_related_refresh_callback(params); break;
627                         case 'retrieve_patron' : return patron_retrieve_patron_callback(params); break;
628                         case 'save' : return patron_save_callback(params); break;
629                         default : return patron_default_callback(s,params); break;
630                 }
631         } catch(E) {
632                 /* assume no callback defined */
633                 return true;
634         }
635 }
636
637 function patron_advanced_button(ev) {
638         var deck = document.getElementById('patron_scan_deck');
639         if (deck) { deck.setAttribute('selectedIndex','2'); }
640         focus_widget( 'patron_search_family_name_textbox' );
641         deck = document.getElementById('circ_deck_deck');
642         if (deck) { deck.setAttribute('selectedIndex','6'); }
643         //PATRON.search = {};
644 }
645 PATRON.advanced_search = patron_advanced_button;
646
647 function patron_scan_submit(ev) {
648         mw.sdump('D_LEGACY','Entering PATRON.scan_submit() with target: ' + ev.target + '\n');
649         try {
650                 var rc = PATRON.retrieve_patron( document.getElementById('patron_scan_textbox').value );
651                 if (rc) {
652                         /* the PATRON object should already be updated.  Switch deck if there is one */
653                         var deck = document.getElementById('patron_scan_deck');
654                         if (deck) { deck.setAttribute('selectedIndex','1'); }
655                         patron_callback('scan_submit');
656                         /* enable the scan item widgets if there are some */
657                         enable_widgets(
658                                 'circ_checkout_scan_search_button',
659                                 'circ_checkout_scan_textbox',
660                                 'circ_checkout_scan_submit_button'
661                         );
662                         focus_widget( 'circ_checkout_scan_textbox' );
663                 } else {
664                         throw('retrieve_patron return code == false');
665                 }
666         } catch(E) {
667                 mw.sdump('D_LEGACY','Could not retrieve patron.  Invalid barcode?\n' + js2JSON(E) + '\n');
668                 alert('Could not retrieve patron.  Invalid barcode?\n' + js2JSON(E) + '\n');
669         }
670 }
671 PATRON.scan_submit = patron_scan_submit;
672
673 function patron_scan_search(ev) {
674         mw.sdump('D_LEGACY','Entering PATRON.scan_search() with target: ' + ev.target + '\n');
675         //mw.sdump('D_LEGACY','PATRON.search = ' + pretty_print(js2JSON(PATRON.search)) + '\n');
676         try {
677                 var result = mw.user_request(
678                         'open-ils.actor',
679                         'open-ils.actor.patron.search.advanced',
680                         [ mw.G.auth_ses[0], PATRON.search ]
681                 )[0];
682                 mw.sdump('D_LEGACY','result = ' + js2JSON(result) + '\n');
683                 PATRON['search_results'] = result;
684                 build_patron_search_result_deck();
685         } catch(E) {
686                 mw.handle_error(E);
687         }
688 }
689 PATRON.scan_search = patron_scan_search;
690
691 /* patron_summary_overlay functions */
692
693 function make_barcode_handler(card_id,user_id) {
694         return function (ev) {
695                 magic_field_edit(ev,'ac',card_id,'barcode');
696                 PATRON.au.ischanged('1');
697                 magic_field_edit(ev,'au',user_id,'usrname');
698                 var usr_e = document.getElementById('patron_edit_system_usrname_textbox');
699                 if (usr_e) {
700                         usr_e.value = ev.target.value;
701                 }
702                 /*ev.target.removeEventListener(
703                         "change",
704                         this,
705                         false
706                 );*/
707         }
708 }
709
710 function patron_summary_refresh(ev) {
711         //alert( mw.arg_dump(arguments) );
712         // This function needs to be broken up.. it sets the patron edit section as well
713         if (!PATRON.au) { return; }
714         mw.sdump('D_LEGACY','Entering PATRON.summary_refresh()\n');
715         hash_au[PATRON.au.id()] = PATRON.au;
716         //PATRON.barcode = find_id_object_in_list(PATRON.au.cards(),PATRON.au.card()).barcode();
717         /* just redraw the display with the PATRON object as is */
718         var barcode_e = document.getElementById('patron_edit_system_barcode_textbox');
719         if (barcode_e) {
720                 //var barcode_v = find_id_object_in_list(PATRON.au.cards(),PATRON.au.card());
721                 var barcode_v = PATRON.au.card();
722                 if (barcode_v) {
723                         barcode_e.value = barcode_v.barcode();
724                         if (barcode_e.value != 'REQUIRED') {
725                                 barcode_e.disabled = true;
726                         } else {
727                                 barcode_e.addEventListener(
728                                         "change",
729                                         make_barcode_handler(barcode_v.id(),PATRON.au.id()),
730                                         false
731                                 );
732                         }
733                 }
734         }
735         var usrname_e = document.getElementById('patron_edit_system_usrname_textbox');
736         if (usrname_e) {
737                 usrname_e.value = PATRON.au.usrname();
738                 usrname_e.setAttribute("onchange",
739                         "magic_field_edit(event,'au'," + PATRON.au.id() + ",'usrname');");
740         }
741         var passwd_e = document.getElementById('patron_edit_system_new_passwd_textbox');
742         if (passwd_e) {
743                 passwd_e.setAttribute("onchange",
744                         "magic_field_edit(event,'au'," + PATRON.au.id() + ",'passwd');");
745         }
746         var name_e = document.getElementById('patron_status_caption');
747         if (name_e) {
748                 var name = '';
749                 if (PATRON.au.prefix()) { name += PATRON.au.prefix() + ' '; }
750                 if (PATRON.au.family_name()) { name += PATRON.au.family_name() + ', '; }
751                 if (PATRON.au.first_given_name()) { name += PATRON.au.first_given_name() + ' '; }
752                 if (PATRON.au.second_given_name()) { name += PATRON.au.second_given_name() + ' '; }
753                 if (PATRON.au.suffix()) { name += PATRON.au.suffix(); }
754
755                 name_e.setAttribute('label',name);
756         }
757         name_e = document.getElementById('patron_edit_system_family_name_textbox');
758         if (name_e) {
759                 if (PATRON.au.family_name()) { name_e.value = PATRON.au.family_name(); }
760                 name_e.setAttribute("onchange","magic_field_edit(event,'au'," + PATRON.au.id() + ",'family_name');");
761         }
762         name_e = document.getElementById('patron_edit_system_first_given_name_textbox');
763         if (name_e) {
764                 if (PATRON.au.first_given_name()) { name_e.value = PATRON.au.first_given_name(); }
765                 name_e.setAttribute("onchange","magic_field_edit(event,'au'," + PATRON.au.id() + ",'first_given_name');");
766         }
767         name_e = document.getElementById('patron_edit_system_second_given_name_textbox');
768         if (name_e) {
769                 if (PATRON.au.second_given_name()) { name_e.value = PATRON.au.second_given_name(); }
770                 name_e.setAttribute("onchange","magic_field_edit(event,'au'," + PATRON.au.id() + ",'second_given_name');");
771         }
772         name_e = document.getElementById('patron_edit_system_prefix_menulist');
773         if (name_e) {
774                 if (PATRON.au.prefix()) { name_e.value = PATRON.au.prefix(); }
775                 name_e.setAttribute("oncommand","magic_field_edit(event,'au'," + PATRON.au.id() + ",'prefix');");
776         }
777         name_e = document.getElementById('patron_edit_system_suffix_menulist');
778         if (name_e) {
779                 if (PATRON.au.suffix()) { name_e.value = PATRON.au.suffix(); }
780                 name_e.setAttribute("oncommand","magic_field_edit(event,'au'," + PATRON.au.id() + ",'suffix');");
781         }
782         var profile_e = document.getElementById('patron_status_data_profile');
783         if (profile_e) {
784                 //profile_e.setAttribute('value',find_id_object_in_list(mw.G.ap_list, PATRON.au.profile() ).name() );
785                 profile_e.setAttribute('value',mw.G.ap_hash[ PATRON.au.profile() ].name() );
786         }
787         profile_e = document.getElementById('patron_edit_system_profile_menulist');
788         if (profile_e) {
789                 //hash_ap[PATRON.au.profile().id()] = PATRON.au.profile();
790                 profile_e.setAttribute("oncommand","magic_field_edit(event,'au'," + PATRON.au.id() + ",'profile');");
791                 set_patron_edit_profile_menu();
792         }
793         var email_e = document.getElementById('patron_edit_contact_email_textbox');
794         if (email_e) {
795                 email_e.value = PATRON.au.email();
796                 email_e.setAttribute("onchange","magic_field_edit(event,'au'," + PATRON.au.id() + ",'email');");
797         }
798         var dayphone_e = document.getElementById('patron_contact_dayphone_data');
799         if (dayphone_e) {
800                 dayphone_e.setAttribute('value', PATRON.au.day_phone() );
801         }
802         dayphone_e = document.getElementById('patron_edit_contact_dayphone_textbox');
803         if (dayphone_e) {
804                 dayphone_e.value = PATRON.au.day_phone();
805                 dayphone_e.setAttribute("onchange","magic_field_edit(event,'au'," + PATRON.au.id() + ",'day_phone');");
806         }
807         var eveningphone_e = document.getElementById('patron_contact_eveningphone_data');
808         if (eveningphone_e) {
809                 eveningphone_e.setAttribute('value', PATRON.au.evening_phone() );
810         }
811         eveningphone_e = document.getElementById('patron_edit_contact_eveningphone_textbox');
812         if (eveningphone_e) {
813                 eveningphone_e.value = PATRON.au.evening_phone();
814                 eveningphone_e.setAttribute("onchange","magic_field_edit(event,'au'," + PATRON.au.id() + ",'evening_phone');");
815         }
816         var otherphone_e = document.getElementById('patron_contact_otherphone_data');
817         if (otherphone_e) {
818                 otherphone_e.setAttribute('value', PATRON.au.other_phone() );
819         }
820         otherphone_e = document.getElementById('patron_edit_contact_otherphone_textbox');
821         if (otherphone_e) {
822                 otherphone_e.value = PATRON.au.other_phone();
823                 otherphone_e.setAttribute("onchange","magic_field_edit(event,'au'," + PATRON.au.id() + ",'other_phone');");
824         }
825         var standing_e = document.getElementById('patron_status_data_standing');
826         if (standing_e) {
827                 /*var standing = find_id_object_in_list( 
828                                 mw.G.cst_list,
829                                 PATRON.au.standing() 
830                         );*/
831                 var standing = mw.G.cst_hash[ PATRON.au.standing() ];
832                 mw.sdump('D_LEGACY','standing = ' + js2JSON(standing) + '\n');
833                 standing_e.setAttribute( 'value', standing.value() );
834                 if (standing.value() == 'Good') {
835                         add_css_class(standing_e,'good');
836                 } else {
837                         remove_css_class(standing_e,'good');    
838                 }
839         }
840         var claims_returned_e = document.getElementById('patron_status_data_claims_returned');
841         if (claims_returned_e) {
842                 claims_returned_e.setAttribute('value',PATRON.au.claims_returned_count());
843         }
844         var credit_e = document.getElementById('patron_status_data_credit');
845         if (credit_e) {
846                 credit_e.setAttribute('value',PATRON.au.credit_forward_balance());
847         }
848         var homelib_e = document.getElementById('patron_status_data_homelib');
849         if (homelib_e) {
850                 homelib_e.setAttribute('value', 
851                         find_ou(
852                                 mw.G.org_tree,
853                                 PATRON.au.home_ou()
854                         ).name()
855                 );
856         }
857         homelib_e = document.getElementById('patron_edit_system_library_menulist');
858         if (homelib_e) {
859                 homelib_e.setAttribute("oncommand","magic_field_edit(event,'au'," + PATRON.au.id() + ",'home_ou',false);");
860                 set_patron_edit_library_menu();
861         }
862         var fees_e = document.getElementById('patron_status_data_fees');
863         if (fees_e) {
864                 fees_e.setAttribute('value',PATRON.bills.length);
865         }
866         var checkouts_e = document.getElementById('patron_status_data_checkouts');
867         if (checkouts_e) {
868                 checkouts_e.setAttribute('value',PATRON.checkouts.length);
869         }
870         var holds_e = document.getElementById('patron_status_data_holds');
871         if (holds_e) {
872                 holds_e.setAttribute('value',PATRON.holds.length);
873         }
874         var nearest_due_e = document.getElementById('patron_status_data_nearest_due');
875         if (nearest_due_e) {
876                 nearest_due_e.setAttribute('value',PATRON.nearest_due);
877         }
878         var id1value_e = document.getElementById('patron_edit_system_id1value_textbox');
879         if (id1value_e) {
880                 id1value_e.setAttribute('value',PATRON.au.ident_value());
881                 id1value_e.setAttribute("onchange","magic_field_edit(event,'au'," + PATRON.au.id() + ",'ident_value');");
882         }
883         var id2value_e = document.getElementById('patron_edit_system_id2value_textbox');
884         if (id2value_e) {
885                 id2value_e.setAttribute('value',PATRON.au.ident_value2());
886                 id2value_e.setAttribute("onchange","magic_field_edit(event,'au'," + PATRON.au.id() + ",'ident_value2');");
887         }
888         var id1type_e = document.getElementById('patron_edit_system_id1type_menulist');
889         if (id1type_e) {
890                 id1type_e.setAttribute("oncommand","magic_field_edit(event,'au'," + PATRON.au.id() + ",'ident_type');");
891                 set_patron_edit_ident_type_menu(); 
892         }
893         var id2type_e = document.getElementById('patron_edit_system_id2type_menulist');
894         if (id2type_e) {
895                 id2type_e.setAttribute("oncommand","magic_field_edit(event,'au'," + PATRON.au.id() + ",'ident_type2');");
896                 set_patron_edit_ident_type_menu2();
897         }
898         var dob_e = document.getElementById('patron_edit_system_dob_textbox');
899         if (dob_e) {
900                 dob_e.setAttribute('value',PATRON.au.dob());
901                 dob_e.setAttribute("onchange","magic_field_edit(event,'au'," + PATRON.au.id() + ",'dob',false);");
902         }
903         //populate_patron_survey_grid('patron_survey_grid');
904         populate_patron_survey_grid('patron_edit_survey_grid');
905         populate_patron_edit_surveys();
906
907         var address_rows = document.getElementById('patron_contact_address_rows');
908         if (address_rows) {
909                 empty_widget(address_rows);
910                 var addresses = PATRON.au.addresses();
911                 for (var i in addresses) { 
912                         if (typeof(addresses[i])=='object') {
913                                 var address = addresses[i];
914                                 if (
915                                         (address.id() == PATRON.au.mailing_address()) ||
916                                         (address.id() == PATRON.au.billing_address())
917                                 ) {
918                                         //mw.sdump('D_LEGACY','address dump: ' + i + ' : ' + addresses[i] + '\n');
919                                         rows_append_address( address_rows, address, false );
920                                 }
921                         }
922                 }
923         }
924         address_rows = document.getElementById('patron_edit_address_rows');
925         if (address_rows) {
926                 empty_widget(address_rows);
927                 var addresses = PATRON.au.addresses();
928                 for (var i in addresses) { 
929                         if (typeof(addresses[i])=='object') {
930                                 //mw.sdump('D_LEGACY','address dump: ' + i + ' : ' + js2JSON(addresses[i]) + '\n');
931                                 rows_append_address( address_rows, addresses[i], true );
932                         }
933                 }
934                 var blank = new aua();
935                 blank.id( new_id-- );
936                 blank.isnew("1");
937                 blank.usr( PATRON.au.id() );
938                 /*if ( addresses.length == 0 ) {*/
939                 if (hash_aua.length == 0) {
940                         blank.address_type( 'REQUIRED' );
941                         blank.ischanged( "1" );
942                         PATRON.au.mailing_address( blank.id() );
943                         PATRON.au.billing_address( blank.id() );
944                 } else {
945                         blank.address_type( 'NEW' );
946                 }
947                 blank.city( 'CITY' );
948                 blank.country( 'USA' );
949                 blank.county( 'COUNTY' );
950                 blank.post_code( 'ZIP' );
951                 blank.state( 'GA' );
952                 blank.street1( 'STREET1' );
953                 blank.street2( 'STREET2' );
954                 rows_append_address( address_rows, blank , true );
955         }
956
957         var alert_message_e = document.getElementById('patron_edit_system_alert_message_textbox');
958         if (alert_message_e) {
959                 alert_message_e.setAttribute('value',PATRON.au.alert_message());
960                 alert_message_e.setAttribute("onchange","magic_field_edit(event,'au'," + PATRON.au.id() + ",'alert_message',false);");
961         }
962         var stat_cats_e = document.getElementById('patron_statcat_rows');
963         if (stat_cats_e) {
964                 try {
965                         empty_widget( stat_cats_e );
966                         for (var i = 0; i < PATRON.au.stat_cat_entries().length; i++) {
967
968                                 // fieldmapper
969                                 var entry = PATRON.au.stat_cat_entries()[i];
970                                 var stat_cat = mw.G.actsc_hash[ entry.stat_cat() ];
971
972                                 // build XUL
973                                 var row = document.createElement('row');
974                                 stat_cats_e.appendChild(row);
975                                 var sc_label = document.createElement('label');
976                                 row.appendChild(sc_label);
977                                 var sce_label = document.createElement('label');
978                                 row.appendChild(sce_label);
979
980                                 // set values
981                                 sc_label.setAttribute('value', stat_cat.name() );
982                                 sce_label.setAttribute('value', entry.stat_cat_entry() );
983                         }
984                 } catch(E) {
985                         mw.handle_error(E);
986                 }
987         }
988         stat_cats_e = document.getElementById('patron_edit_stat_cat_grid');
989         if (stat_cats_e) {
990                 //alert('stat_cats_e');
991                 try {
992                         //alert('in try');
993                         for (var i = 0; i < PATRON.au.stat_cat_entries().length; i++) {
994                                 var entry = PATRON.au.stat_cat_entries()[i];
995                                 //alert('entry = ' + js2JSON(entry) );
996                                 var stat_cat = entry.stat_cat();
997                                 if (typeof stat_cat == 'object') stat_cat = stat_cat.id();
998                                 var menulist = document.getElementById('menulist_stat_cat_' + stat_cat);
999                                 if (menulist) {
1000
1001                                         //alert('menulist');
1002
1003                                         menulist.value = entry.stat_cat_entry();
1004                                         menulist.setAttribute( 'original', menulist.value );
1005                                         menulist.setAttribute( 'entry_id', entry.id() );
1006                                         //alert('summary_refresh: entry.id() = ' + entry.id() );
1007
1008                                 }
1009                         }
1010                 } catch(E) {
1011                         mw.handle_error(E);
1012                 }
1013         }
1014         if (PATRON.au.alert_message()) {
1015                 snd_bad(); snd_bad();
1016                 s_alert(
1017                         'PATRON ALERT MESSAGE\n\n\n\n' +
1018                         PATRON.au.alert_message() +
1019                         '\n\n\n\nTo remove this alert permanently, Edit the patron and erase the message in "Alert Message".\n\n'
1020                 );
1021         }
1022 }
1023 PATRON.summary_refresh = patron_summary_refresh;
1024
1025 function rows_append_address( rows, address, edit ) {
1026
1027
1028         // patron_summary
1029
1030         //mw.sdump('D_LEGACY','Entering rows_append_address()\n');
1031         if (typeof(rows) != 'object') {
1032                 rows = document.getElementById(box);
1033         }
1034         if (typeof(rows) != 'object') {
1035                 mw.sdump('D_LEGACY','rows_append_address: could not find ' + rows + '\n');
1036                 alert('rows_append_address: could not find ' + rows + '\n');
1037                 return false;
1038         }
1039         var row = document.createElement('row');
1040                 //row.setAttribute('id','row_address_'+yesno(edit)+address.id());
1041                 hash_aua[ address.id() ] = address;
1042         rows.appendChild(row);
1043         var groupbox = document.createElement('groupbox');
1044                 if (edit) {
1045                         groupbox.setAttribute('id','groupbox_address_'+address.id());
1046                 } else {
1047                         groupbox.setAttribute('id','groupbox_summary_address_'+address.id());
1048                 }
1049                 groupbox.setAttribute('flex','1');
1050         row.appendChild(groupbox);
1051         var caption = document.createElement('caption');
1052                 var caption_string = address.address_type();
1053                 if ( PATRON.au.mailing_address() == address.id() ) {
1054                         caption_string = '(MAILING) ' + caption_string;
1055                 }
1056                 if ( PATRON.au.billing_address() == address.id() ) {
1057                         caption_string = '(PHYSICAL) ' + caption_string;
1058                 }
1059                 caption.setAttribute( 'label',caption_string );
1060         groupbox.appendChild(caption);
1061
1062         // patron_edit
1063
1064         if (edit) {
1065                 var hbox = document.createElement('hbox');
1066                 groupbox.appendChild(hbox);
1067                         var label = document.createElement('label');
1068                                 label.setAttribute('value','Type:');
1069                         hbox.appendChild(label);
1070                         var textbox = document.createElement('textbox');
1071                         textbox.setAttribute('size','20');
1072                         textbox.setAttribute("onchange","magic_field_edit(event,'aua'," + address.id() + ",'address_type');");
1073                         hbox.appendChild(textbox);
1074                                 textbox.value = address.address_type();
1075                         var label2 = document.createElement('label');
1076                                 label2.setAttribute('value','Physical:');
1077                         hbox.appendChild(label2);
1078                         var checkbox_billing = document.createElement('checkbox');
1079                                 checkbox_billing.setAttribute('group','billing');
1080                                 checkbox_billing.setAttribute('oncommand','radio_checkbox(event); PATRON.au.billing_address(' + address.id() + '); PATRON.au.ischanged("1");');
1081                         hbox.appendChild(checkbox_billing);
1082                         if ( PATRON.au.billing_address() == address.id() ) {
1083                                 checkbox_billing.checked = true;
1084                         }
1085                         var label3 = document.createElement('label');
1086                                 label3.setAttribute('value','Mailing:');
1087                         hbox.appendChild(label3);
1088                         var checkbox_mailing = document.createElement('checkbox');
1089                                 checkbox_mailing.setAttribute('group','mailing');
1090                                 checkbox_mailing.setAttribute('oncommand','radio_checkbox(event); PATRON.au.mailing_address(' + address.id() + '); PATRON.au.ischanged("1");');
1091                         hbox.appendChild(checkbox_mailing);
1092                         if ( PATRON.au.mailing_address() == address.id() ) {
1093                                 checkbox_mailing.checked = true;
1094                         }
1095                         var label4 = document.createElement('label');
1096                                 label4.setAttribute('value','Invalid:');
1097                         hbox.appendChild(label4);
1098                         var checkbox_invalid = document.createElement('checkbox');
1099                                 checkbox_invalid.setAttribute('oncommand','invalid_checkbox(event,' + address.id() + ');');
1100                         hbox.appendChild(checkbox_invalid);
1101                         mw.sdump('D_LEGACY','address ' + address.id() + ' valid = ' + address.valid() + '\n');
1102                         if ( address.valid() == '1' ) {
1103                                 checkbox_invalid.checked = false;
1104                         } else {
1105                                 checkbox_invalid.checked = true;
1106                         }
1107                         var label5 = document.createElement('spacer');
1108                                 label5.setAttribute('flex','1');
1109                         hbox.appendChild(label5);
1110                         if (address.id()>-1) {
1111                                 var label6 = document.createElement('button');
1112                                         label6.setAttribute('label','Delete');
1113                                         label6.setAttribute('alt_label','Un-Delete');
1114                                         label6.setAttribute('toggle','0');
1115                                         label6.setAttribute('oncommand','toggle_address(event,' + address.id() + ');');
1116                                 hbox.appendChild(label6);
1117                         }
1118         }
1119         var street1;
1120                 if (edit) {
1121                         street1 = document.createElement('textbox');
1122                         street1.setAttribute('size','40');
1123                         street1.setAttribute("onchange","magic_field_edit(event,'aua'," + address.id() + ",'street1');");
1124                 } else {
1125                         street1 = document.createElement('label');
1126                 }
1127                 street1.setAttribute( 'value',address.street1() );
1128         groupbox.appendChild(street1);
1129         var street2;
1130                 if (edit) {
1131                         street2 = document.createElement('textbox');
1132                         street2.setAttribute('size','40');
1133                         street2.setAttribute("onchange","magic_field_edit(event,'aua'," + address.id() + ",'street2');");
1134                 } else {
1135                         street2 = document.createElement('label');
1136                 }
1137                 street2.setAttribute( 'value',address.street2() );
1138         groupbox.appendChild(street2);
1139         var hbox = document.createElement('hbox');
1140         groupbox.appendChild(hbox);
1141                 var city;
1142                         if (edit) {
1143                                 city = document.createElement('textbox');
1144                                 city.setAttribute('size','20');
1145                                 city.setAttribute("onchange","magic_field_edit(event,'aua'," + address.id() + ",'city');");
1146                         } else {
1147                                 city = document.createElement('label');
1148                         }
1149                         city.setAttribute( 'value',address.city() );
1150                 hbox.appendChild(city);
1151                 var county;
1152                         if (edit) {
1153                                 county = document.createElement('textbox');
1154                                 county.setAttribute('size','20');
1155                                 county.setAttribute("onchange","magic_field_edit(event,'aua'," + address.id() + ",'county');");
1156                                 county.setAttribute( 'value',address.county() );
1157                         } else {
1158                                 county = document.createElement('label');
1159                                 county.setAttribute( 'value','(' + address.county() + '),');
1160                         }
1161                 hbox.appendChild(county);
1162                 if (!address.county()) {
1163                         if (!edit) {
1164                                 county.setAttribute( 'display', 'none' );
1165                                 city.setAttribute( 'value',address.city() + ',' );
1166                         }
1167                 }
1168                 var state;
1169                         if (edit) {
1170                                 state = document.createElement('textbox');
1171                                 state.setAttribute('size','2');
1172                                 state.setAttribute("onchange","magic_field_edit(event,'aua'," + address.id() + ",'state');");
1173                         } else {
1174                                 state = document.createElement('label');
1175                         }
1176                         state.setAttribute( 'value',address.state() );
1177                 hbox.appendChild(state);
1178                 var country;
1179                         if (edit) {
1180                                 country = document.createElement('textbox');
1181                                 country.setAttribute('size','3');
1182                                 country.setAttribute("onchange","magic_field_edit(event,'aua'," + address.id() + ",'country');");
1183                                 country.setAttribute( 'value',address.country() );
1184                         } else {
1185                                 country = document.createElement('label');
1186                                 country.setAttribute( 'value','(' + address.country() + '),');
1187                         }
1188                 hbox.appendChild(country);
1189                 var zip;
1190                         if (edit) {
1191                                 zip = document.createElement('textbox');
1192                                 zip.setAttribute('size','10');
1193                                 zip.setAttribute("onchange","magic_field_edit(event,'aua'," + address.id() + ",'post_code');");
1194                         } else {
1195                                 zip = document.createElement('label');
1196                         }
1197                         zip.setAttribute( 'value',address.post_code() );
1198                 hbox.appendChild(zip);
1199 }
1200
1201 function invalid_checkbox(e,id) {
1202         if (e.target.checked) {
1203                 mw.sdump('D_LEGACY','Marking address ' + id + ' invalid\n');
1204                 mw.sdump('D_LEGACY','\tbefore address: ' + js2JSON(hash_aua[id]) + '\n');
1205                 hash_aua[id].valid( '0' );
1206                 hash_aua[id].ischanged( '1' );
1207                 mw.sdump('D_LEGACY','\tafter  address: ' + js2JSON(hash_aua[id]) + '\n');
1208         } else {
1209                 mw.sdump('D_LEGACY','Marking address ' + id + ' valid\n');
1210                 mw.sdump('D_LEGACY','\tbefore address: ' + js2JSON(hash_aua[id]) + '\n');
1211                 hash_aua[id].valid( '1' );
1212                 hash_aua[id].ischanged( '1' );
1213                 mw.sdump('D_LEGACY','\tafter  address: ' + js2JSON(hash_aua[id]) + '\n');
1214         }
1215 }
1216
1217 function toggle_address(e,id) {
1218         var groupbox = document.getElementById('groupbox_address_' + id);
1219         //var address = find_id_object_in_list( hash_aua, id );
1220         var address = hash_aua[id];
1221         var button = e.target;
1222         var label = button.getAttribute('label');
1223         var alt_label = button.getAttribute('alt_label');
1224         button.setAttribute('label',alt_label);
1225         button.setAttribute('alt_label',label);
1226         var toggle = button.getAttribute('toggle');
1227         if (toggle == '0') {
1228                 button.setAttribute('toggle','1');
1229                 mw.sdump('D_LEGACY','original node = ' + js2JSON(address) + '\n');
1230                 add_css_class(groupbox,'deleted_address');
1231                 address.isdeleted('1');
1232                 mw.sdump('D_LEGACY','updated  node = ' + js2JSON(address) + '\n');
1233                 mw.sdump('D_LEGACY','PATRON.au.mailing_address() = ' + PATRON.au.mailing_address() + ' address.id() = ' + address.id() + '\n');
1234                 if (PATRON.au.mailing_address() == address.id() ) {
1235                         find_available_address_for('mailing_address');
1236                 }
1237                 mw.sdump('D_LEGACY','PATRON.au.billing_address() = ' + PATRON.au.billing_address() + ' address.id() = ' + address.id() + '\n');
1238                 if (PATRON.au.billing_address() == address.id() ) {
1239                         find_available_address_for('billing_address');
1240                 }
1241         } else {
1242                 button.setAttribute('toggle','0');
1243                 mw.sdump('D_LEGACY','original node = ' + js2JSON(address) + '\n');
1244                 remove_css_class(groupbox,'deleted_address');
1245                 address.isdeleted('0');
1246                 mw.sdump('D_LEGACY','updated  node = ' + js2JSON(address) + '\n');
1247         }
1248         var nl = groupbox.getElementsByTagName('textbox');
1249                 for (var i in nl) {
1250                         if (typeof(nl[i])=='object') {
1251                                 var t = nl[i];
1252                                 t.disabled = ! t.disabled;
1253                         }
1254                 }
1255 }
1256
1257 function find_available_address_for(which) {
1258         mw.sdump('D_LEGACY','entering find_avialable_address_for(' + which + ')\n');
1259         var addresses = PATRON.au.addresses();
1260         mw.sdump('D_LEGACY','considering existing addresses...\n');
1261         for (var i in addresses) {
1262                 var address = addresses[i];
1263                 mw.sdump('D_LEGACY','i = ' + i + ' addresses[i] = ' + js2JSON(address) + '\n');
1264                 if ( address.isdeleted() == '1') { continue; }
1265                 if ( (address.address_type() == 'NEW') && (address.id() < 0) ) {
1266                         address.address_type('REQUIRED');
1267                         address.ischanged( '1' );
1268                 }
1269                 mw.sdump('D_LEGACY','PATRON.au before = ' + js2JSON(PATRON.au) + '\n');
1270                 var command = 'PATRON.au.' + which + "( '" + address.id() + "' );";
1271                 mw.sdump('D_LEGACY', command + '\n' );
1272                 eval( command );
1273                 mw.sdump('D_LEGACY','PATRON.au after  = ' + js2JSON(PATRON.au) + '\n');
1274                 return true;
1275         }
1276         mw.sdump('D_LEGACY','considering old and new addresses...\n');
1277         for (var i in hash_aua) {
1278                 var address = hash_aua[i];
1279                 mw.sdump('D_LEGACY','i = ' + i + ' addresses[i] = ' + js2JSON(address) + '\n');
1280                 if ( address.isdeleted() == '1') { continue; }
1281                 if ( (address.address_type() == 'NEW') && (address.id() < 0) ) {
1282                         address.address_type('REQUIRED');
1283                         address.ischanged( '1' );
1284                 }
1285                 mw.sdump('D_LEGACY','PATRON.au before = ' + js2JSON(PATRON.au) + '\n');
1286                 var command = 'PATRON.au.' + which + "( '" + address.id() + "' );";
1287                 mw.sdump('D_LEGACY', command + '\n' );
1288                 eval( command );
1289                 mw.sdump('D_LEGACY','PATRON.au after  = ' + js2JSON(PATRON.au) + '\n');
1290                 return true;
1291         }
1292 }
1293
1294 function survey_test(ev,survey_id) {
1295
1296         document.getElementById('circ_deck_deck').setAttribute('selectedIndex','5');
1297         var vbox = document.getElementById('patron_survey_vbox');
1298         empty_widget( vbox ); 
1299         survey_render_with_results(
1300                 vbox,
1301                 survey_id,
1302                 function (survey) {
1303                         return PATRON.refresh();
1304                 }
1305         );
1306 }
1307
1308 function populate_patron_edit_surveys() {
1309         var vbox = document.getElementById('patron_edit_survey_vbox');
1310         if (!vbox) return;
1311
1312         mw.sdump('D_LEGACY','populate_patron_edit_surveys()\n');
1313
1314         empty_widget( vbox ); 
1315
1316         var surveys = [];
1317         try {
1318                 surveys = mw.user_request(
1319                         'open-ils.circ',
1320                         'open-ils.circ.survey.retrieve.required',
1321                         [ mw.G.auth_ses[0] ]
1322                 )[0];
1323         } catch(E) {
1324                 mw.handle_error(E);
1325         }
1326
1327         for (var i = 0; i < surveys.length; i++) {
1328                 var survey = surveys[i];
1329                 survey_render(
1330                         vbox,
1331                         survey.id(),
1332                         populate_patron_edit_surveys_build_callback( survey ),
1333                         null
1334                 );
1335         }
1336 }
1337
1338 function populate_patron_edit_surveys_build_callback( survey ) {
1339         return function (responses) {
1340                 for (var i in responses) {
1341                         response_list.push( responses[i] );
1342                 }
1343                 var nframe = document.getElementById('patron_survey_frame_'+survey.id());
1344                 nframe.hidden = true;
1345                 var complete = document.createElement('description');
1346                 complete.setAttribute('value',survey.name() + ' Complete');
1347                 nframe.parentNode.insertBefore( complete, nframe );
1348                 //nframe.contentWindow.document.body.innerHTML = '<h1>' + survey.name() + ' Complete</h1>';
1349                 return true;
1350         };
1351 }
1352
1353
1354 function survey_render(vbox,survey_id,commit_callback,submit_callback) {
1355         sdump('D_LEGACY',arg_dump(arguments));
1356         if (typeof(vbox) != 'object') { vbox = document.getElementById(vbox); }
1357         var frame = document.createElement('vbox');
1358         vbox.appendChild(frame);
1359         //frame.setAttribute('flex','1'); frame.setAttribute('src','data:text/html,<html><head><LINK href="http://spacely.georgialibraries.org/css/box.css" rel="stylesheet" type="text/css"><LINK href="http://spacely.georgialibraries.org/css/survey.css" rel="stylesheet" type="text/css"></head><body></body></html>');
1360         
1361         setTimeout(function(){
1362         /*var doc = frame.contentWindow.document;*/
1363         var doc = document;
1364         window.createAppElement = function (name) { return doc.createElementNS('http://www.w3.org/1999/xhtml','html:'+name); }
1365         window.createTextNode = function (value) { return doc.createTextNode(value); }
1366         Survey.retrieveById( 
1367                 mw.G.auth_ses[0] , 
1368                 survey_id,
1369                 function(sur) { 
1370                         sur.setUser( PATRON.au.id() ); 
1371                         if (submit_callback) sur.setSubmitCallback( submit_callback );
1372                         if (commit_callback) sur.commitCallback = commit_callback;
1373                         mw.sdump('D_LEGACY','survey id: ' + sur.survey.id() + '\n');
1374
1375                         var node = sur.getNode();
1376
1377                         try {
1378                                 dump( super_dump( node ) );
1379                         } catch(E) {
1380                                 dump( js2JSON(E) );
1381                         }
1382
1383                         frame.appendChild( node ); 
1384                         /*frame.setAttribute('style','height: ' + (30+doc.height) + 'px;');*/
1385                         frame.setAttribute('id','patron_survey_frame_' + sur.survey.id());
1386                 } 
1387         );
1388         },0);
1389 }
1390
1391 function survey_render_with_results(vbox,survey_id,callback) {
1392         sdump('D_LEGACY',arg_dump(arguments));
1393         if (typeof(vbox) != 'object') { vbox = document.getElementById(vbox); }
1394         var frame = document.createElement('vbox');
1395         vbox.appendChild(frame);
1396         //frame.setAttribute('id','patron_survey_frame'); 
1397         //frame.setAttribute('flex','1'); frame.setAttribute('src','data:text/html,<html><head><LINK href="http://spacely.georgialibraries.org/css/box.css" rel="stylesheet" type="text/css"><LINK href="http://spacely.georgialibraries.org/css/survey.css" rel="stylesheet" type="text/css"></head><body></body></html>');
1398         //var doc = frame.contentWindow.document;
1399         var doc = document;
1400         //HTMLdoc = doc;
1401         window.createAppElement = function (name) { return doc.createElementNS('http://www.w3.org/1999/xhtml','html:'+name); }
1402         window.createTextNode = function (value) { return doc.createTextNode(value); }
1403         Survey.retrieveById( 
1404                 mw.G.auth_ses[0] , 
1405                 survey_id,
1406                 function(sur) { 
1407                         sur.setUser( PATRON.au.id() ); 
1408                         sur.setSubmitCallback( callback );
1409                         mw.sdump('D_LEGACY','survey id: ' + sur.survey.id() + '\n');
1410                         frame.appendChild( sur.getNode() ); 
1411                         var span = doc.createElement('html:blockquote');
1412                         span.setAttribute('id','survey_response_' + sur.survey.id());
1413                         span.setAttribute('class','survey');
1414                         var warning = doc.createTextNode('Retrieving Responses...');
1415                         span.appendChild(warning);
1416                         frame.appendChild(span);
1417                         mw.user_async_request(
1418                                 'open-ils.circ',
1419                                 'open-ils.circ.survey.response.retrieve',
1420                                 [ mw.G.auth_ses[0], sur.survey.id(), PATRON.au.id() ],
1421                                 function (request) {
1422                                         result = request.getResultObject().reverse();
1423                                         span.removeChild( warning );
1424                                         if (result.length == 0) { return; }
1425                                         //span.appendChild( doc.createTextNode('Previous Responses:') );
1426                                         //span.appendChild( doc.createElement('html:br') );
1427                                         //span.setAttribute('style','border: black solid thin;');
1428                                         var num_of_q = sur.survey.questions().length;
1429                                         var current_q = 0;
1430                                         span.appendChild( doc.createTextNode(
1431                                                 'Previous Responses:'
1432                                         ) );
1433                                         span.appendChild( doc.createElement('html:br') );
1434                                         span.appendChild( doc.createElement('html:br') );
1435                                         var block;
1436                                         for (var i = 0; i < result.length; i++) {
1437                                                 if (++current_q > num_of_q) { current_q = 1; }
1438                                                 mw.sdump('D_LEGACY','current_q = ' + current_q + '  num_of_q = ' + num_of_q + '\n');
1439                                                 if (current_q == 1) {
1440                                                         block = doc.createElement('html:blockquote');
1441                                                         span.appendChild( doc.createTextNode(
1442                                                                 'Answer Date: ' + 
1443                                                                 result[i].answer_date() +
1444                                                                 ', Effective Date: ' + 
1445                                                                 result[i].effective_date()
1446                                                         ) );
1447                                                         span.appendChild( doc.createElement('html:br') );
1448                                                         span.appendChild(block);
1449                                                 }
1450                                                 block.appendChild(
1451                                                         doc.createTextNode(
1452                                                                 current_q + ') ' + 
1453                                                                 find_id_object_in_list(
1454                                                                         find_id_object_in_list(
1455                                                                                 sur.survey.questions(),
1456                                                                                 result[i].question()
1457                                                                         ).answers(),
1458                                                                         result[i].answer()
1459                                                                 ).answer() + ' '
1460                                                         )
1461                                                 );
1462                                         }
1463                                         span.appendChild( doc.createElement('html:br') );
1464                                         /*frame.setAttribute('style','height: ' + (30+doc.height) + 'px;');*/
1465                                 }
1466                         );
1467                 } 
1468         );
1469 }
1470
1471
1472 function handle_patron_search_textbox(ev,group) {
1473         var id = ev.target.getAttribute('id');
1474         var field = id.split(/_/).slice(2,-1).join('_');
1475         mw.sdump('D_LEGACY','field = ' + field + ' value = ' + ev.target.value + '\n');
1476         PATRON.search[field] = { 'value' : ev.target.value, 'group' : group };
1477 }
1478
1479 function build_patron_search_result_deck() {
1480         var label = document.getElementById('patron_search_results_label');
1481         if (label) {
1482                 var s = 'Found ' + PATRON.search_results.length + ' matches.  ';
1483                 if (PATRON.search_results.length > patron_hits_per_page) {
1484                         s += 'Displaying ' + patron_hits_per_page + ' per page:';
1485                 }
1486                 label.setAttribute('value',s);
1487         }
1488         var deck = document.getElementById('patron_search_results_deck');       
1489         if (!deck) return;
1490
1491         empty_widget(deck);
1492
1493         var patron_ids = PATRON.search_results.slice(0,patron_hits_per_page);
1494         PATRON.search_results = PATRON.search_results.slice(patron_hits_per_page);
1495         build_patron_search_result_page(deck,patron_ids,PATRON.search_results.length);
1496 }
1497
1498 function build_patron_search_result_page(deck,patron_ids,remaining) {
1499         mw.sdump('D_LEGACY','build_patron_search_result_page()\n');
1500         if (typeof(deck)!='object') deck = document.getElementById(deck);
1501         if (!deck) return;
1502
1503         if (patron_ids.length == 0) return;
1504
1505         var vbox = document.createElement('vbox');
1506         deck.appendChild(vbox);
1507         vbox.setAttribute('flex','1');
1508
1509         var idx = deck.childNodes.length - 1;
1510         deck.selectedIndex = idx;
1511
1512         var button_box = document.createElement('hbox');
1513         vbox.appendChild(button_box);
1514
1515         var back_button = document.createElement('button');
1516         button_box.appendChild(back_button);
1517         back_button.setAttribute('label','Previous');
1518         back_button.disabled = true;
1519         if (idx > 0) {
1520                 back_button.disabled = false;
1521                 back_button.setAttribute('oncommand',"var deck = document.getElementById('patron_search_results_deck'); deck.selectedIndex = deck.selectedIndex -1;");
1522         }
1523         var forward_button = document.createElement('button');
1524         button_box.appendChild(forward_button);
1525         forward_button.setAttribute('label','Next');
1526         forward_button.disabled = true;
1527         if (remaining > 0) {
1528                 forward_button.disabled = false;
1529                 forward_button.addEventListener(
1530                         'command',
1531                         function (ev) {
1532                                 var fired = ev.target.getAttribute('fired');
1533
1534                                 if (fired) {
1535                                         deck.selectedIndex = idx + 1;
1536                                 } else {
1537                                         var next_ids = PATRON.search_results.slice(0,patron_hits_per_page);
1538                                         PATRON.search_results = PATRON.search_results.slice(patron_hits_per_page);
1539                                         build_patron_search_result_page(deck,next_ids,PATRON.search_results.length);
1540                                         ev.target.setAttribute('fired',true);
1541                                 }
1542                         },
1543                         false
1544                 );
1545         }
1546         var tree = document.createElement('tree');
1547         vbox.appendChild(tree);
1548         tree.setAttribute('flex','1');
1549         tree.setAttribute('enableColumnDrag','true');
1550         tree.addEventListener(
1551                 'select',
1552                 function (ev) {
1553                         var row = get_list_from_tree_selection(ev.target)[0];
1554                         if (row) {
1555                                 var patron_id = row.getAttribute('patron_id');
1556                                 if (patron_id) {
1557                                         PATRON.retrieve_via_method( patron_id, 'open-ils.actor.user.fleshed.retrieve' );
1558                                         circ_init();
1559                                         set_decks( { 'patron_scan_deck' : '1' } );
1560                                         focus_widget( row.parentNode );
1561                                 }
1562                         }
1563                 },
1564                 false
1565         );
1566
1567         var t_columns = document.createElement('treecols');
1568         tree.appendChild(t_columns);
1569
1570         for (var i = 0; i < patron_list_columns.length; i++) {
1571                 var column = patron_list_columns[i];
1572                 var t_column = document.createElement('treecol');
1573                 t_columns.appendChild( t_column );
1574                 t_column.setAttribute('label', column.v);
1575                 if (column.s) {
1576                         t_column.setAttribute('id', 'tc_' + column.s + '_' + column.f);
1577                 } else {
1578                         t_column.setAttribute('id', 'tc_' + column.f);
1579                 }
1580                 t_column.setAttribute('flex', '0');
1581                 try {
1582                         if (column.primary) {
1583                                 t_column.setAttribute('primary','true');
1584                                 t_column.setAttribute('flex','1');
1585                         }
1586                         if (column.hidden) t_column.setAttribute('hidden','true');
1587                 } catch(E) {
1588                         mw.sdump('D_LEGACY',js2JSON(E) + '\n');
1589                 }
1590                 t_column.setAttribute('field',column.f);
1591                 if (i != (patron_list_columns.length - 1) ) {
1592                         var t_splitter = document.createElement('splitter');
1593                         t_columns.appendChild( t_splitter );
1594                         t_splitter.setAttribute('class','tree-splitter');
1595                 }
1596         }
1597         var t_children = document.createElement('treechildren');
1598         tree.appendChild(t_children);
1599
1600         for (var i = 0; i < patron_ids.length; i++) {
1601                 var t_item = document.createElement('treeitem');
1602                 t_children.appendChild( t_item );
1603                 t_item.setAttribute('patron_id',patron_ids[i]);
1604
1605                 var t_row = document.createElement('treerow');
1606                 t_item.appendChild( t_row );
1607                 t_row.setAttribute('patron_id',patron_ids[i]);
1608
1609                 //var t_cell = document.createElement('treecell');
1610                 //t_row.appendChild( t_cell );
1611                 //t_cell.setAttribute('label',patron_ids[i]);
1612
1613                 mw.user_async_request(
1614                         'open-ils.actor',
1615                         'open-ils.actor.user.fleshed.retrieve', 
1616                         [ mw.G.auth_ses[0], patron_ids[i] ],
1617                         build_patron_retrieve_for_search_callback( t_row )
1618                 );
1619                 mw.sdump('D_LEGACY','Making call... count = ' + counter_incr('patron_call') + '\n');
1620         }
1621         
1622 }
1623
1624 function build_patron_retrieve_for_search_callback(treerow) {
1625         return function (request) {
1626                 mw.sdump('D_LEGACY','Running callback... count = ' + counter_incr('patron_callback') + '\n');
1627                 var result = request.getResultObject();
1628                 mw.sdump('D_LEGACY','Result = ' + js2JSON(result) + '\n');
1629
1630                 for (var i = 0; i < patron_list_columns.length; i++) {
1631                         var column = patron_list_columns[i];
1632                         var t_cell = document.createElement('treecell');
1633                         treerow.appendChild(t_cell);
1634                         var expression;
1635                         if (column.s) {
1636                                 switch(column.s) {
1637                                         case 'home_ou':
1638 expression = 'mw.G.org_tree_hash[ result.home_ou() ].' + column.f + '()';
1639                                         break;
1640                                         case 'mailing_address':
1641 expression = 'find_id_object_in_list( result.addresses() , result.mailing_address() ).' + column.f + '()';
1642                                         break;
1643                                         case 'billing_address':
1644 expression = 'find_id_object_in_list( result.addresses() , result.billing_address() ).' + column.f + '()';
1645                                         break;
1646                                 }
1647                         } else {
1648                                 expression = 'result.' + column.f + '()';
1649                         }
1650                         //mw.sdump('D_LEGACY','Trying to eval: ' + expression + '\n');
1651                         t_cell.setAttribute(
1652                                 'label',
1653                                 eval( expression )
1654                         );
1655                 }
1656         };
1657 }
1658
1659