]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/server/admin/offline_manage_xacts.js
clearing the cache since it started to interfere with the offline cgi scripts. tweak...
[Evergreen.git] / Open-ILS / xul / staff_client / server / admin / offline_manage_xacts.js
1 dump('entering admin/offline_manage_xacts.js\n');
2
3 if (typeof admin == 'undefined') admin = {};
4 admin.offline_manage_xacts = function (params) {
5
6         JSAN.use('util.error'); this.error = new util.error();
7         JSAN.use('util.network'); this.network = new util.network();
8 }
9
10 admin.offline_manage_xacts.prototype = {
11
12         'sel_list' : [],
13         'seslist' : [],
14         'sel_errors' : [],
15
16         'init' : function( params ) {
17
18                 var obj = this;
19
20                 JSAN.use('OpenILS.data'); obj.data = new OpenILS.data(); obj.data.init({'via':'stash'});
21
22                 obj.init_list(); obj.init_script_list(); obj.init_error_list();
23
24                 obj.retrieve_seslist(); obj.render_seslist();
25
26                 var x = document.getElementById('create');
27                 if (obj.check_perm(['OFFLINE_UPLOAD'])) {
28                         x.disabled = false;
29                         x.addEventListener('command',function() { try{obj.create_ses();}catch(E){alert(E);} },false);
30                 }
31
32                 x = obj.$('upload');
33                 x.addEventListener('command',function() { try{obj.upload();}catch(E){alert(E);} },false);
34
35                 x = obj.$('refresh');
36                 x.addEventListener('command',function() { try{$('deck').selectedIndex=0;obj.retrieve_seslist();obj.render_seslist();}catch(E){alert(E);} },false);
37
38                 x = obj.$('execute');
39                 x.addEventListener('command',function() { try{obj.execute_ses();}catch(E){alert(E);} },false);
40
41                 x = obj.$('retrieve_item');
42                 x.addEventListener('command',function() { try{obj.retrieve_item();}catch(E){alert(E);} },false);
43
44                 x = obj.$('retrieve_patron');
45                 x.addEventListener('command',function() { try{obj.retrieve_patron();}catch(E){alert(E);} },false);
46
47                 x = obj.$('retrieve_details');
48                 x.addEventListener('command',function() { try{obj.retrieve_details();}catch(E){alert(E);} },false);
49
50                 obj.$('deck').selectedIndex = 0;
51         },
52
53         '$' : function(id) { return document.getElementById(id); },
54
55         'init_list' : function() {
56                 var obj = this; JSAN.use('util.list'); 
57                 obj.list = new util.list('session_tree');
58                 obj.list.init( {
59                         'columns' : [
60                                 {
61                                         'id' : 'org', 'hidden' : 'true', 'flex' : '1',
62                                         'label' : 'Organization',
63                                         'render' : 'data.hash.aou[ my.org ].shortname()',
64                                 },
65                                 { 
66                                         'id' : 'description', 'flex' : '2',
67                                         'label' : 'Description', 
68                                         'render' : "my.description", 
69                                 },
70                                 {
71                                         'id' : 'create_time', 'flex' : '1',
72                                         'label' : 'Date Created',
73                                         'render' : 'if (my.create_time) { var x = new Date(); x.setTime(my.create_time+"000"); util.date.formatted_date(x,"%F %H:%M"); } else { ""; }',
74                                 },
75                                 {
76                                         'id' : 'creator', 'flex' : '1', 'hidden' : 'true',
77                                         'label' : 'Created By',
78                                         'render' : 'my.creator',
79                                 },
80                                 { 
81                                         'id' : 'count', 'flex' : '1',
82                                         'label' : 'Upload Count', 
83                                         'render' : "my.scripts.length", 
84                                 },
85                                 { 
86                                         'id' : 'num_complete', 'flex' : '1', 
87                                         'label' : 'Transactions Processed', 
88                                         'render' : "my.num_complete", 
89                                 },
90                                 { 
91                                         'id' : 'in_process', 'flex' : '1',
92                                         'label' : 'Processing?', 
93                                         'render' : "if (my.end_time) { 'Completed' } else {my.in_process == 0 ? 'No' : 'Yes'}", 
94                                 },
95                                 {
96                                         'id' : 'start_time', 'flex' : '1', 'hidden' : 'true',
97                                         'label' : 'Date Started',
98                                         'render' : 'if (my.start_time) {var x = new Date(); x.setTime(my.start_time+"000"); util.date.formatted_date(x,"%F %H:%M");} else { ""; }',
99                                 },
100                                 {
101                                         'id' : 'end_time', 'flex' : '1',
102                                         'label' : 'Date Completed',
103                                         'render' : 'if (my.end_time) {var x = new Date(); x.setTime(my.end_time+"000"); util.date.formatted_date(x,"%F %H:%M");} else { ""; }',
104                                 },
105                                 { 
106                                         'id' : 'key', 'hidden' : 'true', 'flex' : '1', 
107                                         'label' : 'Session', 
108                                         'render' : "my.key", 
109                                 },
110                         ],
111                         'map_row_to_column' : function(row,col) {
112                                 JSAN.use('util.date');
113                                 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
114                                 var my = row; var value;
115                                 try { value = eval( col.render ); } catch(E) { obj.error.sdump('D_ERROR',E); value = '???'; }
116                                 return value;
117                         },
118                         'on_select' : function(ev) {
119                                 try {
120                                         $('deck').selectedIndex = 0;
121                                         $('execute').disabled = true;
122                                         $('upload').disabled = true;
123                                         setTimeout(
124                                                 function() {
125                                                         try {
126                                                                 JSAN.use('util.functional');
127                                                                 var sel = obj.list.retrieve_selection();
128                                                                 obj.sel_list = util.functional.map_list(
129                                                                         sel,
130                                                                         function(o) { return o.getAttribute('retrieve_id'); }
131                                                                 );
132                                                                 if (obj.sel_list.length == 0) return;
133                                                                 {       
134                                                                         var upload = true; var process = true;
135
136                                                                         if (obj.sel_list.length > 1) upload = false;
137
138                                                                         if (obj.seslist[ obj.sel_list[0] ].end_time) {
139                                                                                 upload = false; process = false;
140                                                                         }
141                                                                         if (obj.seslist[ obj.sel_list[0] ].in_process == 1) {
142                                                                                 upload = false; process = false;
143                                                                         }
144
145                                                                         /* should we really have this next restriction? */
146                                                                         for (var i = 0; i < obj.seslist[ obj.sel_list[0] ].scripts.length; i++) {
147                                                                                 if (obj.seslist[ obj.sel_list[0] ].scripts[i].workstation ==
148                                                                                         obj.data.ws_name ) upload = false;
149                                                                         }
150
151                                                                         if (upload) {
152                                                                                 if (obj.check_perm(['OFFLINE_UPLOAD'])) {
153                                                                                         document.getElementById('upload').disabled = false;
154                                                                                 }
155                                                                         } else {
156                                                                                 document.getElementById('upload').disabled = true;
157                                                                         }
158                                                                         if (process) {
159                                                                                 if (obj.check_perm(['OFFLINE_EXECUTE'])) {
160                                                                                         document.getElementById('execute').disabled = false;    
161                                                                                 }
162                                                                         } else {
163                                                                                 document.getElementById('execute').disabled = true;     
164                                                                         }
165                                                                 }
166                                                                 var complete = false;
167                                                                 for (var i = 0; i < obj.sel_list.length; i++) { 
168                                                                         if (obj.seslist[ obj.sel_list[i] ].end_time) { complete = true; }
169                                                                 }
170                                                                 if (complete) {
171                                                                         obj.render_errorlist();
172                                                                 } else {
173                                                                         if (obj.seslist[ obj.sel_list[0] ].in_process == 1) {
174                                                                                 obj.render_status();
175                                                                         } else {
176                                                                                 obj.render_scriptlist();
177                                                                         }
178                                                                 }
179                                                         } catch(E) {
180                                                                 alert('on_select: ' + E);
181                                                         }
182                                                 }, 0
183                                         );
184                                 } catch(E) {
185                                         alert('on_select:\nobj.seslist.length = ' + obj.seslist.length + '  obj.sel_list.length = ' + obj.sel_list.length + '\nerror: ' + E);
186                                 }
187                         },
188                 } );
189
190
191         },
192
193         'init_script_list' : function() {
194                 var obj = this; JSAN.use('util.list'); 
195                 obj.script_list = new util.list('script_tree');
196                 obj.script_list.init( {
197                         'columns' : [
198                                 {
199                                         'id' : 'create_time', 'flex' : '1',
200                                         'label' : 'Date Uploaded',
201                                         'render' : 'if (my.create_time) { var x = new Date(); x.setTime(my.create_time+"000"); util.date.formatted_date(x,"%F %H:%M"); } else { ""; }',
202                                 },
203                                 {
204                                         'id' : 'requestor', 'flex' : '1', 'hidden' : 'true',
205                                         'label' : 'Uploaded By',
206                                         'render' : 'my.requestor',
207                                 },
208                                 { 
209                                         'id' : 'time_delta', 'hidden' : 'true', 'flex' : '1', 
210                                         'label' : 'Server/Local Time Delta', 
211                                         'render' : "my.time_delta", 
212                                 },
213                                 { 
214                                         'id' : 'workstation', 'flex' : '1', 
215                                         'label' : 'Workstation', 
216                                         'render' : "my.workstation", 
217                                 },
218                         ],
219                         'map_row_to_column' : function(row,col) {
220                                 JSAN.use('util.date');
221                                 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
222                                 var my = row; var value;
223                                 try { value = eval( col.render ); } catch(E) { obj.error.sdump('D_ERROR',E); value = '???'; }
224                                 return value;
225                         },
226                 } );
227
228
229         },
230
231         'init_error_list' : function() {
232                 var obj = this; JSAN.use('util.list'); 
233                 obj.error_list = new util.list('error_tree');
234                 obj.error_list.init( {
235                         'columns' : [
236                                 {
237                                         'id' : 'workstation', 'flex' : '1',
238                                         'label' : 'Workstation',
239                                         'render' : 'my.command._workstation ? my.command._workstation : my.command._worksation',
240                                 },
241                                 {
242                                         'id' : 'timestamp', 'flex' : '1',
243                                         'label' : 'Timestamp',
244                                         'render' : 'if (my.command.timestamp) { var x = new Date(); x.setTime(my.command.timestamp+"000"); util.date.formatted_date(x,"%F %H:%M"); } else { my.command._realtime; }',
245                                 },
246                                 {
247                                         'id' : 'type', 'flex' : '1',
248                                         'label' : 'Type',
249                                         'render' : 'my.command.type',
250                                 },
251                                 { 
252                                         'id' : 'ilsevent', 'hidden' : 'true', 'flex' : '1', 
253                                         'label' : 'Event Code', 
254                                         'render' : "my.event.ilsevent", 
255                                 },
256                                 { 
257                                         'id' : 'textcode', 'flex' : '1', 
258                                         'label' : 'Event Name', 
259                                         'render' : "JSAN.use('util.functional'); typeof my.event.textcode != 'undefined' ? my.event.textcode : util.functional.map_list( my.event, function(o) { return o.textcode; }).join('/')", 
260                                 },
261                                 {
262                                         'id' : 'desc', 'flex' : '1', 'hidden' : 'true',
263                                         'label' : 'Event Description',
264                                         'render' : "my.event.desc",
265                                 },
266                                 {
267                                         'id' : 'i_barcode', 'flex' : '1',
268                                         'label' : 'Item Barcode',
269                                         'render' : 'my.command.barcode ? my.command.barcode : ""',
270                                 },
271                                 {
272                                         'id' : 'p_barcode', 'flex' : '1',
273                                         'label' : 'Patron Barcode',
274                                         'render' : 'if (my.command.patron_barcode) { my.command.patron_barcode; } else { if (my.command.user.card.barcode) { my.command.user.card.barcode; } else { ""; } }',
275                                 },
276                                 {
277                                         'id' : 'duedate', 'flex' : '1', 'hidden' : 'true',
278                                         'label' : 'Due Date',
279                                         'render' : 'my.command.due_date || ""',
280                                 },
281                                 {
282                                         'id' : 'backdate', 'flex' : '1', 'hidden' : 'true',
283                                         'label' : 'Check In Backdate',
284                                         'render' : 'my.command.backdate || ""',
285                                 },
286                                 {
287                                         'id' : 'count', 'flex' : '1', 'hidden' : 'true',
288                                         'label' : 'In House Use Count',
289                                         'render' : 'my.command.count || ""',
290                                 },
291                                 {
292                                         'id' : 'noncat', 'flex' : '1', 'hidden' : 'true',
293                                         'label' : 'Non-Cataloged?',
294                                         'render' : 'my.command.noncat == 1 ? "Yes" : "No"',
295                                 },
296                                 {
297                                         'id' : 'noncat_type', 'flex' : '1', 'hidden' : 'true',
298                                         'label' : 'Non-Cataloged Type',
299                                         'render' : 'data.hash.cnct[ my.command.noncat_type ] ? data.hash.cnct[ my.command.noncat_type ].name() : ""',
300                                 },
301                                 {
302                                         'id' : 'noncat_count', 'flex' : '1', 'hidden' : 'true',
303                                         'label' : 'Non-Cataloged Count',
304                                         'render' : 'my.command.noncat_count || ""',
305                                 },
306                         ],
307                         'map_row_to_column' : function(row,col) {
308                                 JSAN.use('util.date');
309                                 JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.init({'via':'stash'});
310                                 var my = row; var value;
311                                 try { value = eval( col.render ); } catch(E) { obj.error.sdump('D_ERROR',E); value = '???'; }
312                                 return value;
313                         },
314                         'on_select' : function(ev) {
315                                 try {
316                                         var sel = obj.error_list.retrieve_selection();
317                                         obj.sel_errors = util.functional.map_list(
318                                                 sel,
319                                                 function(o) { return o.getAttribute('retrieve_id'); }
320                                         );
321                                         if (obj.sel_errors.length > 0) {
322                                                 obj.$('retrieve_item').disabled = false;
323                                                 obj.$('retrieve_patron').disabled = false;
324                                                 obj.$('retrieve_details').disabled = false;
325                                         } else {
326                                                 obj.$('retrieve_item').disabled = true;
327                                                 obj.$('retrieve_patron').disabled = true;
328                                                 obj.$('retrieve_details').disabled = true;
329                                         }
330                                 } catch(E) {
331                                         alert(E);
332                                 }
333                         }
334                 } );
335
336
337         },
338
339         'check_perm' : function(perms) {
340                 var obj = this;
341                 var robj = obj.network.simple_request('PERM_CHECK',[ses(),obj.data.list.au[0].id(),obj.data.list.au[0].ws_ou(),perms]);
342                 if (typeof robj.ilsevent != 'undefined') {
343                         obj.error.standard_unexpected_error_alert('check permission',E);
344                         return false;
345                 }
346                 return robj.length == 0 ? true : false;
347         },
348
349         'execute_ses' : function() {
350                 var obj = this;
351
352                 clear_the_cache();
353                 obj.data.stash_retrieve();
354
355                 for (var i = 0; i < obj.sel_list.length; i++) {
356
357                         var url  = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
358                                 + "?ses=" + window.escape(ses())
359                                 + "&action=execute" 
360                                 + "&seskey=" + window.escape(obj.seslist[obj.sel_list[i]].key)
361                                 + "&ws=" + window.escape(obj.data.ws_name);
362                         var x = new XMLHttpRequest();
363                         x.open("GET",url,false);
364                         x.send(null);
365
366                         dump(url + ' = ' + x.responseText + '\n' );
367                         var robj = JSON2js(x.responseText);
368
369                         if (robj.ilsevent != 0) { alert('Execute error: ' + x.responseText); }
370
371                         obj.retrieve_seslist(); obj.render_seslist();
372                 }
373         },
374
375         'ses_errors' : function() {
376                 var obj = this;
377
378                 clear_the_cache();
379                 obj.data.stash_retrieve();
380
381                 var url  = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
382                         + "?ses=" + window.escape(ses())
383                         + "&action=status" 
384                         + "&seskey=" + window.escape(obj.seslist[ obj.sel_list[0] ].key)
385                         + "&ws=" + window.escape(obj.data.ws_name)
386                         + '&status_type=exceptions';
387                 var x = new XMLHttpRequest();
388                 x.open("GET",url,false);
389                 x.send(null);
390
391                 dump(url + ' = ' + x.responseText + '\n' );
392                 var robj = JSON2js(x.responseText);
393
394                 return { 'errors' : robj, 'description' : obj.seslist[ obj.sel_list[0] ].description };
395
396         },
397
398         'rename_file' : function() {
399                 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
400                 var obj = this;
401                 JSAN.use('util.file'); 
402                 var pending = new util.file('pending_xacts');
403                 if ( !pending._file.exists() ) { throw("Can't rename a non-existent file"); }
404                 obj.transition_filename = 'pending_xacts_' + new Date().getTime();
405                 var count = 0;
406                 var file = new util.file(obj.transition_filename);
407                 while (file._file.exists()) {
408                         obj.transition_filename = 'pending_xacts_' + new Date().getTime();
409                         file = new util.file(obj.transition_filename);
410                         if (count++>100) throw("Taking too long to find a unique filename.");
411                 }
412                 pending._file.moveTo(null,obj.transition_filename);
413         },
414
415         'revert_file' : function() {
416                 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
417                 var obj = this;
418                 JSAN.use('util.file');
419                 var pending = new util.file('pending_xacts');
420                 if (pending._file.exists()) { obj.error.yns_alert('Something bad happened.  New offline transactions were accumulated during our attempted upload.  Tell your system admin that the file involved is ' + obj.transition_filename,'Scary Error','Ok',null,null,'Check here to confirm this message'); return; }
421                 var file = new util.file(obj.transition_filename);
422                 file._file.moveTo(null,'pending_xacts');
423         },
424
425         'archive_file' : function() {
426                 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
427                 var obj = this;
428                 JSAN.use('util.file');
429                 var file = new util.file(obj.transition_filename);
430                 if (file._file.exists()) file._file.moveTo(null,obj.transition_filename + '.complete')
431         },
432
433         'upload' : function() {
434                 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
435                 var obj = this;
436                 if (obj.sel_list.length == 0) { alert('Please select a session to upload to.'); return; }
437                 if (obj.sel_list.length > 1) { alert('Please select a single session to upload to.'); return; }
438
439                 JSAN.use('util.file');
440
441                 var file = new util.file('pending_xacts');
442                 if (!file._file.exists()) { alert('No pending transactions to upload.'); return; }
443
444                 obj.rename_file();
445
446                 obj.data.stash_retrieve();
447                 var seskey = obj.seslist[ obj.sel_list[0] ].key;
448                 JSAN.use('util.widgets');
449                 var xx = document.getElementById('iframe_placeholder'); util.widgets.remove_children(xx);
450                 var x = document.createElement('iframe'); xx.appendChild(x); x.flex = 1;
451                 x.setAttribute(
452                         'src',
453                         window.xulG.url_prefix( urls.XUL_REMOTE_BROWSER )
454                         + '?url=' + window.escape(
455                                 urls.XUL_OFFLINE_UPLOAD_XACTS
456                                 + '?ses=' + window.escape(ses())
457                                 + '&seskey=' + window.escape(seskey)
458                                 + '&ws=' + window.escape(obj.data.ws_name)
459                                 + '&delta=' + window.escape('0')
460                                 + '&filename=' + window.escape( obj.transition_filename )
461                         )
462                 );
463                 var newG = { 
464                         'url_prefix' : window.xulG.url_prefix, 
465                         'passthru_content_params' : {
466                                 'url_prefix' : window.xulG.url_prefix,
467                                 'handle_event' : function(robj){
468                                         netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
469                                         try {
470                                                 dump('robj = ' + js2JSON(robj) + '\n');
471                                                 if ( robj.ilsevent != 0 ) {
472                                                         obj.revert_file();
473                                                         alert('There was an error:\n' + js2JSON(robj));
474                                                 } else {
475                                                         obj.archive_file();
476                                                 }
477                                                 obj.retrieve_seslist(); obj.render_seslist();
478                                                 setTimeout(
479                                                         function() {
480                                                                 JSAN.use('util.widgets');
481                                                                 util.widgets.remove_children('iframe_placeholder');
482                                                         },0
483                                                 );
484                                         } catch(E) {
485                                                 alert('handle_event error: ' + E);
486                                         }
487                                 } 
488                         }
489                 };
490                 x.contentWindow.xulG = newG;
491         },
492
493         'ses_status' : function() {
494                 var obj = this;
495
496                 clear_the_cache();
497                 obj.data.stash_retrieve();
498
499                 var url  = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
500                         + "?ses=" + window.escape(ses())
501                         + "&action=status" 
502                         + "&seskey=" + window.escape(obj.seslist[obj.sel_list[0]].key)
503                         + "&ws=" + window.escape(obj.data.ws_name)
504                         + "&status_type=scripts";
505                 var x = new XMLHttpRequest();
506                 x.open("GET",url,false);
507                 x.send(null);
508
509                 dump(url + ' = ' + x.responseText + '\n' );
510                 var robj = JSON2js(x.responseText);
511
512                 return robj;
513         },
514
515         'create_ses' : function() {
516
517                 var obj = this;
518
519                 var desc = window.prompt('Please enter a description:','','Create an Offline Transaction Session');
520                 if (desc=='' || desc==null) { return; }
521
522                 clear_the_cache();
523                 obj.data.stash_retrieve();
524
525                 var url  = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI)
526                         + "?ses=" + window.escape(ses())
527                         + "&action=create" 
528                         + "&desc=" + window.escape(desc)
529                         + "&ws=" + window.escape(obj.data.ws_name);
530                 var x = new XMLHttpRequest();
531                 x.open("GET",url,false);
532                 x.send(null);
533
534                 dump(url + ' = ' + x.responseText + '\n' );
535                 var robj = JSON2js(x.responseText);
536                 if (robj.ilsevent == 0) {
537                         obj.retrieve_seslist(); obj.render_seslist();
538                 } else {
539                         alert('Error: ' + x.responseText);
540                 }
541         },
542
543         'retrieve_seslist' : function() {
544
545                 var obj = this;
546
547                 try {
548
549                         clear_the_cache();
550                         obj.data.stash_retrieve();
551
552                         var url = xulG.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS_CGI) 
553                                 + "?ses=" + window.escape(ses())
554                                 + "&action=status"
555                                 + "&org=" + window.escape(obj.data.list.au[0].ws_ou())
556                                 + "&status_type=sessions";
557                         var x = new XMLHttpRequest();
558                         x.open("GET",url,false);
559                         x.send(null);
560
561                         dump(url + ' = ' + x.responseText + '\n' );
562
563                         var robj = JSON2js( x.responseText );
564                         if (typeof robj.ilsevent != 'undefined') throw(robj);
565
566                         obj.seslist = robj.sort(
567                                 function(a,b) {
568                                         return b.create_time - a.create_time;
569                                 }
570                         );
571
572                 } catch(E) {
573                         obj.error.standard_unexpected_error_alert('Error retrieving offline sessions.',E);
574                 }
575         },
576
577         'render_seslist' : function() {
578
579                 var obj = this;
580
581                 var old_idx = obj.list.node.currentIndex;
582                 if (old_idx < 0) old_idx = 0;
583
584                 obj.list.clear();
585
586                 var funcs = [];
587                 for (var i = 0; i < obj.seslist.length; i++) {
588                         funcs.push( 
589                                 function(idx,row){ 
590                                         return function(){
591                                                 obj.list.append( { 'retrieve_id' : idx, 'row' : row } );
592                                                 if (idx == old_idx) obj.list.node.view.selection.select(idx);
593                                         };
594                                 }(i,obj.seslist[i]) 
595                         );
596                 }
597
598                 JSAN.use('util.exec'); var exec = new util.exec();
599                 exec.chain( funcs );
600
601                 document.getElementById('execute').disabled = true;
602                 document.getElementById('upload').disabled = true;
603
604         },
605
606         'render_scriptlist' : function() {
607
608                 dump('render_scriptlist\n');
609
610                 document.getElementById('deck').selectedIndex = 1;
611
612                 var obj = this;
613
614                 obj.script_list.clear();
615
616                 var status = obj.ses_status();
617                 document.getElementById('status_caption').setAttribute('label','Uploaded Transactions for ' + status.description);
618
619                 var scripts = status.scripts;
620
621                 var funcs = [];
622                 for (var i = 0; i < scripts.length; i++) {
623                         funcs.push( 
624                                 function(row){ 
625                                         return function(){
626                                                 obj.script_list.append( { 'row' : row } );
627                                         };
628                                 }(scripts[i]) 
629                         );
630                 }
631                 JSAN.use('util.exec'); var exec = new util.exec();
632                 exec.chain( funcs );
633         },
634         
635         'render_errorlist' : function() {
636
637                 dump('render_errorlist\n');
638
639                 document.getElementById('deck').selectedIndex = 2;
640
641                 var obj = this;
642
643                 obj.error_list.clear();
644
645                 var error_meta = obj.ses_errors();
646                 document.getElementById('errors_caption').setAttribute('label','Exceptions for ' + error_meta.description);
647
648                 obj.errors = error_meta.errors;
649
650                 var funcs = [];
651                 for (var i = 0; i < obj.errors.length; i++) {
652                         funcs.push( 
653                                 function(idx,row){ 
654                                         return function(){
655                                                 obj.error_list.append( { 'retrieve_id' : idx, 'row' : row } );
656                                         };
657                                 }(i,obj.errors[i]) 
658                         );
659                 }
660                 JSAN.use('util.exec'); var exec = new util.exec();
661                 exec.chain( funcs );
662         },
663
664         'render_status' : function() {
665         
666                 dump('render_status\n');
667
668                 document.getElementById('deck').selectedIndex = 3;
669
670         },
671
672         'retrieve_item' : function() {
673                 var obj = this;
674                 try {
675                         var barcodes = [];
676                         for (var i = 0; i < obj.sel_errors.length; i++) {
677                                 var error = obj.errors[ obj.sel_errors[i] ];
678                                 if ( ! error.command.barcode ) continue; 
679                                 if ( [ '', ' ', '???' ].indexOf( error.command.barcode ) != -1 ) continue;
680                                 barcodes.push( error.command.barcode );
681                         }
682                         if (typeof window.xulG == 'object' && typeof window.xulG.new_tab == 'function') {
683                                 try {
684                                         var url = urls.XUL_COPY_STATUS
685                                                 + '?barcodes=' + window.escape( js2JSON(barcodes) );
686                                         window.xulG.new_tab(
687                                                 url
688                                         );
689                                 } catch(E) {
690                                         alert(E);
691                                 }
692                         }
693                 } catch(E) {
694                         alert(E);
695                 }
696         },
697
698         'retrieve_patron' : function() {
699                 var obj = this;
700                 try {
701                         for (var i = 0; i < obj.sel_errors.length; i++) {
702                                 var error = obj.errors[ obj.sel_errors[i] ];
703                                 if ( ! error.command.patron_barcode ) continue; 
704                                 if ( [ '', ' ', '???' ].indexOf( error.command.patron_barcode ) != -1 ) continue;
705                                 if (typeof window.xulG == 'object' && typeof window.xulG.new_tab == 'function') {
706                                         try {
707                                                 var url = urls.XUL_PATRON_DISPLAY
708                                                         + '?barcode=' + window.escape( error.command.patron_barcode );
709                                                 window.xulG.new_tab(
710                                                         url
711                                                 );
712                                         } catch(E) {
713                                                 alert(E);
714                                         }
715                                 }
716                         }
717                 } catch(E) {
718                         alert(E);
719                 }
720         },
721
722         'retrieve_details' : function() {
723                 var obj = this;
724                 JSAN.use('util.window'); var win = new util.window();
725                 try {
726                         for (var i = 0; i < obj.sel_errors.length; i++) {
727                                 var error = obj.errors[ obj.sel_errors[i] ];
728                                 win.open(
729                                         'data:text/plain,' + window.escape(
730                                                 'Details:\n' + obj.error.pretty_print(js2JSON(error))
731                                         ),
732                                         'offline_error_details',
733                                         'chrome,resizable,modal'
734                                 );
735                         }
736                 } catch(E) {
737                         alert(E);
738                 }
739
740         },
741 }
742
743 dump('exiting admin/offline_manage_xacts.js\n');