]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/server/admin/offline_manage_xacts.js
Missed a few strings in offline transaction management
[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                                                 var url = urls.XUL_PATRON_DISPLAY;
870                                                         //+ '?barcode=' + window.escape( error.command.patron_barcode );
871                                                 window.xulG.new_tab(
872                                                         url, {}, { 'barcode' : barcode }
873                                                 );
874                                         } catch(E) {
875                                                 alert(E);
876                                         }
877                                 }
878
879                         }
880                 } catch(E) {
881                         alert(E);
882                 }
883         },
884
885         'retrieve_details' : function() {
886                 var obj = this;
887                 JSAN.use('util.window'); var win = new util.window();
888                 try {
889                         for (var i = 0; i < obj.sel_errors.length; i++) {
890                                 var error = obj.errors[ obj.sel_errors[i] ];
891                                 win.open(
892                                         'data:text/plain,' + window.escape(
893                                                 'Details:\n' + obj.error.pretty_print(js2JSON(error))
894                                         ),
895                                         'offline_error_details',
896                                         'height=780,width=580,scrollbars=yes,chrome,resizable,modal'
897                                 );
898                         }
899                 } catch(E) {
900                         alert(E);
901                 }
902
903         }
904 }
905
906 dump('exiting admin/offline_manage_xacts.js\n');