]> git.evergreen-ils.org Git - Evergreen.git/blob - Evergreen/staff_client/chrome/content/evergreen/patron/patron_display.js
correct template and screen redraw correction
[Evergreen.git] / Evergreen / staff_client / chrome / content / evergreen / patron / patron_display.js
1 sdump('D_TRACE','Loading patron_display.js\n');
2
3 function patron_display_init(p) {
4         sdump('D_PATRON_DISPLAY',"TESTING: patron_display.js: " + mw.G['main_test_variable'] + '\n');
5         sdump('D_CONSTRUCTOR',arg_dump(arguments));
6
7         // gives: p.clamshell, p.right_panel, p.left_panel
8         patron_display_clamshell_init(p);
9
10         // gives: p.patron_items, p.redraw_patron_items
11         patron_display_patron_items_init(p);
12
13         // gives: p.patron_checkout_items, p.redraw_patron_checkout_items
14         patron_display_patron_checkout_items_init(p);
15
16         // gives: p.patron_holds, p.redraw_patron_holds
17         patron_display_patron_holds_init(p);
18
19         // gives: p.patron_bills, p.redraw_patron_bills
20         patron_display_patron_bills_init(p);
21
22         // gives: p.patron_edit, p.redraw_patron_edit
23         patron_display_patron_edit_init(p);
24
25         p.set_patron = function (au) {
26                 p.patron_edit._patron = au;
27                 return p._patron = au;
28         }
29
30         p.display_patron = function (exceptions) {
31                 if (!exceptions) exceptions = {};
32                 if (!exceptions.all) {
33                         if (!exceptions.patron_checkout_items) p.redraw_patron_checkout_items();
34                         if (!exceptions.patron_items) p.redraw_patron_items();
35                         if (!exceptions.patron_holds) p.redraw_patron_holds();
36                         if (!exceptions.patron_bills) p.redraw_patron_bills();
37                         //if (!exceptions.patron_edit) p.redraw_patron_edit();
38                 }
39                 return render_fm(p.w.document, { 'au' : p._patron });
40         }
41         p.redraw = p.display_patron;
42
43         p.retrieve_patron_via_barcode = function (barcode) {
44                 if (!barcode) barcode = patron_get_barcode( p._patron );
45                 p.set_patron( retrieve_patron_by_barcode( barcode ) );
46                 return p.display_patron( {} );
47         }
48
49         p.retrieve_patron_via_id = function (id, exceptions) {
50                 p.set_patron( retrieve_patron_by_id( id ) );
51                 return p.display_patron(exceptions);
52         }
53
54         p.refresh = function(exceptions) {
55                 if (p._patron) p.retrieve_patron_via_id( p._patron.id(), exceptions );
56         }
57
58         set_patron_display_widgets(p);
59
60         if (p.patron) {
61                 if (typeof(p.patron) == 'object') {
62                         //p._patron = p.patron;
63                         p.set_patron( p.patron );
64                         p.display_patron();
65                 } else
66                         p.retrieve_patron_via_barcode( p.patron );
67         }
68
69         sdump('D_TRACE_EXIT',arg_dump(arguments));
70         return p;
71 }
72
73 function set_patron_display_widgets(p) {
74         p.commandset_node.getElementsByAttribute('id','cmd_patron_refresh')[0].addEventListener(
75                 'command',
76                 function (ev) {
77                         p.refresh();
78                 },
79                 false
80         );
81
82         function gen_func(i) {
83                 // because otherwise i would be 5 for each closure
84                 return function(ev) {
85                         p.clamshell.set_second_deck(i);
86                 };
87         }
88         var cmds = [ 'cmd_patron_checkout', 'cmd_patron_items', 'cmd_patron_holds', 
89                 'cmd_patron_bills', 'cmd_patron_edit', 'cmd_patron_info' ]
90         for (var i in cmds) {
91                 p.commandset_node.getElementsByAttribute('id',cmds[i])[0].addEventListener(
92                         'command',
93                         gen_func(i),
94                         false
95                 );
96         }
97         p.commandset_node.getElementsByAttribute('id','cmd_patron_checkout')[0].addEventListener(
98                 'command',
99                 function () {
100                         focus_widget( p.w.document, 'patron_checkout_barcode_entry_textbox' );
101                 },
102                 false
103         );
104         p.commandset_node.getElementsByAttribute('id','cmd_patron_bills')[0].addEventListener(
105                 'command',
106                 function () {
107                         focus_widget( p.w.document, 'bill_payment_amount_textbox' );
108                 },
109                 false
110         );
111         p.commandset_node.getElementsByAttribute('id','cmd_patron_edit')[0].addEventListener(
112                 'command',
113                 function () {
114                         p.redraw_patron_edit();
115                 },
116                 false
117         );
118
119
120
121
122 }
123
124
125 function patron_display_clamshell_init(p) {
126         p.clamshell = clam_shell_init( { 'w' : p.w, 'node' : p.clamshell_node, 'debug' : p.app } );
127         p.left_panel = p.clamshell.first_deck;
128         p.right_panel = p.clamshell.second_deck;
129 }
130
131 function patron_display_patron_items_init(p) {
132         p.patron_items = patron_items_init( { 'w' : p.w, 'node' : p.patron_items_node, 'debug' : p.app } );
133
134         p.w.document.getElementById('item_print').addEventListener(
135                 'command',
136                 function(ev) {
137                         var params = { 
138                                 'au' : p._patron, 
139                                 'lib' : mw.G.user_ou,
140                                 'staff' : mw.G.user,
141                                 'header' : mw.G.itemsout_header,
142                                 'line_item' : mw.G.itemsout_line_item,
143                                 'footer' : mw.G.itemsout_footer
144                         };
145                         mw.print_itemsout_receipt( params );
146                 }, false
147         );
148
149         p.redraw_patron_items = function() {
150                 p.patron_items.clear_patron_items();
151                 if (!p._patron.checkouts()) patron_get_checkouts( p._patron );
152                 for (var i = 0; i < p._patron.checkouts().length; i++) {
153                         p.patron_items.add_patron_items( [ i ] );
154                 }
155         }
156
157         p.patron_items.register_patron_items_select_callback(
158                 function (ev) {
159                         sdump('D_PATRON_DISPLAY','Firing patron_items_select_callback\n');
160                         sdump('D_PATRON_DISPLAY','ev.target = ' + ev.target + '\n');
161                         var patron_items = get_list_from_tree_selection( p.patron_items.paged_tree.tree );
162                         /* grab cover art for selected item? */
163                 }
164         );
165         p.patron_items.register_flesh_patron_items_function(
166                 function (treeitem) {
167                         sdump('D_PATRON_DISPLAY','Firing flesh_patron_items_function\n');
168                         var record_id = treeitem.getAttribute('record_id'); 
169                         p.patron_items.map_patron_items_to_cols( p._patron.checkouts()[ record_id ], treeitem );
170                 }
171         );
172         p.patron_items.register_item_context_builder(
173                 function (ev) {
174                         sdump('D_PATRON_DISPLAY','Firing context_builder for patron_items\n');
175                         sdump('D_PATRON_DISPLAY','ev.target = ' + ev.target + '\np.patron_items.paged_tree.popup = ' + p.patron_items.paged_tree.popup + '\n');
176                         empty_widget(p.patron_items.paged_tree.popup);
177                         var patron_items = get_list_from_tree_selection( p.patron_items.paged_tree.tree );
178                         sdump('D_PATRON_DISPLAY','patron_items.length = ' + patron_items.length + '\n');
179
180                         /*** RENEW ***/
181                         var menuitem_pi_r = p.patron_items.paged_tree.w.document.createElement('menuitem');
182                         p.patron_items.paged_tree.popup.appendChild( menuitem_pi_r );
183                         menuitem_pi_r.setAttribute('label',getString('circ.context_renew'));
184                         menuitem_pi_r.addEventListener(
185                                 'command',
186                                 function (ev) {
187                                         sdump('D_PATRON_DISPLAY','Firing renew context for patron_items\n');
188                                         for (var i = 0; i < patron_items.length; i++) {
189                                                 try {
190                                                         var idx = patron_items[i].getAttribute('record_id'); 
191                                                         var circ = p._patron.checkouts()[ idx ].circ;
192                                                         alert( js2JSON(renew_by_circ_id( circ.id() )) );
193                                                         p.refresh();
194                                                 } catch(E) {
195                                                         alert(E);
196                                                 }
197                                         }
198                                 },
199                                 false
200                         );
201
202                         /*** CHECKIN ***/
203                         var menuitem_pi_c = p.patron_items.paged_tree.w.document.createElement('menuitem');
204                         p.patron_items.paged_tree.popup.appendChild( menuitem_pi_c );
205                         menuitem_pi_c.setAttribute('label',getString('circ.context_checkin'));
206                         menuitem_pi_c.addEventListener(
207                                 'command',
208                                 function (ev) {
209                                         sdump('D_PATRON_DISPLAY','Firing checkin context for patron_items\n');
210                                         for (var i = 0; i < patron_items.length; i++) {
211                                                 try {
212                                                         var idx = patron_items[i].getAttribute('record_id'); 
213                                                         var copy = p._patron.checkouts()[ idx ].copy;
214                                                         checkin_by_copy_barcode( copy.barcode(), null );
215                                                         p.refresh();
216                                                 } catch(E) {
217                                                         alert(E);
218                                                 }
219                                         }
220                                 },
221                                 false
222                         );
223
224                         /* separator */
225                         var menuitem_pi_s = p.patron_items.paged_tree.w.document.createElement('menuseparator');
226                         p.patron_items.paged_tree.popup.appendChild( menuitem_pi_s );
227                         
228
229                         /*** COPY EDITOR ***/
230                         var menuitem_pi_ce = p.patron_items.paged_tree.w.document.createElement('menuitem');
231                         p.patron_items.paged_tree.popup.appendChild( menuitem_pi_ce );
232                         menuitem_pi_ce.setAttribute('label',getString('circ.context_edit'));
233                         menuitem_pi_ce.addEventListener(
234                                 'command',
235                                 function (ev) {
236                                         sdump('D_PATRON_DISPLAY','Firing copy editor context for patron_items\n');
237                                         for (var i = 0; i < patron_items.length; i++) {
238                                                 sdump('D_PATRON_DISPLAY','Firing copy edit context\n');
239                                         }
240                                 },
241                                 false
242                         );
243
244                         /*** OPAC ***/
245                         var menuitem_pi_o = p.patron_items.paged_tree.w.document.createElement('menuitem');
246                         p.patron_items.paged_tree.popup.appendChild( menuitem_pi_o );
247                         menuitem_pi_o.setAttribute('label',getString('circ.context_opac'));
248                         menuitem_pi_o.addEventListener(
249                                 'command',
250                                 function (ev) {
251                                         sdump('D_PATRON_DISPLAY','Firing opac context for patron_items\n');
252                                         for (var i = 0; i < patron_items.length; i++) {
253                                                 sdump('D_PATRON_DISPLAY','Firing opac context\n');
254                                         }
255                                 },
256                                 false
257                         );
258                         
259                 }
260         );
261 }
262
263 function patron_display_patron_checkout_items_init(p) {
264         p.patron_checkout_items = patron_checkout_items_init( { 'w' : p.w, 'node' : p.patron_checkout_items_node, 'debug' : p.app } );
265         var tb = p.patron_checkout_items_node.getElementsByAttribute('id','patron_checkout_barcode_entry_textbox')[0];
266         var submit_button = p.patron_checkout_items_node.getElementsByAttribute('id','patron_checkout_submit_barcode_button')[0];
267
268         var checkouts = [];
269
270         function print_receipt() {
271                 p._patron._current_checkouts = checkouts;
272                 var params = { 
273                         'au' : p._patron, 
274                         'lib' : mw.G.user_ou,
275                         'staff' : mw.G.user,
276                         'header' : mw.G.checkout_header,
277                         'line_item' : mw.G.checkout_line_item,
278                         'footer' : mw.G.checkout_footer
279                 };
280                 mw.print_checkout_receipt( params );
281         }
282
283         p.w.document.getElementById('checkout_print').addEventListener( 'command',print_receipt, false);
284
285         p.w.document.getElementById('checkout_done').addEventListener(
286                 'command',
287                 function () {
288                         print_receipt(); checkouts = []; p.display_patron(); tb.focus();
289                 },
290                 false
291         );
292         p.attempt_checkout = function(barcode) {
293                 try {
294                         //if (! is_barcode_valid(barcode) ) throw('Invalid Barcode');
295                         var permit_check = checkout_permit( barcode, p._patron.id(), 0 );
296                         if (permit_check.status == 0) {
297                                 var check = checkout_by_copy_barcode( barcode, p._patron.id() );
298                                 if (check) {
299                                         checkouts.push( check );
300                                         p.patron_checkout_items.add_checkout_items( [ checkouts.length - 1 ] );
301                                         var temp = p._patron.checkouts();
302                                         temp.push( check );
303                                         p._patron.checkouts( temp );
304                                         render_fm(p.w.document, { 'au' : p._patron }); // p.display_patron();
305                                         p.redraw_patron_items();
306                                         tb.value = '';
307                                 }
308                         } else {
309                                 throw(permit_check.text);
310                         }
311                 } catch(E) {
312                         tb.select();
313                         if (typeof(E) == 'object') {
314                                 handle_error(E,true);
315                         } else {
316                                 s_alert(E);
317                         }
318                 }
319                 tb.focus();
320         }
321
322         tb.addEventListener(
323                 'keypress',
324                 function(ev) {
325                         if (ev.keyCode == 13 || ev.keyCode == 77 ) { p.attempt_checkout( tb.value ); }
326                 },
327                 false
328         );
329         submit_button.addEventListener(
330                 'command',
331                 function(ev) {
332                         p.attempt_checkout( tb.value );
333                 },
334                 false
335         );
336
337         p.redraw_patron_checkout_items = function() {
338                 p.patron_checkout_items.clear_checkout_items();
339                 for (var i = 0; i < checkouts.length; i++) {
340                         p.patron_checkout_items.add_checkout_items( [ i ] );
341                 }
342         }
343
344         p.patron_checkout_items.register_patron_checkout_items_select_callback(
345                 function (ev) {
346                         sdump('D_PATRON_DISPLAY','Firing patron_checkout_items_select_callback\n');
347                         sdump('D_PATRON_DISPLAY','ev.target = ' + ev.target + '\n');
348                         var patron_checkout_items = get_list_from_tree_selection( p.patron_checkout_items.paged_tree.tree );
349                         /* grab cover art for selected item? */
350                 }
351         );
352         p.patron_checkout_items.register_flesh_patron_checkout_items_function(
353                 function (treeitem) {
354                         sdump('D_PATRON_DISPLAY','Firing flesh_patron_checkout_items_function\n');
355                         var record_id = treeitem.getAttribute('record_id'); 
356                         p.patron_checkout_items.map_patron_checkout_items_to_cols( checkouts[ record_id ], treeitem );
357                 }
358         );
359         p.patron_checkout_items.register_checkout_context_builder(
360                 function (ev) {
361                         sdump('D_PATRON_DISPLAY','Firing context_builder for patron_checkout_items\n');
362                         sdump('D_PATRON_DISPLAY','ev.target = ' + ev.target + '\np.patron_checkout_items.paged_tree.popup = ' + p.patron_checkout_items.paged_tree.popup + '\n');
363                         empty_widget(p.patron_checkout_items.paged_tree.popup);
364                         var patron_checkout_items = get_list_from_tree_selection( p.patron_checkout_items.paged_tree.tree );
365
366                         /*** CHECKIN ***/
367                         var menuitem_pci_c = p.patron_checkout_items.paged_tree.w.document.createElement('menuitem');
368                         p.patron_checkout_items.paged_tree.popup.appendChild( menuitem_pci_c );
369                         menuitem_pci_c.setAttribute('label',getString('circ.context_checkin'));
370                         menuitem_pci_c.addEventListener(
371                                 'command',
372                                 function (ev) {
373                                         sdump('D_PATRON_DISPLAY','Firing checkin context for patron_checkout_items\n');
374                                         var keep_these = [];
375                                         for (var i = 0; i < patron_checkout_items.length; i++) {
376                                                 try {
377                                                         var idx = patron_checkout_items[i].getAttribute('record_id'); 
378                                                         var copy = checkouts[ idx ].copy;
379                                                         var status = checkin_by_copy_barcode( copy.barcode(), null );
380                                                         if (status == null) { // change this to whatever it takes
381                                                                 keep_these.push( checkouts[ idx ] );    
382                                                         }
383                                                         checkouts = keep_these;
384                                                         alert( js2JSON( status ) );
385                                                         p.refresh();
386                                                 } catch(E) {
387                                                         alert(E);
388                                                 }
389                                         }
390                                 },
391                                 false
392                         );
393
394                         /* separator */
395                         var menuitem_pci_s = p.patron_checkout_items.paged_tree.w.document.createElement('menuseparator');
396                         p.patron_checkout_items.paged_tree.popup.appendChild( menuitem_pci_s );
397                         
398
399                         /*** COPY EDITOR ***/
400                         var menuitem_pci_ce = p.patron_checkout_items.paged_tree.w.document.createElement('menuitem');
401                         p.patron_checkout_items.paged_tree.popup.appendChild( menuitem_pci_ce );
402                         menuitem_pci_ce.setAttribute('label',getString('circ.context_edit'));
403                         menuitem_pci_ce.addEventListener(
404                                 'command',
405                                 function (ev) {
406                                         sdump('D_PATRON_DISPLAY','Firing copy editor context for patron_checkout_items\n');
407                                         for (var i = 0; i < patron_checkout_items.length; i++) {
408                                                 var idx = patron_checkout_items[i].getAttribute('record_id');
409                                                 sdump('D_PATRON_DISPLAY','Firing copy edit context\n');
410                                         }
411                                 },
412                                 false
413                         );
414
415                         /*** OPAC ***/
416                         var menuitem_pci_o = p.patron_checkout_items.paged_tree.w.document.createElement('menuitem');
417                         p.patron_checkout_items.paged_tree.popup.appendChild( menuitem_pci_o );
418                         menuitem_pci_o.setAttribute('label',getString('circ.context_opac'));
419                         menuitem_pci_o.addEventListener(
420                                 'command',
421                                 function (ev) {
422                                         sdump('D_PATRON_DISPLAY','Firing opac context for patron_checkout_items\n');
423                                         for (var i = 0; i < patron_checkout_items.length; i++) {
424                                                 var idx = patron_checkout_items[i].getAttribute('record_id');
425                                                 sdump('D_PATRON_DISPLAY','Firing opac context\n');
426                                         }
427                                 },
428                                 false
429                         );
430                         
431                 }
432         );
433 }
434
435 function patron_display_patron_holds_init(p) {
436         p.patron_holds = patron_holds_init( { 'w' : p.w, 'node' : p.patron_holds_node, 'debug' : p.app } );
437
438         p.redraw_patron_holds = function() {
439                 p.patron_holds.clear_patron_holds();
440                 if (!p._patron.hold_requests()) patron_get_holds( p._patron );
441                 for (var i = 0; i < p._patron.hold_requests().length; i++) {
442                         p.patron_holds.add_patron_holds( [ i ] );
443                 }
444         }
445
446         p.patron_holds.register_patron_holds_select_callback(
447                 function (ev) {
448                         sdump('D_PATRON_DISPLAY','Firing patron_holds_select_callback\n');
449                         sdump('D_PATRON_DISPLAY','ev.target = ' + ev.target + '\n');
450                         var patron_holds = get_list_from_tree_selection( p.patron_holds.paged_tree.tree );
451                         /* grab cover art for selected item? */
452                 }
453         );
454         p.patron_holds.register_flesh_patron_holds_function(
455                 function (treeitem) {
456                         sdump('D_PATRON_DISPLAY','Firing flesh_patron_holds_function\n');
457                         var record_id = treeitem.getAttribute('record_id'); 
458                         var hold = p._patron.hold_requests()[ record_id ];
459                         patron_get_hold_status(
460                                 hold,
461                                 function (request) {
462                                         var result = request.getResultObject();
463                                         hold.status( hold_status_as_text( result ) );
464                                         p.patron_holds.map_patron_holds_to_cols( hold, treeitem );
465                                 }
466                         );
467                 }
468         );
469         p.patron_holds.register_item_context_builder(
470                 function (ev) {
471                         sdump('D_PATRON_DISPLAY','Firing context_builder for patron_holds\n');
472                         sdump('D_PATRON_DISPLAY','ev.target = ' + ev.target + '\np.patron_holds.paged_tree.popup = ' + p.patron_holds.paged_tree.popup + '\n');
473                         empty_widget(p.patron_holds.paged_tree.popup);
474                         var patron_holds = get_list_from_tree_selection( p.patron_holds.paged_tree.tree );
475                         sdump('D_PATRON_DISPLAY','patron_holds.length = ' + patron_holds.length + '\n');
476
477                         /*** CANCEL HOLD ***/
478                         var menuitem_ph_ce = p.patron_holds.paged_tree.w.document.createElement('menuitem');
479                         p.patron_holds.paged_tree.popup.appendChild( menuitem_ph_ce );
480                         menuitem_ph_ce.setAttribute('label',getString('circ.context_cancel_hold'));
481                         menuitem_ph_ce.addEventListener(
482                                 'command',
483                                 function (ev) {
484                                         sdump('D_PATRON_DISPLAY','Firing cancel hold context for patron_holds\n');
485                                         for (var i = 0; i < patron_holds.length; i++) {
486                                                 sdump('D_PATRON_DISPLAY','Firing cancel edit context\n');
487                                                 var record_id = patron_holds[i].getAttribute('record_id');
488                                                 var hold = p._patron.hold_requests()[ record_id ];
489                                                 cancel_hold( hold );
490                                         }
491                                         p.refresh();
492                                 },
493                                 false
494                         );
495
496                         /* separator */
497                         var menuitem_ph_s = p.patron_holds.paged_tree.w.document.createElement('menuseparator');
498                         p.patron_holds.paged_tree.popup.appendChild( menuitem_ph_s );
499                         
500                         /*** COPY EDITOR ***/
501                         var menuitem_ph_ce = p.patron_holds.paged_tree.w.document.createElement('menuitem');
502                         p.patron_holds.paged_tree.popup.appendChild( menuitem_ph_ce );
503                         menuitem_ph_ce.setAttribute('label',getString('circ.context_edit'));
504                         menuitem_ph_ce.addEventListener(
505                                 'command',
506                                 function (ev) {
507                                         sdump('D_PATRON_DISPLAY','Firing copy editor context for patron_holds\n');
508                                         for (var i = 0; i < patron_holds.length; i++) {
509                                                 sdump('D_PATRON_DISPLAY','Firing copy edit context\n');
510                                         }
511                                 },
512                                 false
513                         );
514
515                         /*** OPAC ***/
516                         var menuitem_ph_o = p.patron_holds.paged_tree.w.document.createElement('menuitem');
517                         p.patron_holds.paged_tree.popup.appendChild( menuitem_ph_o );
518                         menuitem_ph_o.setAttribute('label',getString('circ.context_opac'));
519                         menuitem_ph_o.addEventListener(
520                                 'command',
521                                 function (ev) {
522                                         sdump('D_PATRON_DISPLAY','Firing opac context for patron_holds\n');
523                                         for (var i = 0; i < patron_holds.length; i++) {
524                                                 sdump('D_PATRON_DISPLAY','Firing opac context\n');
525                                         }
526                                 },
527                                 false
528                         );
529                         
530                 }
531         );
532 }
533
534 function patron_display_patron_bills_init(p) {
535         p.patron_bills = patron_bills_init( { 
536                 'w' : p.w, 
537                 'node' : p.patron_bills_node, 
538                 'debug' : p.app 
539         } );
540
541         p.patron_bills.refresh = function() { p.refresh(); }
542
543         p.redraw_patron_bills = function() {
544                 try {
545                         p.patron_bills.clear_patron_bills();
546                         if (!p._patron.bills) patron_get_bills( p._patron );
547                         p.patron_bills.add_patron_bills( p._patron.bills );
548                 } catch(E) {
549                         sdump('D_ERROR',js2JSON(E) + '\n');
550                 }
551         }
552 }
553
554 function patron_display_patron_edit_init(p) {
555         /*
556         p.patron_edit = patron_edit_init( { 
557                 'w' : p.w, 
558                 'node' : p.patron_edit_node, 
559                 'debug' : p.app
560         } );
561
562         p.patron_edit.redisplay = function() { p.display_patron( {'patron_edit':true} ); }
563         p.patron_edit.refresh = function() { p.refresh( {'patron_edit':true} ); }
564
565         p.redraw_patron_edit = function() {
566                 try {
567                         p.patron_edit.clear_patron_edit();
568                         p.patron_edit.add_rows( p._patron );
569                 } catch(E) {
570                         sdump('D_ERROR',js2JSON(E) + '\n');
571                 }
572         }
573         */
574         /* shoehorn in the old legacy stuff */
575         p.patron_edit = {};
576         p.redraw_patron_edit = function() { 
577                 empty_widget( p.patron_edit_node );
578                 setTimeout(
579                         function() {
580                                 var frame = p.w.document.createElement('iframe');
581                                 p.patron_edit_node.appendChild( frame );
582                                 frame.setAttribute('flex','1');
583                                 frame.setAttribute('src','chrome://evergreen/content/patron/patron_edit_legacy.xul');
584                                 frame.contentWindow.mw = mw;
585                                 frame.contentWindow.params = {};
586                                 var barcode = patron_get_barcode( p._patron );
587                                 frame.contentWindow.params.barcode = barcode;
588                                 frame.contentWindow.params._patron = p._patron;
589                                 frame.contentWindow.patron_save_callback = function ( params ) {
590                                         p._patron = params.au;
591                                         p.display_patron();
592                                 }
593                                 p.patron_edit.frame = frame;
594                         }, 0
595                 );
596         }
597 }
598