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