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