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