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