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