]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/server/admin/offline_manage_xacts.js
Merge branch 'master' of git.evergreen-ils.org:Evergreen-DocBook into doc_consolidati...
[Evergreen.git] / Open-ILS / xul / staff_client / server / admin / offline_manage_xacts.js
1 <!--
2 vim: noet:ts=4:sw=4:
3 -->
4 dump('entering admin/offline_manage_xacts.js\n');
5
6 if (typeof admin == 'undefined') admin = {};
7 admin.offline_manage_xacts = function (params) {
8
9     JSAN.use('util.error'); this.error = new util.error();
10     JSAN.use('util.network'); this.network = new util.network();
11 }
12
13 admin.offline_manage_xacts.prototype = {
14
15     'sel_list' : [],
16     'seslist' : [],
17     'sel_errors' : [],
18
19     'init' : function( params ) {
20
21         var obj = this;
22
23         JSAN.use('OpenILS.data'); obj.data = new OpenILS.data(); obj.data.init({'via':'stash'});
24
25         obj.init_list(); obj.init_script_list(); obj.init_error_list();
26
27         obj.retrieve_seslist(); obj.render_seslist();
28
29         var x = document.getElementById('create');
30         if (obj.check_perm(['OFFLINE_UPLOAD'])) {
31             x.disabled = false;
32             x.addEventListener('command',function() { try{obj.create_ses();}catch(E){alert(E);} },false);
33         }
34
35         x = obj.$('upload');
36         x.addEventListener('command',function() { try{obj.upload();}catch(E){alert(E);} },false);
37
38         x = obj.$('refresh');
39         x.addEventListener('command',function() { try{$('deck').selectedIndex=0;obj.retrieve_seslist();obj.render_seslist();}catch(E){alert(E);} },false);
40
41         x = obj.$('execute');
42         x.addEventListener('command',function() { try{obj.execute_ses();}catch(E){alert(E);} },false);
43
44         x = obj.$('retrieve_item');
45         x.addEventListener('command',function() { try{obj.retrieve_item();}catch(E){alert(E);} },false);
46
47         x = obj.$('retrieve_patron');
48         x.addEventListener('command',function() { try{obj.retrieve_patron();}catch(E){alert(E);} },false);
49
50         x = obj.$('retrieve_details');
51         x.addEventListener('command',function() { try{obj.retrieve_details();}catch(E){alert(E);} },false);
52
53         obj.$('deck').selectedIndex = 0;
54     },
55
56     '$' : function(id) { return document.getElementById(id); },
57
58     'init_list' : function() {
59         var obj = this; JSAN.use('util.list'); JSAN.use('util.date'); JSAN.use('patron.util');
60         obj.list = new util.list('session_tree');
61         obj.list.init( {
62             'columns' : [
63                 {
64                     'id' : 'org', 'hidden' : 'true', 'flex' : '1',
65                     'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_list.organization'),
66                     'render' : function(my) { return obj.data.hash.aou[ my.org ].shortname(); }
67                 },
68                 { 
69                     'id' : 'description', 'flex' : '2',
70                     'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_list.description'),
71                     'render' : function(my) { return my.description; }
72                 },
73                 {
74                     'id' : 'create_time', 'flex' : '1',
75                     'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_list.date_created'),
76                     'render' : function(my) { if (my.create_time) { var x = new Date(); x.setTime(my.create_time+"000"); return util.date.formatted_date(x,"%F %H:%M"); } else { return ""; }; }
77                 },
78                 {
79                     'id' : 'creator', 'flex' : '1', 'hidden' : 'true',
80                     'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_list.created_by'),
81                     'render' : function(my) { var staff_obj = patron.util.retrieve_name_via_id( ses(), my.creator ); return staff_obj[0] + " @ " + obj.data.hash.aou[ staff_obj[3] ].shortname(); }
82                 },
83                 { 
84                     'id' : 'count', 'flex' : '1',
85                     'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_list.upload_count'), 
86                     'render' : function(my) { return my.scripts.length; }
87                 },
88                 { 
89                     'id' : 'num_complete', 'flex' : '1', 
90                     'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_list.transactions_processed'), 
91                     'render' : function(my) { return my.num_complete; }
92                 },
93                 { 
94                     'id' : 'in_process', 'flex' : '1',
95                     'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_list.processing'),
96                     'render' : function(my) {
97                         if (my.end_time) {
98                             return $('adminStrings').getString('staff.admin.offline_manage_xacts.completed')
99                         } else {
100                             return get_bool(my.in_process) ? $('adminStrings').getString('staff.admin.offline_manage_xacts.yes') : $('adminStrings').getString('staff.admin.offline_manage_xacts.no')
101                         };
102                     }
103                 },
104                 {
105                     'id' : 'start_time', 'flex' : '1', 'hidden' : 'true',
106                     'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_list.date_started'),
107                     'render' : function(my) { if (my.start_time) {var x = new Date(); x.setTime(my.start_time+"000"); return util.date.formatted_date(x,"%F %H:%M");} else { return ""; }; }
108                 },
109                 {
110                     'id' : 'end_time', 'flex' : '1',
111                     'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_list.date_completed'),
112                     'render' : function(my) { if (my.end_time) {var x = new Date(); x.setTime(my.end_time+"000"); return util.date.formatted_date(x,"%F %H:%M");} else { return ""; }; }
113                 },
114                 { 
115                     'id' : 'key', 'hidden' : 'true', 'flex' : '1', 
116                     'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_list.session'),
117                     'render' : function(my) { return my.key; }
118                 },
119             ],
120             'on_select' : function(ev) {
121                 try {
122                     $('deck').selectedIndex = 0;
123                     $('execute').disabled = true;
124                     $('upload').disabled = true;
125                     setTimeout(
126                         function() {
127                             try {
128                                 JSAN.use('util.functional');
129                                 var sel = obj.list.retrieve_selection();
130                                 obj.sel_list = util.functional.map_list(
131                                     sel,
132                                     function(o) { return o.getAttribute('retrieve_id'); }
133                                 );
134                                 if (obj.sel_list.length == 0) return;
135                                 {    
136                                     var upload = true; var process = true;
137
138                                     if (obj.sel_list.length > 1) upload = false;
139
140                                     if (obj.seslist[ obj.sel_list[0] ].end_time) {
141                                         upload = false; process = false;
142                                     }
143                                     if (obj.seslist[ obj.sel_list[0] ].in_process == 1) {
144                                         upload = false; process = false;
145                                     }
146
147                                     /* should we really have this next restriction? */
148                                     for (var i = 0; i < obj.seslist[ obj.sel_list[0] ].scripts.length; i++) {
149                                         if (obj.seslist[ obj.sel_list[0] ].scripts[i].workstation ==
150                                             obj.data.ws_name ) upload = false;
151                                     }
152
153                                     if (upload) {
154                                         if (obj.check_perm(['OFFLINE_UPLOAD'])) {
155                                             document.getElementById('upload').disabled = false;
156                                         }
157                                     } else {
158                                         document.getElementById('upload').disabled = true;
159                                     }
160                                     if (process) {
161                                         if (obj.check_perm(['OFFLINE_EXECUTE'])) {
162                                             document.getElementById('execute').disabled = false;    
163                                         }
164                                     } else {
165                                         document.getElementById('execute').disabled = true;    
166                                     }
167                                 }
168                                 var complete = false;
169                                 for (var i = 0; i < obj.sel_list.length; i++) { 
170                                     if (obj.seslist[ obj.sel_list[i] ].end_time) { complete = true; }
171                                 }
172                                 if (complete) {
173                                     obj.render_errorlist();
174                                 } else {
175                                     if (obj.seslist[ obj.sel_list[0] ].in_process == 1) {
176                                         obj.render_status();
177                                     } else {
178                                         obj.render_scriptlist();
179                                     }
180                                 }
181                             } catch(E) {
182                                 alert('on_select: ' + E);
183                             }
184                         }, 0
185                     );
186                 } catch(E) {
187                     alert('on_select:\nobj.seslist.length = ' + obj.seslist.length + '  obj.sel_list.length = ' + obj.sel_list.length + '\nerror: ' + E);
188                 }
189             }
190         } );
191
192
193     },
194
195     'init_script_list' : function() {
196         var obj = this; JSAN.use('util.list'); JSAN.use('util.date'); JSAN.use('patron.util');
197         obj.script_list = new util.list('script_tree');
198         obj.script_list.init( {
199             'columns' : [
200                 {
201                     'id' : 'create_time', 'flex' : '1',
202                     'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_script_list.date_uploaded'),
203                     'render' : function(my) { if (my.create_time) { var x = new Date(); x.setTime(my.create_time+"000"); return util.date.formatted_date(x,"%F %H:%M"); } else { return ""; }; }
204                 },
205                 {
206                     'id' : 'requestor', 'flex' : '1', 'hidden' : 'true',
207                     'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_script_list.uploaded_by'),
208                     'render' : function(my) { var staff_obj = patron.util.retrieve_name_via_id( ses(), my.requestor ); return staff_obj[0] + " @ " + obj.data.hash.aou[ staff_obj[3] ].shortname(); }
209                 },
210                 { 
211                     'id' : 'time_delta', 'hidden' : 'true', 'flex' : '1', 
212                     'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_script_list.time_delta'),
213                     'render' : function(my) { return my.time_delta; }
214                 },
215                 { 
216                     'id' : 'workstation', 'flex' : '1', 
217                     'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_script_list.workstation'),
218                     'render' : function(my) { return my.workstation; }
219                 },
220             ]
221         } );
222
223
224     },
225
226     'init_error_list' : function() {
227         var obj = this; JSAN.use('util.list');  JSAN.use('util.date'); JSAN.use('patron.util'); JSAN.use('util.functional');
228         obj.error_list = new util.list('error_tree');
229         obj.error_list.init( {
230             'columns' : [
231                 {
232                     'id' : 'workstation', 'flex' : '1',
233                     'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_error_list.workstation'),
234                     'render' : function(my) { return my.command._workstation ? my.command._workstation : my.command._worksation; }
235                 },
236                 {
237                     'id' : 'timestamp', 'flex' : '1',
238                     'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_error_list.timestamp'),
239                     'render' : function(my) { if (my.command.timestamp) { var x = new Date(); x.setTime(my.command.timestamp+"000"); return util.date.formatted_date(x,"%F %H:%M"); } else { return my.command._realtime; }; }
240                 },
241                 {
242                     'id' : 'type', 'flex' : '1',
243                     'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_error_list.type'),
244                     'render' : function(my) { return my.command.type; }
245                 },
246                 { 
247                     'id' : 'ilsevent', 'hidden' : 'true', 'flex' : '1', 
248                     'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_error_list.event_code'),
249                     'render' : function(my) { return my.event.ilsevent; }
250                 },
251                 { 
252                     'id' : 'textcode', 'flex' : '1', 
253                     'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_error_list.event_name'),
254                     'render' : function(my) { return typeof my.event.textcode != 'undefined' ? my.event.textcode : util.functional.map_list( my.event, function(o) { return o.textcode; }).join('/'); }
255                 },
256                 {
257                     'id' : 'desc', 'flex' : '1', 'hidden' : 'true',
258                     'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_error_list.event_description'),
259                     'render' : function(my) { return my.event.desc; }
260                 },
261                 {
262                     'id' : 'i_barcode', 'flex' : '1',
263                     'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_error_list.item_barcode'),
264                     'render' : function(my) { return my.command.barcode ? my.command.barcode : ""; }
265                 },
266                 {
267                     'id' : 'p_barcode', 'flex' : '1',
268                     'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_error_list.patron_barcode'),
269                     'render' : function(my) { if (my.command.patron_barcode) { return my.command.patron_barcode; } else { if (my.command.user.card.barcode) { return my.command.user.card.barcode; } else { return ""; } }; }
270                 },
271                 {
272                     'id' : 'duedate', 'flex' : '1', 'hidden' : 'true',
273                     'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_error_list.due_date'),
274                     'render' : function(my) { return my.command.due_date || ""; }
275                 },
276                 {
277                     'id' : 'backdate', 'flex' : '1', 'hidden' : 'true',
278                     'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_error_list.backdate'),
279                     'render' : function(my) { return my.command.backdate || ""; }
280                 },
281                 {
282                     'id' : 'count', 'flex' : '1', 'hidden' : 'true',
283                     'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_error_list.count'),
284                     'render' : function(my) { return my.command.count || ""; }
285                 },
286                 {
287                     'id' : 'noncat', 'flex' : '1', 'hidden' : 'true',
288                     'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_error_list.noncat'),
289                     'render' : function(my) { return get_bool(my.command.noncat) ? $('adminStrings').getString('staff.admin.offline_manage_xacts.yes') : $('adminStrings').getString('staff.admin.offline_manage_xacts.no'); }
290                 },
291                 {
292                     'id' : 'noncat_type', 'flex' : '1', 'hidden' : 'true',
293                     'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_error_list.noncat_type'),
294                     'render' : function(my) { return data.hash.cnct[ my.command.noncat_type ] ? obj.data.hash.cnct[ my.command.noncat_type ].name() : ""; }
295                 },
296                 {
297                     'id' : 'noncat_count', 'flex' : '1', 'hidden' : 'true',
298                     'label' : $('adminStrings').getString('staff.admin.offline_manage_xacts.init_error_list.noncat_count'),
299                     'render' : function(my) { return my.command.noncat_count || ""; }
300                 },
301             ],
302             'on_select' : function(ev) {
303                 try {
304                     var sel = obj.error_list.retrieve_selection();
305                     obj.sel_errors = util.functional.map_list(
306                         sel,
307                         function(o) { return o.getAttribute('retrieve_id'); }
308                     );
309                     if (obj.sel_errors.length > 0) {
310                         obj.$('retrieve_item').disabled = false;
311                         obj.$('retrieve_patron').disabled = false;
312                         obj.$('retrieve_details').disabled = false;
313                     } else {
314                         obj.$('retrieve_item').disabled = true;
315                         obj.$('retrieve_patron').disabled = true;
316                         obj.$('retrieve_details').disabled = true;
317                     }
318                 } catch(E) {
319                     alert(E);
320                 }
321             }
322         } );
323
324         var export_button = document.getElementById('export_btn');
325         if (export_button) export_button.addEventListener(
326             'command',
327             function(ev) {
328                 try {
329                     obj.error_list.dump_csv_to_clipboard();
330                 } catch(E) {
331                     obj.error.standard_unexpected_error_alert('export',E); 
332                 }
333             },
334             false
335         );
336         
337         var print_export_button = document.getElementById('print_export_btn');
338         if (print_export_button) print_export_button.addEventListener(
339             'command',
340             function(ev) {
341                 try {
342                     obj.error_list.on_all_fleshed =
343                         function() {
344                             try {
345                                 dump( obj.error_list.dump_csv() + '\n' );
346                                 //copy_to_clipboard(obj.error_list.dump_csv());
347                                 JSAN.use('util.print'); var p = new util.print();
348                                 p.simple( obj.error_list.dump_csv(), { 'content_type' : 'text/plain' } );
349                                 setTimeout(function(){ obj.error_list.on_all_fleshed = null; },0);
350                             } catch(E) {
351                                 obj.error.standard_unexpected_error_alert('export',E); 
352                             }
353                         }
354                     obj.error_list.full_retrieve();
355                 } catch(E) {
356                     obj.error.standard_unexpected_error_alert('print export',E); 
357                 }
358             },
359             false
360         );
361
362     },
363
364     'check_perm' : function(perms) {
365         var obj = this;
366         try {
367             var robj = obj.network.simple_request('PERM_CHECK',[ses(),obj.data.list.au[0].id(),obj.data.list.au[0].ws_ou(),perms]);
368             if (typeof robj.ilsevent != 'undefined') {
369                 obj.error.standard_unexpected_error_alert('check permission',E);
370                 return false;
371             }
372             return robj.length == 0 ? true : false;
373         } catch(E) {
374             obj.error.standard_unexpected_error_alert($('adminStrings').getString('staff.admin.offline_manage_xacts.error.check_perm'),E);
375         }
376     },
377
378     'execute_ses' : function() {
379         var obj = this;
380
381         try {
382
383         clear_the_cache();
384         obj.data.stash_retrieve();
385
386         for (var i = 0; i < obj.sel_list.length; i++) {
387
388             var url  = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
389                 + "?ses=" + window.escape(ses())
390                 + "&action=execute" 
391                 + "&seskey=" + window.escape(obj.seslist[obj.sel_list[i]].key)
392                 + "&ws=" + window.escape(obj.data.ws_name);
393             var x = new XMLHttpRequest();
394             x.open("GET",url,false);
395             x.send(null);
396
397             dump(url + ' = ' + x.responseText + '\n' );
398             if (!x.responseText) {
399                 throw($('adminStrings').getString('staff.admin.offline_manage_xacts.error.bad_cgi_response'));
400             }
401             var robj = JSON2js(x.responseText);
402
403             if (robj.ilsevent != 0) { alert($('adminStrings').getString('staff.admin.offline_manage_xacts.error.execute_error') + ' ' + x.responseText); }
404
405             obj.retrieve_seslist(); obj.render_seslist();
406         }
407
408         } catch(E) {
409             obj.error.standard_unexpected_error_alert($('adminStrings').getString('staff.admin.offline_manage_xacts.error.session_execute_error'),E);
410         }
411     },
412
413     'ses_errors' : function() {
414         var obj = this;
415
416         try {
417
418         clear_the_cache();
419         obj.data.stash_retrieve();
420
421         var url  = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
422             + "?ses=" + window.escape(ses())
423             + "&action=status" 
424             + "&seskey=" + window.escape(obj.seslist[ obj.sel_list[0] ].key)
425             + "&ws=" + window.escape(obj.data.ws_name)
426             + '&status_type=exceptions';
427         var x = new XMLHttpRequest();
428         x.open("GET",url,false);
429         x.send(null);
430
431         dump(url + ' = ' + x.responseText + '\n' );
432         if (!x.responseText) {
433             throw($('adminStrings').getString('staff.admin.offline_manage_xacts.error.bad_cgi_response'));
434         }
435         var robj = JSON2js(x.responseText);
436
437         return { 'errors' : robj, 'description' : obj.seslist[ obj.sel_list[0] ].description };
438
439         } catch(E) {
440             throw($('adminStrings').getString('staff.admin.offline_manage_xacts.error.session_retrieval') + ' ' + E);
441         }
442
443     },
444
445     'rename_file' : function() {
446         netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
447         var obj = this;
448
449         try {
450
451         JSAN.use('util.file'); 
452         var pending = new util.file('pending_xacts');
453         if ( !pending._file.exists() ) {
454             throw($('adminStrings').getString('staff.admin.offline_manage_xacts.error.non_existent_file'));
455         }
456         obj.transition_filename = 'pending_xacts_' + new Date().getTime();
457         var count = 0;
458         var file = new util.file(obj.transition_filename);
459         while (file._file.exists()) {
460             obj.transition_filename = 'pending_xacts_' + new Date().getTime();
461             file = new util.file(obj.transition_filename);
462             if (count++>100) {
463                 throw($('adminStrings').getString('staff.admin.offline_manage_xacts.error.unique_file'));
464             }
465         }
466         pending._file.moveTo(null,obj.transition_filename);
467
468         } catch(E) {
469             obj.error.standard_unexpected_error_alert($('adminStrings').getString('staff.admin.offline_manage_xacts.error.renaming_file'),E);
470         }
471     },
472
473     'revert_file' : function() {
474         netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
475         var obj = this;
476
477         try {
478
479         JSAN.use('util.file');
480         var pending = new util.file('pending_xacts');
481         if (pending._file.exists()) { 
482             obj.error.yns_alert(
483                     $('adminStrings').getFormattedString('staff.admin.offline_manage_xacts.error.transaction_conflicts', [obj.transition_filename]),
484                     $('adminStrings').getString('staff.admin.offline_manage_xacts.error.transaction_conflicts.title'),
485                     $('adminStrings').getString('staff.admin.offline_manage_xacts.error.transaction_conflicts.ok'),
486                     null,
487                     null,
488                     $('adminStrings').getString('staff.admin.offline_manage_xacts.error.transaction_conflicts.confirm')
489             );
490             return;
491         }
492         var file = new util.file(obj.transition_filename);
493         file._file.moveTo(null,'pending_xacts');
494
495         } catch(E) {
496             obj.error.standard_unexpected_error_alert($('adminStrings').getString('staff.admin.offline_manage_xacts.error.reverting_file'),E);
497         }
498     },
499
500     'archive_file' : function() {
501         netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
502         var obj = this;
503
504         try {
505
506         JSAN.use('util.file');
507         var file = new util.file(obj.transition_filename);
508         if (file._file.exists()) file._file.moveTo(null,obj.transition_filename + '.complete');
509
510         } catch(E) {
511             obj.error.standard_unexpected_error_alert($('adminStrings').getString('staff.admin.offline_manage_xacts.error.archiving_file'),E);
512         }
513     },
514
515     'upload' : function() {
516         netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
517         var obj = this;
518
519         try {
520
521         if (obj.sel_list.length == 0) { 
522             alert($('adminStrings').getString('staff.admin.offline_manage_xacts.session_upload'));
523             return;
524         }
525         if (obj.sel_list.length > 1) {
526             alert($('adminStrings').getString('staff.admin.offline_manage_xacts.single_session_upload'));
527             return;
528         }
529
530         JSAN.use('util.file');
531
532         var file = new util.file('pending_xacts');
533         if (!file._file.exists()) {
534             alert($('adminStrings').getString('staff.admin.offline_manage_xacts.no_transactions'));
535             return;
536         }
537
538         obj.rename_file();
539
540         obj.data.stash_retrieve();
541         var seskey = obj.seslist[ obj.sel_list[0] ].key;
542         JSAN.use('util.widgets');
543         var xx = document.getElementById('iframe_placeholder'); util.widgets.remove_children(xx);
544         var x = document.createElement('iframe'); xx.appendChild(x); x.flex = 1;
545         x.setAttribute(
546             'src',
547             window.xulG.url_prefix( urls.XUL_REMOTE_BROWSER )
548             /*
549             + '?url=' + window.escape(
550                 urls.XUL_OFFLINE_UPLOAD_XACTS
551                 + '?ses=' + window.escape(ses())
552                 + '&seskey=' + window.escape(seskey)
553                 + '&ws=' + window.escape(obj.data.ws_name)
554                 + '&delta=' + window.escape('0')
555                 + '&filename=' + window.escape( obj.transition_filename )
556             )
557             */
558         );
559         var newG = { 
560             'url' : urls.XUL_OFFLINE_UPLOAD_XACTS,
561             'url_prefix' : window.xulG.url_prefix, 
562             'passthru_content_params' : {
563                 'ses' : ses(),
564                 'seskey' : seskey,
565                 'ws' : obj.data.ws_name,
566                 'delta' : 0,
567                 'filename' : obj.transition_filename,
568                 'url_prefix' : window.xulG.url_prefix,
569                 'handle_event' : function(robj){
570                     netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
571                     try {
572                         dump('robj = ' + js2JSON(robj) + '\n');
573                         if ( robj.ilsevent != 0 ) {
574                             obj.revert_file();
575                             alert($('adminStrings').getFormattedString('staff.admin.offline_manage_xacts.error.uploading_file') + '\n' + js2JSON(robj));
576                         } else {
577                             obj.archive_file();
578                         }
579                         obj.retrieve_seslist(); obj.render_seslist();
580                         setTimeout(
581                             function() {
582                                 JSAN.use('util.widgets');
583                                 util.widgets.remove_children('iframe_placeholder');
584                             },0
585                         );
586                     } catch(E) {
587                         alert('handle_event error: ' + E);
588                     }
589                 } 
590             }
591         };
592         get_contentWindow(x).xulG = newG;
593
594         } catch(E) {
595             obj.error.standard_unexpected_error_alert($('adminStrings').getString('staff.admin.offline_manage_xacts.error.uploading_transactions'),E);
596         }
597     },
598
599     'ses_status' : function() {
600         var obj = this;
601
602         try {
603
604         clear_the_cache();
605         obj.data.stash_retrieve();
606
607         var url  = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
608             + "?ses=" + window.escape(ses())
609             + "&action=status" 
610             + "&seskey=" + window.escape(obj.seslist[obj.sel_list[0]].key)
611             + "&ws=" + window.escape(obj.data.ws_name)
612             + "&status_type=scripts";
613         var x = new XMLHttpRequest();
614         x.open("GET",url,false);
615         x.send(null);
616
617         dump(url + ' = ' + x.responseText + '\n' );
618         if (!x.responseText) {
619             throw($('adminStrings').getString('staff.admin.offline_manage_xacts.error.bad_cgi_response'));
620         }
621         var robj = JSON2js(x.responseText);
622
623         return robj;
624
625         } catch(E) {
626
627             obj.error.standard_unexpected_error_alert($('adminStrings').getString('staff.admin.offline_manage_xacts.error.retrieving_session'),E);
628             return { 'ilsevent' : -2 };    
629
630         }
631     },
632
633     'create_ses' : function() {
634
635         var obj = this;
636
637         try {
638
639         var desc = window.prompt(
640                 $('adminStrings').getString('staff.admin.offline_manage_xacts.create_session.prompt'),
641                 '',
642                 $('adminStrings').getString('staff.admin.offline_manage_xacts.create_session')
643         );
644         if (desc=='' || desc==null) { return; }
645
646         clear_the_cache();
647         obj.data.stash_retrieve();
648
649         var url  = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
650             + "?ses=" + window.escape(ses())
651             + "&action=create" 
652             + "&desc=" + window.escape(desc)
653             + "&ws=" + window.escape(obj.data.ws_name);
654         var x = new XMLHttpRequest();
655         x.open("GET",url,false);
656         x.send(null);
657
658         dump(url + ' = ' + x.responseText + '\n' );
659         if (!x.responseText) {
660             throw($('adminStrings').getString('staff.admin.offline_manage_xacts.error.bad_cgi_response'));
661         }
662         var robj = JSON2js(x.responseText);
663         if (robj.ilsevent == 0) {
664             obj.retrieve_seslist(); obj.render_seslist();
665         } else {
666             alert($('adminStrings').getFormattedString('staff.admin.offline_manage_xacts.error.create_session.alert', [x.responseText]));
667         }
668
669         } catch(E) {
670             obj.error.standard_unexpected_error_alert($('adminStrings').getString('staff.admin.offline_manage_xacts.error.create_session'), E);
671         }
672
673     },
674
675     'retrieve_seslist' : function() {
676
677         var obj = this;
678
679         try {
680
681             clear_the_cache();
682             obj.data.stash_retrieve();
683
684             var url = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI) 
685                 + "?ses=" + window.escape(ses())
686                 + "&action=status"
687                 + "&org=" + window.escape(obj.data.list.au[0].ws_ou())
688                 + "&status_type=sessions";
689             var x = new XMLHttpRequest();
690             x.open("GET",url,false);
691             x.send(null);
692
693             dump(url + ' = ' + typeof(x.responseText) + '\n' );
694
695             if (!x.responseText) {
696                 throw($('adminStrings').getString('staff.admin.offline_manage_xacts.error.bad_cgi_response'));
697             }
698
699             var robj = JSON2js( x.responseText );
700             if (typeof robj.ilsevent != 'undefined') throw(robj);
701
702             if (!robj) throw(robj);
703
704             obj.seslist = robj.sort(
705                 function(a,b) {
706                     return b.create_time - a.create_time;
707                 }
708             );
709
710         } catch(E) {
711             obj.error.standard_unexpected_error_alert($('adminStrings').getString('staff.admin.offline_manage_xacts.error.retrieving_sessions'),E);
712         }
713     },
714
715     'render_seslist' : function() {
716
717         var obj = this;
718
719         try {
720
721         var old_idx = obj.list.node.currentIndex;
722         if (old_idx < 0) old_idx = 0;
723
724         obj.list.clear();
725
726         var funcs = [];
727         for (var i = 0; i < obj.seslist.length; i++) {
728             funcs.push( 
729                 function(idx,row){ 
730                     return function(){
731                         obj.list.append( { 'retrieve_id' : idx, 'row' : row, 'no_auto_select' : true, 'to_bottom' : true } );
732                         //if (idx == old_idx) obj.list.node.view.selection.select(idx);
733                     };
734                 }(i,{ 'my' : obj.seslist[i] }) 
735             );
736         }
737
738         JSAN.use('util.exec'); var exec = new util.exec();
739         exec.chain( funcs );
740
741         document.getElementById('execute').disabled = true;
742         document.getElementById('upload').disabled = true;
743
744         } catch(E) {
745             obj.error.standard_unexpected_error_alert($('adminStrings').getString('staff.admin.offline_manage_xacts.error.rendering_session'),E);
746         }
747     },
748
749     'render_scriptlist' : function() {
750
751         dump('render_scriptlist\n');
752
753         var obj = this;
754
755         try { 
756
757         document.getElementById('deck').selectedIndex = 1;
758
759         obj.script_list.clear();
760
761         var status = obj.ses_status();
762         $('status_caption').setAttribute('label', $('adminStrings').getFormattedString('staff.admin.offline_manage_xacts.upload_status', [status.description]));
763
764         var scripts = status.scripts;
765
766         var funcs = [];
767         for (var i = 0; i < scripts.length; i++) {
768             funcs.push( 
769                 function(row){ 
770                     return function(){
771                         obj.script_list.append( { 'row' : row, 'no_auto_select' : true  } );
772                     };
773                 }({ 'my' : scripts[i] }) 
774             );
775         }
776         JSAN.use('util.exec'); var exec = new util.exec();
777         exec.chain( funcs );
778
779         } catch(E) {
780             obj.error.standard_unexpected_error_alert($('adminStrings').getString('staff.admin.offline_manage_xacts.error.rendering_script'),E);
781         }
782     },
783     
784     'render_errorlist' : function() {
785
786         dump('render_errorlist\n');
787
788         var obj = this;
789
790         try {
791
792         document.getElementById('deck').selectedIndex = 2;
793
794         obj.error_list.clear();
795
796         var error_meta = obj.ses_errors();
797         $('errors_caption').setAttribute('label',$('adminStrings').getFormattedString('staff.admin.offline_manage_xacts.error.rendering_errors', [error_meta.description]));
798
799         obj.errors = error_meta.errors;
800
801         var funcs = [];
802         for (var i = 0; i < obj.errors.length; i++) {
803             funcs.push( 
804                 function(idx,row){ 
805                     return function(){
806                         obj.error_list.append( { 'retrieve_id' : idx, 'row' : row, 'no_auto_select' : true  } );
807                     };
808                 }(i,{ 'my' : obj.errors[i] }) 
809             );
810         }
811         JSAN.use('util.exec'); var exec = new util.exec();
812         exec.chain( funcs );
813
814         } catch(E) {
815             obj.error.standard_unexpected_error_alert($('adminStrings').getString('staff.admin.offline_manage_xacts.error.rendering_error_list'),E);
816         }
817     },
818
819     'render_status' : function() {
820     
821         dump('render_status\n');
822
823         document.getElementById('deck').selectedIndex = 3;
824
825     },
826
827     'retrieve_item' : function() {
828         var obj = this;
829         try {
830             var barcodes = [];
831             for (var i = 0; i < obj.sel_errors.length; i++) {
832                 var error = obj.errors[ obj.sel_errors[i] ];
833                 if ( ! error.command.barcode ) continue; 
834                 if ( [ '', ' ', '???' ].indexOf( error.command.barcode ) != -1 ) continue;
835                 barcodes.push( error.command.barcode );
836             }
837             if (typeof window.xulG == 'object' && typeof window.xulG.new_tab == 'function') {
838                 try {
839                     var url = urls.XUL_COPY_STATUS;
840                         //+ '?barcodes=' + window.escape( js2JSON(barcodes) );
841                     window.xulG.new_tab(
842                         url, {}, { 'barcodes' : barcodes }
843                     );
844                 } catch(E) {
845                     alert(E);
846                 }
847             }
848         } catch(E) {
849             alert(E);
850         }
851     },
852
853     'retrieve_patron' : function() {
854         var obj = this;
855         var patrons = {};
856         try {
857             for (var i = 0; i < obj.sel_errors.length; i++) {
858                 var error = obj.errors[ obj.sel_errors[i] ];
859                 if ( ! error.command.patron_barcode ) continue; 
860                 if ( [ '', ' ', '???' ].indexOf( error.command.patron_barcode ) != -1 ) continue;
861                 patrons[ error.command.patron_barcode ] = true;
862             }
863             for (var barcode in patrons) {
864                 if (typeof window.xulG == 'object' && typeof window.xulG.new_tab == 'function') {
865                     try {
866                         window.xulG.new_patron_tab(
867                             {}, { 'barcode' : barcode }
868                         );
869                     } catch(E) {
870                         alert(E);
871                     }
872                 }
873
874             }
875         } catch(E) {
876             alert(E);
877         }
878     },
879
880     'retrieve_details' : function() {
881         var obj = this;
882         JSAN.use('util.window'); var win = new util.window();
883         try {
884             for (var i = 0; i < obj.sel_errors.length; i++) {
885                 var error = obj.errors[ obj.sel_errors[i] ];
886                 win.open(
887                     'data:text/plain,' + window.escape(
888                         'Details:\n' + obj.error.pretty_print(js2JSON(error))
889                     ),
890                     'offline_error_details',
891                     'height=780,width=580,scrollbars=yes,chrome,resizable,modal'
892                 );
893             }
894         } catch(E) {
895             alert(E);
896         }
897
898     }
899 }
900
901 dump('exiting admin/offline_manage_xacts.js\n');