]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/chrome/content/main/menu.js
pref for disabling accesskeys on tabs
[working/Evergreen.git] / Open-ILS / xul / staff_client / chrome / content / main / menu.js
1 dump('entering main/menu.js\n');
2 // vim:noet:sw=4:ts=4:
3
4 var offlineStrings;
5
6 if (typeof main == 'undefined') main = {};
7 main.menu = function () {
8
9     netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
10     offlineStrings = document.getElementById('offlineStrings');
11         JSAN.use('util.error'); this.error = new util.error();
12         JSAN.use('util.window'); this.window = new util.window();
13
14         this.w = window;
15     var x = document.getElementById('network_progress');
16     x.setAttribute('count','0');
17     x.addEventListener(
18         'click',
19         function() {
20             if ( window.confirm(offlineStrings.getString('menu.reset_network_stats')) ) {
21                 var y = document.getElementById('network_progress_rows');
22                 while(y.firstChild) { y.removeChild( y.lastChild ); }
23                 x.setAttribute('mode','determined');
24                 x.setAttribute('count','0');
25             }
26         },
27         false
28     );
29
30         if (xulG.pref.getBoolPref('open-ils.disable_accesskeys_on_tabs')) {
31                 var tabs = document.getElementById('main_tabs');
32                 for (var i = 0; i < tabs.childNodes.length; i++) {
33                         tabs.childNodes[i].setAttribute('accesskey','');
34                 }
35         }
36 }
37
38 main.menu.prototype = {
39
40         'id_incr' : 0,
41
42         'url_prefix' : function(url) {
43                 if (url.match(/^\//)) url = urls.remote + url;
44                 if (! url.match(/^(http|chrome):\/\//) && ! url.match(/^data:/) ) url = 'http://' + url;
45                 dump('url_prefix = ' + url + '\n');
46                 return url;
47         },
48
49         'init' : function( params ) {
50
51                 urls.remote = params['server'];
52
53                 var obj = this;
54
55                 JSAN.use('OpenILS.data'); obj.data = new OpenILS.data(); obj.data.init({'via':'stash'});
56
57                 var cmd_map = {
58                         'cmd_broken' : [
59                                 ['oncommand'],
60                                 function() { alert(offlineStrings.getString('common.unimplemented')); }
61                         ],
62
63                         /* File Menu */
64                         'cmd_close_window' : [ 
65                                 ['oncommand'], 
66                                 function() { window.close(); } 
67                         ],
68                         'cmd_new_window' : [
69                                 ['oncommand'],
70                                 function() {
71                                         obj.data.stash_retrieve();
72                                         var mframe = obj.window.open(
73                                                 obj.url_prefix(urls.XUL_MENU_FRAME)
74                                                 + '?server='+window.escape(urls.remote),
75                                                 'main' + obj.window.window_name_increment(),
76                                                 'chrome,resizable'); 
77                     netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
78                     mframe.xulG = xulG;
79                                 }
80                         ],
81                         'cmd_new_tab' : [
82                                 ['oncommand'],
83                                 function() { obj.new_tab(null,{'focus':true},null); }
84                         ],
85                         'cmd_close_tab' : [
86                                 ['oncommand'],
87                                 function() { obj.close_tab(); }
88                         ],
89                         'cmd_close_all_tabs' : [
90                                 ['oncommand'],
91                                 function() { obj.close_all_tabs(); }
92                         ],
93
94                         /* Edit Menu */
95                         'cmd_edit_copy_buckets' : [
96                                 ['oncommand'],
97                                 function() {
98                                         obj.data.stash_retrieve();
99                                         obj.set_tab(obj.url_prefix(urls.XUL_COPY_BUCKETS),{'tab_name':offlineStrings.getString('menu.cmd_edit_copy_buckets.tab')},{});
100                                 }
101                         ],
102                         'cmd_edit_volume_buckets' : [
103                                 ['oncommand'],
104                                 function() {
105                                         obj.data.stash_retrieve();
106                                         obj.set_tab(obj.url_prefix(urls.XUL_VOLUME_BUCKETS),{'tab_name':offlineStrings.getString('menu.cmd_edit_volume_buckets.tab')},{});
107                                 }
108                         ],
109                         'cmd_edit_record_buckets' : [
110                                 ['oncommand'],
111                                 function() {
112                                         obj.data.stash_retrieve();
113                                         obj.set_tab(obj.url_prefix(urls.XUL_RECORD_BUCKETS),{'tab_name':offlineStrings.getString('menu.cmd_edit_record_buckets.tab')},{});
114                                 }
115                         ],
116                         'cmd_edit_user_buckets' : [
117                                 ['oncommand'],
118                                 function() {
119                                         obj.data.stash_retrieve();
120                                         obj.set_tab(obj.url_prefix(urls.XUL_USER_BUCKETS),{'tab_name':offlineStrings.getString('menu.cmd_edit_user_buckets.tab')},{});
121                                 }
122                         ],
123
124
125                         'cmd_replace_barcode' : [
126                                 ['oncommand'],
127                                 function() {
128                                         try {
129                                                 JSAN.use('util.network');
130                                                 var network = new util.network();
131
132                                                 var old_bc = window.prompt(offlineStrings.getString('menu.cmd_replace_barcode.prompt'),'',offlineStrings.getString('menu.cmd_replace_barcode.label'));
133                                                 if (!old_bc) return;
134         
135                                                 var copy;
136                         try {
137                             copy = network.simple_request('FM_ACP_RETRIEVE_VIA_BARCODE',[ old_bc ]);
138                                                 if (typeof copy.ilsevent != 'undefined') throw(copy); 
139                                                 if (!copy) throw(copy);
140                         } catch(E) {
141                             alert(offlineStrings.getFormattedString('menu.cmd_replace_barcode.retrieval.error', [old_bc]) + '\n');
142                             return;
143                         }
144         
145                                                 // Why did I want to do this twice?  Because this copy is more fleshed?
146                         try {
147                                                 copy = network.simple_request('FM_ACP_RETRIEVE',[ copy.id() ]);
148                                                 if (typeof copy.ilsevent != 'undefined') throw(copy);
149                                                 if (!copy) throw(copy);
150                         } catch(E) {
151                             try { alert(offlineStrings.getFormattedString('menu.cmd_replace_barcode.retrieval.error', [old_bc]) + '\n' + (typeof E.ilsevent == 'undefined' ? '' : E.textcode + ' : ' + E.desc)); } catch(F) { alert(E + '\n' + F); }
152                             return;
153                         }
154         
155                                                 var new_bc = window.prompt(offlineStrings.getString('menu.cmd_replace_barcode.replacement.prompt'),'',offlineStrings.getString('menu.cmd_replace_barcode.replacement.label'));
156                                                 new_bc = String( new_bc ).replace(/\s/g,'');
157                                                 if (!new_bc) {
158                                                         alert(offlineStrings.getString('menu.cmd_replace_barcode.blank.error'));
159                                                         return;
160                                                 }
161         
162                                                 var test = network.simple_request('FM_ACP_RETRIEVE_VIA_BARCODE',[ new_bc ]);
163                                                 if (typeof test.ilsevent == 'undefined') {
164                                                 alert(offlineStrings.getFormattedString('menu.cmd_replace_barcode.duplicate.error', [new_bc]));
165                                                         return;
166                                                 } else {
167                                                         if (test.ilsevent != 1502 /* ASSET_COPY_NOT_FOUND */) {
168                                                         obj.error.standard_unexpected_error_alert(offlineStrings.getFormattedString('menu.cmd_replace_barcode.testing.error', [new_bc]),test);
169                                                                 return;
170                                                         }       
171                                                 }
172
173                                                 copy.barcode(new_bc); copy.ischanged('1');
174                                                 var r = network.simple_request('FM_ACP_FLESHED_BATCH_UPDATE', [ ses(), [ copy ] ]);
175                                                 if (typeof r.ilsevent != 'undefined') { 
176                             if (r.ilsevent != 0) {
177                                 if (r.ilsevent == 5000 /* PERM_FAILURE */) {
178                                     alert(offlineStrings.getString('menu.cmd_replace_barcode.permission.error'));
179                                 } else {
180                                     obj.error.standard_unexpected_error_alert(offlineStrings.getString('menu.cmd_replace_barcode.renaming.error'),r);
181                                 }
182                             }
183                         }
184                                         } catch(E) {
185                                                 obj.error.standard_unexpected_error_alert(offlineStrings.getString('menu.cmd_replace_barcode.renaming.failure'),copy);
186                                         }
187                                 }
188                         ],
189
190                         /* Search Menu */
191                         'cmd_patron_search' : [
192                                 ['oncommand'],
193                                 function() {
194                                         obj.data.stash_retrieve();
195                                         obj.set_tab(obj.url_prefix(urls.XUL_PATRON_DISPLAY),{},{});
196                                 }
197                         ],
198                         'cmd_search_opac' : [
199                                 ['oncommand'],
200                                 function() {
201                                         obj.data.stash_retrieve();
202                                         var content_params = { 'session' : ses(), 'authtime' : ses('authtime') };
203                                         obj.set_tab(obj.url_prefix(urls.XUL_OPAC_WRAPPER), {'tab_name':offlineStrings.getString('menu.cmd_search_opac.tab')}, content_params);
204                                 }
205                         ],
206                         'cmd_search_tcn' : [
207                                 ['oncommand'],
208                                 function() {
209                                         var tcn = prompt(offlineStrings.getString('menu.cmd_search_tcn.tab'),'',offlineStrings.getString('menu.cmd_search_tcn.prompt'));
210
211                                         function spawn_tcn(r) {
212                                                 for (var i = 0; i < r.count; i++) {
213                                                         var id = r.ids[i];
214                                                         var opac_url = obj.url_prefix( urls.opac_rdetail ) + '?r=' + id;
215                                                         obj.data.stash_retrieve();
216                                                         var content_params = { 
217                                                                 'session' : ses(), 
218                                                                 'authtime' : ses('authtime'),
219                                                                 'opac_url' : opac_url,
220                                                         };
221                                                         if (i == 0) {
222                                                                 obj.set_tab(
223                                                                         obj.url_prefix(urls.XUL_OPAC_WRAPPER), 
224                                                                         {'tab_name':tcn}, 
225                                                                         content_params
226                                                                 );
227                                                         } else {
228                                                                 obj.new_tab(
229                                                                         obj.url_prefix(urls.XUL_OPAC_WRAPPER), 
230                                                                         {'tab_name':tcn}, 
231                                                                         content_params
232                                                                 );
233                                                         }
234                                                 }
235                                         }
236
237                                         if (tcn) {
238                                                 JSAN.use('util.network');
239                                                 var network = new util.network();
240                                                 var robj = network.simple_request('FM_BRE_ID_SEARCH_VIA_TCN',[tcn]);
241                                                 if (robj.count != robj.ids.length) throw('FIXME -- FM_BRE_ID_SEARCH_VIA_TCN = ' + js2JSON(robj));
242                                                 if (robj.count == 0) {
243                                                         var robj2 = network.simple_request('FM_BRE_ID_SEARCH_VIA_TCN',[tcn,1]);
244                                                         if (robj2.count == 0) {
245                                                                 alert(offlineStrings.getFormattedString('menu.cmd_search_tcn.not_found.error', [tcn]));
246                                                         } else {
247                                                                 if ( window.confirm(offlineStrings.getFormattedString('menu.cmd_search_tcn.deleted.error', [tcn])) ) {
248                                                                         spawn_tcn(robj2);
249                                                                 }
250                                                         }
251                                                 } else {
252                                                         spawn_tcn(robj);
253                                                 }
254                                         }
255                                 }
256                         ],
257                         'cmd_search_bib_id' : [
258                                 ['oncommand'],
259                                 function() {
260                                         var bib_id = prompt(offlineStrings.getString('menu.cmd_search_bib_id.tab'),'',offlineStrings.getString('menu.cmd_search_bib_id.prompt'));
261                     if (!bib_id) return;
262
263                                         var opac_url = obj.url_prefix( urls.opac_rdetail ) + '?r=' + bib_id;
264                                         var content_params = { 
265                                                 'session' : ses(), 
266                                                 'authtime' : ses('authtime'),
267                                                 'opac_url' : opac_url,
268                                         };
269                                         obj.set_tab(
270                                                 obj.url_prefix(urls.XUL_OPAC_WRAPPER), 
271                                                 {'tab_name':'#' + bib_id}, 
272                                                 content_params
273                                         );
274                                 }
275                         ],
276                         'cmd_copy_status' : [
277                                 ['oncommand'],
278                                 function() {
279                                         obj.data.stash_retrieve();
280                                         obj.set_tab(obj.url_prefix(urls.XUL_COPY_STATUS),{},{});
281                                 }
282                         ],
283
284                         /* Circulation Menu */
285                         'cmd_patron_register' : [
286                                 ['oncommand'],
287                                 function() {
288                                                                 function spawn_editor(p) {
289                                                                         var url = urls.XUL_PATRON_EDIT;
290                                                                         var param_count = 0;
291                                                                         for (var i in p) {
292                                                                                 if (param_count++ == 0) url += '?'; else url += '&';
293                                                                                 url += i + '=' + window.escape(p[i]);
294                                                                         }
295                                                                         var loc = obj.url_prefix( urls.XUL_REMOTE_BROWSER ) + '?url=' + window.escape( url );
296                                                                         obj.new_tab(
297                                                                                 loc, 
298                                                                                 {}, 
299                                                                                 { 
300                                                                                         'show_print_button' : true , 
301                                                                                         'tab_name' : offline.getString('menu.cmd_patron_register.related.tab'),
302                                                                                         'passthru_content_params' : {
303                                                                                                 'spawn_search' : function(s) { obj.spawn_search(s); },
304                                                                                                 'spawn_editor' : spawn_editor,
305                                                                                         }
306                                                                                 }
307                                                                         );
308                                                                 }
309
310                                         obj.data.stash_retrieve();
311                                         var loc = obj.url_prefix( urls.XUL_REMOTE_BROWSER ) 
312                                                 + '?url=' + window.escape( urls.XUL_PATRON_EDIT + '?ses=' + window.escape( ses() ) );
313                                         obj.set_tab(
314                                                 loc, 
315                                                 {}, 
316                                                 { 
317                                                         'show_print_button' : true , 
318                                                         'tab_name' : offlineStrings.getString('menu.cmd_patron_register.tab'),
319                                                         'passthru_content_params' : {
320                                                                 'spawn_search' : function(s) { obj.spawn_search(s); },
321                                                                 'spawn_editor' : spawn_editor,
322                                                         }
323                                                 }
324                                         );
325                                 }
326                         ],
327                         'cmd_circ_checkin' : [
328                                 ['oncommand'],
329                                 function() { 
330                                         obj.data.stash_retrieve();
331                                         obj.set_tab(obj.url_prefix(urls.XUL_CHECKIN),{},{});
332                                 }
333                         ],
334                         'cmd_circ_checkout' : [
335                                 ['oncommand'],
336                                 function() { 
337                                         obj.data.stash_retrieve();
338                                         obj.set_tab(obj.url_prefix(urls.XUL_PATRON_BARCODE_ENTRY),{},{});
339                                 }
340                         ],
341                         'cmd_circ_hold_capture' : [
342                                 ['oncommand'],
343                                 function() { 
344                                         obj.data.stash_retrieve();
345                                         obj.set_tab(obj.url_prefix(urls.XUL_CHECKIN)+'?hold_capture=1',{},{});
346                                 }
347                         ],
348                         'cmd_browse_holds' : [
349                                 ['oncommand'],
350                                 function() { 
351                                         obj.data.stash_retrieve();
352                                         obj.set_tab(obj.url_prefix(urls.XUL_HOLDS_BROWSER),{ 'tab_name' : offlineStrings.getString('menu.cmd_browse_holds.tab') },{});
353                                 }
354                         ],
355                         'cmd_browse_holds_shelf' : [
356                                 ['oncommand'],
357                                 function() { 
358                                         obj.data.stash_retrieve();
359                                         obj.set_tab(obj.url_prefix(urls.XUL_HOLDS_BROWSER)+'?shelf=1',{ 'tab_name' : offlineStrings.getString('menu.cmd_browse_holds_shelf.tab') },{});
360                                 }
361                         ],
362                         'cmd_circ_hold_pull_list' : [
363                                 ['oncommand'],
364                                 function() { 
365                                         obj.data.stash_retrieve();
366                                         var loc = urls.XUL_REMOTE_BROWSER + '?url=' + window.escape(
367                                                 obj.url_prefix(urls.XUL_HOLD_PULL_LIST) + '?ses='+window.escape(ses())
368                                         );
369                                         obj.set_tab( loc, {'tab_name' : offlineStrings.getString('menu.cmd_browse_hold_pull_list.tab')}, { 'show_print_button' : true } );
370                                 }
371                         ],
372
373                         'cmd_in_house_use' : [
374                                 ['oncommand'],
375                                 function() { 
376                                         obj.data.stash_retrieve();
377                                         obj.set_tab(obj.url_prefix(urls.XUL_IN_HOUSE_USE),{},{});
378                                 }
379                         ],
380
381                         'cmd_standalone' : [
382                                 ['oncommand'],
383                                 function() { 
384                                         obj.set_tab(obj.url_prefix(urls.XUL_STANDALONE),{},{});
385                                 }
386                         ],
387
388                         'cmd_local_admin' : [
389                                 ['oncommand'],
390                                 function() { 
391                                         //obj.set_tab(obj.url_prefix(urls.XUL_LOCAL_ADMIN)+'?ses='+window.escape(ses())+'&session='+window.escape(ses()),{},{});
392                                         var loc = urls.XUL_REMOTE_BROWSER + '?url=' + window.escape(
393                                                 urls.XUL_LOCAL_ADMIN+'?ses='+window.escape(ses())+'&session='+window.escape(ses())
394                                         );
395                                         obj.set_tab( 
396                                                 loc, 
397                                                 {'tab_name' : offlineStrings.getString('menu.cmd_local_admin.tab'), 'browser' : true }, 
398                                                 { 'no_xulG' : false, 'show_nav_buttons' : true, 'show_print_button' : true } 
399                                         );
400
401                                 }
402                         ],
403
404                         'cmd_open_vandelay' : [
405                                 ['oncommand'],
406                                 function() { 
407                                         var loc = urls.XUL_REMOTE_BROWSER + '?url=' + 
408                         window.escape(urls.VANDELAY+'?ses='+window.escape(ses()));
409                                         obj.set_tab( 
410                                                 loc, 
411                                                 {'tab_name' : offlineStrings.getString('menu.cmd_open_vandelay.tab'), 'browser' : true }, 
412                                                 {'no_xulG' : false, 'show_print_button' : false } 
413                                         );
414
415                                 }
416                         ],
417
418                         'cmd_open_conify' : [
419                                 ['oncommand'],
420                                 function() { 
421                                         var loc = urls.XUL_REMOTE_BROWSER + '?url=' + 
422                         window.escape(urls.CONIFY+'?ses='+window.escape(ses()));
423                                         obj.set_tab( 
424                                                 loc, 
425                                                 {'tab_name' : offlineStrings.getString('menu.cmd_open_conify.tab'), 'browser' : true }, 
426                                                 {'no_xulG' : false, 'show_print_button' : false } 
427                                         );
428
429                                 }
430                         ],
431
432                         'cmd_reprint' : [
433                                 ['oncommand'],
434                                 function() {
435                                         try {
436                                                 JSAN.use('util.print'); var print = new util.print();
437                                                 print.reprint_last();
438                                         } catch(E) {
439                                                 alert(E);
440                                         }
441                                 }
442                         ],
443
444                         'cmd_retrieve_last_patron' : [
445                                 ['oncommand'],
446                                 function() {
447                                         obj.data.stash_retrieve();
448                                         if (!obj.data.last_patron) {
449                                                 alert(offlineStrings.getString('menu.cmd_retrieve_last_patron.session.error'));
450                                                 return;
451                                         }
452                                         var url = obj.url_prefix( urls.XUL_PATRON_DISPLAY ); // + '?id=' + window.escape( obj.data.last_patron ) );
453                                         obj.set_tab( url, {}, { 'id' : obj.data.last_patron } );
454                                 }
455                         ],
456                         
457                         'cmd_retrieve_last_record' : [
458                                 ['oncommand'],
459                                 function() {
460                                         obj.data.stash_retrieve();
461                                         if (!obj.data.last_record) {
462                                                 alert(offlineStrings.getString('menu.cmd_retrieve_last_record.session.error'));
463                                                 return;
464                                         }
465                                         var opac_url = obj.url_prefix( urls.opac_rdetail ) + '?r=' + obj.data.last_record;
466                                         var content_params = {
467                                                 'session' : ses(),
468                                                 'authtime' : ses('authtime'),
469                                                 'opac_url' : opac_url,
470                                         };
471                                         obj.set_tab(
472                                                 obj.url_prefix(urls.XUL_OPAC_WRAPPER),
473                                                 {'tab_name' : offlineStrings.getString('menu.cmd_retrieve_last_record.status')},
474                                                 content_params
475                                         );
476                                 }
477                         ],
478
479             'cmd_verify_credentials' : [
480                 ['oncommand'],
481                 function() {
482                                         obj.set_tab(
483                                                 obj.url_prefix(urls.XUL_VERIFY_CREDENTIALS),
484                                                 { 'tab_name' : offlineStrings.getString('menu.cmd_verify_credentials.tabname') },
485                                                 {}
486                                         );
487                 }
488             ],
489
490                         /* Cataloging Menu */
491                         'cmd_z39_50_import' : [
492                                 ['oncommand'],
493                                 function() {
494                                         obj.data.stash_retrieve();
495                                         obj.set_tab(obj.url_prefix(urls.XUL_Z3950_IMPORT),{},{});
496                                 }
497                         ],
498                         'cmd_create_marc' : [
499                                 ['oncommand'],
500                                 function() {
501                                         obj.data.stash_retrieve();
502                                         obj.set_tab(obj.url_prefix(urls.XUL_MARC_NEW),{},{});
503                                 }
504                         ],
505
506                         /* Admin menu */
507                         'cmd_change_session' : [
508                                 ['oncommand'],
509                                 function() {
510                                         try {
511                                                 obj.data.stash_retrieve();
512                                                 JSAN.use('util.network'); var network = new util.network();
513                                                 var x = document.getElementById('oc_menuitem');
514                                                 var x_label = x.getAttribute('label_orig');
515                                                 var temp_au = js2JSON( obj.data.list.au[0] );
516                                                 var temp_ses = js2JSON( obj.data.session );
517                                                 if (obj.data.list.au.length > 1) {
518                                                         obj.data.list.au = [ obj.data.list.au[1] ];
519                                                         obj.data.stash('list');
520                                                         network.reset_titlebars( obj.data );
521                                                         x.setAttribute('label', x_label );
522                                                         network.simple_request('AUTH_DELETE', [ obj.data.session.key ] );
523                                                         obj.data.session = obj.data.previous_session;
524                                                         obj.data.stash('session');
525                                             try {
526                                 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
527                                                                 var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
528                                                                 var cookieUri = ios.newURI("http://" + obj.data.server_unadorned, null, null);
529                                                                 var cookieUriSSL = ios.newURI("https://" + obj.data.server_unadorned, null, null);
530                                                                 var cookieSvc = Components.classes["@mozilla.org/cookieService;1"].getService(Components.interfaces.nsICookieService);
531
532                                                                 cookieSvc.setCookieString(cookieUri, null, "ses="+obj.data.session.key, null);
533                                                                 cookieSvc.setCookieString(cookieUriSSL, null, "ses="+obj.data.session.key, null);
534
535                                             } catch(E) {
536                                                     alert(offlineStrings.getFormattedString(main.session_cookie.error, [E]));
537                                             }
538
539                                                         removeCSSClass(document.getElementById('main_tabbox'),'operator_change');
540                                                 } else {
541                                                         if (network.get_new_session(offlineStrings.getString('menu.cmd_chg_session.label'),{'url_prefix':obj.url_prefix})) {
542                                                                 obj.data.stash_retrieve();
543                                                                 obj.data.list.au[1] = JSON2js( temp_au );
544                                                                 obj.data.stash('list');
545                                                                 obj.data.previous_session = JSON2js( temp_ses );
546                                                                 obj.data.stash('previous_session');
547                                                                 x.setAttribute('label', offlineStrings.getFormattedString('menu.cmd_chg_session.operator.label', [obj.data.list.au[1].usrname()]) );
548                                                                 addCSSClass(document.getElementById('main_tabbox'),'operator_change');
549                                                         }
550                                                 }
551                                         } catch(E) {
552                                                 obj.error.standard_unexpected_error_alert('cmd_change_session',E);
553                                         }
554                                 }
555                         ],
556                         'cmd_manage_offline_xacts' : [
557                                 ['oncommand'],
558                                 function() {
559                                         obj.set_tab(obj.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS), {'tab_name' : offlineStrings.getString('menu.cmd_manage_offline_xacts.tab')}, {});
560                                 }
561                         ],
562                         'cmd_download_patrons' : [
563                                 ['oncommand'],
564                                 function() {
565                                         try {
566                                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
567                                                 var x = new XMLHttpRequest();
568                                                 var url = 'http://' + XML_HTTP_SERVER + '/standalone/list.txt';
569                                                 x.open("GET",url,false);
570                                                 x.send(null);
571                                                 if (x.status == 200) {
572                                                         JSAN.use('util.file'); var file = new util.file('offline_patron_list');
573                                                         file.write_content('truncate',x.responseText);
574                                                         file.close();
575                                                         file = new util.file('offline_patron_list.date');
576                                                         file.write_content('truncate',new Date());
577                                                         file.close();
578                                                         alert(offlineStrings.getString('menu.cmd_download_patrons.complete.status'));
579                                                 } else {
580                                                         alert(offlineStrings.getFormattedString('menu.cmd_download_patrons.error', [x.status, x.statusText]));
581                                                 }
582                                         } catch(E) {
583                                                 obj.error.standard_unexpected_error_alert('cmd_download_patrons',E);
584                                         }
585                                 }
586                         ],
587                         'cmd_adv_user_edit' : [
588                                 ['oncommand'],
589                                 function() {
590                                         obj.data.stash_retrieve();
591                                         obj.set_tab(obj.url_prefix(urls.XUL_PATRON_BARCODE_ENTRY), {}, { 'perm_editor' : true });
592                                 }
593                         ],
594                         'cmd_print_list_template_edit' : [
595                                 ['oncommand'],
596                                 function() {
597                                         obj.data.stash_retrieve();
598                                         obj.set_tab(obj.url_prefix(urls.XUL_PRINT_LIST_TEMPLATE_EDITOR), {}, {});
599                                 }
600                         ],
601                         'cmd_stat_cat_edit' : [
602                                 ['oncommand'],
603                                 function() {
604                                         obj.data.stash_retrieve();
605                                         obj.set_tab(obj.url_prefix(urls.XUL_STAT_CAT_EDIT) + '?ses='+window.escape(ses()), {'tab_name' : offlineStrings.getString('menu.cmd_stat_cat_edit.tab')},{});
606                                 }
607                         ],
608                         'cmd_non_cat_type_edit' : [
609                                 ['oncommand'],
610                                 function() {
611                                         obj.data.stash_retrieve();
612                                         obj.set_tab(obj.url_prefix(urls.XUL_NON_CAT_LABEL_EDIT) + '?ses='+window.escape(ses()), {'tab_name' : offlineStrings.getString('menu.cmd_non_cat_type_edit.tab')},{});
613                                 }
614                         ],
615                         'cmd_copy_location_edit' : [
616                                 ['oncommand'],
617                                 function() {
618                                         obj.data.stash_retrieve();
619                                         obj.set_tab(obj.url_prefix(urls.XUL_COPY_LOCATION_EDIT) + '?ses='+window.escape(ses()),{'tab_name' : offlineStrings.getString('menu.cmd_copy_location_edit.tab')},{});
620                                 }
621                         ],
622                         'cmd_test' : [
623                                 ['oncommand'],
624                                 function() {
625                                         obj.data.stash_retrieve();
626                                         var content_params = { 'session' : ses(), 'authtime' : ses('authtime') };
627                                         obj.set_tab(obj.url_prefix(urls.XUL_OPAC_WRAPPER), {}, content_params);
628                                 }
629                         ],
630                         'cmd_test_html' : [
631                                 ['oncommand'],
632                                 function() {
633                                         obj.data.stash_retrieve();
634                                         obj.set_tab(obj.url_prefix(urls.TEST_HTML) + '?ses='+window.escape(ses()),{ 'browser' : true },{});
635                                 }
636                         ],
637                         'cmd_test_xul' : [
638                                 ['oncommand'],
639                                 function() {
640                                         obj.data.stash_retrieve();
641                                         obj.set_tab(obj.url_prefix(urls.TEST_XUL) + '?ses='+window.escape(ses()),{ 'browser' : true },{});
642                                 }
643                         ],
644                         'cmd_console' : [
645                                 ['oncommand'],
646                                 function() {
647                                         obj.set_tab(obj.url_prefix(urls.XUL_DEBUG_CONSOLE),{'tab_name' : offlineStrings.getString('menu.cmd_console.tab')},{});
648                                 }
649                         ],
650                         'cmd_shell' : [
651                                 ['oncommand'],
652                                 function() {
653                                         obj.set_tab(obj.url_prefix(urls.XUL_DEBUG_SHELL),{'tab_name' : offlineStrings.getString('menu.cmd_shell.tab')},{});
654                                 }
655                         ],
656                         'cmd_xuleditor' : [
657                                 ['oncommand'],
658                                 function() {
659                                         obj.set_tab(obj.url_prefix(urls.XUL_DEBUG_XULEDITOR),{'tab_name' : offlineStrings.getString('menu.cmd_xuleditor.tab')},{});
660                                 }
661                         ],
662                         'cmd_fieldmapper' : [
663                                 ['oncommand'],
664                                 function() {
665                                         obj.set_tab(obj.url_prefix(urls.XUL_DEBUG_FIELDMAPPER),{'tab_name' : offlineStrings.getString('menu.cmd_fieldmapper.tab')},{});
666                                 }
667                         ],
668                         'cmd_survey_wizard' : [
669                                 ['oncommand'],
670                                 function() {
671                                         obj.data.stash_retrieve();
672                                         xulG.window.open(obj.url_prefix(urls.XUL_SURVEY_WIZARD),'survey_wizard','chrome'); 
673                                 }
674                         ],
675                         'cmd_public_opac' : [
676                                 ['oncommand'],
677                                 function() {
678                                         var loc = urls.XUL_REMOTE_BROWSER + '?url=' + window.escape(
679                                                 urls.remote
680                                         );
681                                         obj.set_tab( 
682                                                 loc, 
683                                                 {'tab_name' : offlineStrings.getString('menu.cmd_public_opac.tab'), 'browser' : true}, 
684                                                 { 'no_xulG' : true, 'show_nav_buttons' : true, 'show_print_button' : true } 
685                                         );
686                                 }
687                         ],
688                         'cmd_clear_cache' : [
689                                 ['oncommand'],
690                                 function clear_the_cache() {
691                                         try {
692                         netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
693                                                 var cacheClass          = Components.classes["@mozilla.org/network/cache-service;1"];
694                                                 var cacheService        = cacheClass.getService(Components.interfaces.nsICacheService);
695                                                 cacheService.evictEntries(Components.interfaces.nsICache.STORE_ON_DISK);
696                                                 cacheService.evictEntries(Components.interfaces.nsICache.STORE_IN_MEMORY);
697                                         } catch(E) {
698                                                 dump(E+'\n');alert(E);
699                                         }
700                                 }
701                         ],
702                         'cmd_restore_all_tabs' : [
703                                 ['oncommand'],
704                                 function() {
705                                         var tabs = obj.controller.view.tabs;
706                                         for (var i = 0; i < tabs.childNodes.length; i++) {
707                                                 tabs.childNodes[i].hidden = false;
708                                         }
709                                 }
710                         ],
711                         'cmd_extension_manager' : [
712                                 ['oncommand'],
713                                 function() {
714                                         obj.set_tab('chrome://mozapps/content/extensions/extensions.xul?type=extensions',{'tab_name' : offlineStrings.getString('menu.cmd_extension_manager.tab')},{});
715                                 }
716                         ],
717                         'cmd_theme_manager' : [
718                                 ['oncommand'],
719                                 function() {
720                                         obj.set_tab('chrome://mozapps/content/extensions/extensions.xul?type=themes',{'tab_name' : offlineStrings.getString('menu.cmd_theme_manager.tab')},{});
721                                 }
722                         ],
723                         'cmd_about_config' : [
724                                 ['oncommand'],
725                                 function() {
726                                         obj.set_tab('chrome://global/content/config.xul',{'tab_name' : 'about:config'},{});
727                                 }
728                         ],
729                         'cmd_shutdown' : [
730                                 ['oncommand'],
731                                 function() {
732                                         if (window.confirm(offlineStrings.getString('menu.cmd_shutdown.prompt'))) {
733                         netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
734                                                 var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
735                                                 var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
736                                                 var enumerator = windowManagerInterface.getEnumerator(null);
737                                                 var w; // close all other windows
738                                                 while ( w = enumerator.getNext() ) {
739                                                         if (w != window) w.close();
740                                                 }
741                                                 window.close();
742                                         }
743                                 }
744                         ],
745                 };
746
747                 JSAN.use('util.controller');
748                 var cmd;
749                 obj.controller = new util.controller();
750                 obj.controller.init( { 'window_knows_me_by' : 'g.menu.controller', 'control_map' : cmd_map } );
751
752                 obj.controller.view.tabbox = window.document.getElementById('main_tabbox');
753                 obj.controller.view.tabs = obj.controller.view.tabbox.firstChild;
754                 obj.controller.view.panels = obj.controller.view.tabbox.lastChild;
755
756                 obj.new_tab(null,{'focus':true},null);
757
758                 obj.init_tab_focus_handlers();
759         },
760
761         'spawn_search' : function(s) {
762                 var obj = this;
763                 obj.error.sdump('D_TRACE', offlineStrings.getFormattedString('menu.spawn_search.msg', [js2JSON(s)]) ); 
764                 obj.data.stash_retrieve();
765                 var loc = obj.url_prefix(urls.XUL_PATRON_DISPLAY);
766                 loc += '?doit=1&query=' + window.escape(js2JSON(s));
767                 obj.new_tab( loc, {}, {} );
768         },
769
770         'init_tab_focus_handlers' : function() {
771                 var obj = this;
772                 for (var i = 0; i < obj.controller.view.tabs.childNodes.length; i++) {
773                         var tab = obj.controller.view.tabs.childNodes[i];
774                         var panel = obj.controller.view.panels.childNodes[i];
775                         tab.addEventListener(
776                                 'command',
777                                 function(p) {
778                                         return function() {
779                                                 try {
780                                                                 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
781                                                                 if (p
782                                                                         && p.firstChild 
783                                                                         && ( p.firstChild.nodeName == 'iframe' || p.firstChild.nodeName == 'browser' )
784                                                                         && p.firstChild.contentWindow 
785                                                                 ) {
786                                                                         if (typeof p.firstChild.contentWindow.default_focus == 'function') {
787                                                                                 p.firstChild.contentWindow.default_focus();
788                                                                         } else {
789                                                                                 //p.firstChild.contentWindow.firstChild.focus();
790                                                                         }
791                                                                 }
792                                                 } catch(E) {
793                                                         obj.error.sdump('D_ERROR','init_tab_focus_handler: ' + js2JSON(E));
794                                                 }
795                                         }
796                                 }(panel),
797                                 false
798                         );
799                 }
800         },
801
802         'close_all_tabs' : function() {
803                 var obj = this;
804                 try {
805                         var count = obj.controller.view.tabs.childNodes.length;
806                         for (var i = 0; i < count; i++) obj.close_tab();
807                         setTimeout( function(){ obj.controller.view.tabs.firstChild.focus(); }, 0);
808                 } catch(E) {
809                         obj.error.standard_unexpected_error_alert(offlineStrings.getString('menu.close_all_tabs.error'),E);
810                 }
811         },
812
813         'close_tab' : function () {
814                 var idx = this.controller.view.tabs.selectedIndex;
815                 var tab = this.controller.view.tabs.childNodes[idx];
816                 var panel = this.controller.view.panels.childNodes[ idx ];
817                 while ( panel.lastChild ) panel.removeChild( panel.lastChild );
818                 if (idx == 0) {
819                         try {
820                                 this.controller.view.tabs.advanceSelectedTab(+1);
821                         } catch(E) {
822                                 this.error.sdump('D_TAB','failed tabs.advanceSelectedTab(+1):'+js2JSON(E) + '\n');
823                                 try {
824                                         this.controller.view.tabs.advanceSelectedTab(-1);
825                                 } catch(E) {
826                                         this.error.sdump('D_TAB','failed again tabs.advanceSelectedTab(-1):'+
827                                                 js2JSON(E) + '\n');
828                                 }
829                         }
830                 } else {
831                         try {
832                                 this.controller.view.tabs.advanceSelectedTab(-1);
833                         } catch(E) {
834                                 this.error.sdump('D_TAB','failed tabs.advanceSelectedTab(-1):'+js2JSON(E) + '\n');
835                                 try {
836                                         this.controller.view.tabs.advanceSelectedTab(+1);
837                                 } catch(E) {
838                                         this.error.sdump('D_TAB','failed again tabs.advanceSelectedTab(+1):'+
839                                                 js2JSON(E) + '\n');
840                                 }
841                         }
842
843                 }
844                 
845                 this.error.sdump('D_TAB','\tnew tabbox.selectedIndex = ' + this.controller.view.tabbox.selectedIndex + '\n');
846
847                 this.controller.view.tabs.childNodes[ idx ].hidden = true;
848                 this.error.sdump('D_TAB','tabs.childNodes[ ' + idx + ' ].hidden = true;\n');
849
850                 // Make sure we keep at least one tab open.
851                 var tab_flag = true;
852                 for (var i = 0; i < this.controller.view.tabs.childNodes.length; i++) {
853                         var tab = this.controller.view.tabs.childNodes[i];
854                         if (!tab.hidden)
855                                 tab_flag = false;
856                 }
857                 if (tab_flag) {
858                         this.controller.view.tabs.selectedIndex = 0;
859                         this.new_tab(); 
860                 }
861         },
862
863         'find_free_tab' : function() {
864                 var last_not_hidden = -1;
865                 for (var i = 0; i<this.controller.view.tabs.childNodes.length; i++) {
866                         var tab = this.controller.view.tabs.childNodes[i];
867                         if (!tab.hidden)
868                                 last_not_hidden = i;
869                 }
870                 if (last_not_hidden == this.controller.view.tabs.childNodes.length - 1)
871                         last_not_hidden = -1;
872                 // If the one next to last_not_hidden is hidden, we want it.
873                 // Basically, we fill in tabs after existing tabs for as 
874                 // long as possible.
875                 var idx = last_not_hidden + 1;
876                 var candidate = this.controller.view.tabs.childNodes[ idx ];
877                 if (candidate.hidden)
878                         return idx;
879                 // Alright, find the first hidden then
880                 for (var i = 0; i<this.controller.view.tabs.childNodes.length; i++) {
881                         var tab = this.controller.view.tabs.childNodes[i];
882                         if (tab.hidden)
883                                 return i;
884                 }
885                 return -1;
886         },
887
888         'new_tab' : function(url,params,content_params) {
889                 var tc = this.find_free_tab();
890                 if (tc == -1) { return null; } // 9 tabs max
891                 var tab = this.controller.view.tabs.childNodes[ tc ];
892                 tab.hidden = false;
893                 if (!content_params) content_params = {};
894                 if (!params) params = {};
895                 if (!params.tab_name) params.tab_name = offlineStrings.getString('menu.new_tab.tab');
896                 if (!params.nofocus) params.focus = true; /* make focus the default */
897                 try {
898                         if (params.focus) this.controller.view.tabs.selectedIndex = tc;
899                         params.index = tc;
900                         this.set_tab(url,params,content_params);
901                 } catch(E) {
902                         this.error.sdump('D_ERROR',E);
903                 }
904         },
905
906     'network_meter' : {
907         'inc' : function(app,method) {
908             try {
909                 var m = document.getElementById('network_progress');
910                 var count = 1 + Number( m.getAttribute('count') );
911                 m.setAttribute('mode','undetermined');
912                 m.setAttribute('count', count);
913                 var rows = document.getElementById('network_progress_rows');
914                 var row = document.getElementById('network_progress_tip_'+app+'_'+method);
915                 if (!row) {
916                     row = document.createElement('row'); row.setAttribute('id','network_progress_tip_'+app+'_'+method);
917                     var a = document.createElement('label'); a.setAttribute('value','App:');
918                     var b = document.createElement('label'); b.setAttribute('value',app);
919                     var c = document.createElement('label'); c.setAttribute('value','Method:');
920                     var d = document.createElement('label'); d.setAttribute('value',method);
921                     var e = document.createElement('label'); e.setAttribute('value','Total:');
922                     var f = document.createElement('label'); f.setAttribute('value','0'); 
923                     f.setAttribute('id','network_progress_tip_total_'+app+'_'+method);
924                     var g = document.createElement('label'); g.setAttribute('value','Outstanding:');
925                     var h = document.createElement('label'); h.setAttribute('value','0');
926                     h.setAttribute('id','network_progress_tip_out_'+app+'_'+method);
927                     row.appendChild(a); row.appendChild(b); row.appendChild(c);
928                     row.appendChild(d); row.appendChild(e); row.appendChild(f);
929                     row.appendChild(g); row.appendChild(h); rows.appendChild(row);
930                 }
931                 var total = document.getElementById('network_progress_tip_total_'+app+'_'+method);
932                 if (total) {
933                     total.setAttribute('value', 1 + Number( total.getAttribute('value') ));
934                 }
935                 var out = document.getElementById('network_progress_tip_out_'+app+'_'+method);
936                 if (out) {
937                     out.setAttribute('value', 1 + Number( out.getAttribute('value') ));
938                 }
939             } catch(E) {
940                 dump('network_meter.inc(): ' + E + '\n');
941             }
942         },
943         'dec' : function(app,method) {
944             try {
945                 var m = document.getElementById('network_progress');
946                 var count = -1 + Number( m.getAttribute('count') );
947                 if (count < 0) count = 0;
948                 if (count == 0) m.setAttribute('mode','determined');
949                 m.setAttribute('count', count);
950                 var out = document.getElementById('network_progress_tip_out_'+app+'_'+method);
951                 if (out) {
952                     out.setAttribute('value', -1 + Number( out.getAttribute('value') ));
953                 }
954             } catch(E) {
955                 dump('network_meter.dec(): ' + E + '\n');
956             }
957         }
958     },
959
960         'set_tab' : function(url,params,content_params) {
961                 var obj = this;
962                 if (!url) url = '/xul/server/';
963                 if (!url.match(/:\/\//) && !url.match(/^data:/)) url = urls.remote + url;
964                 if (!params) params = {};
965                 if (!content_params) content_params = {};
966                 var idx = this.controller.view.tabs.selectedIndex;
967                 if (params && typeof params.index != 'undefined') idx = params.index;
968                 var tab = this.controller.view.tabs.childNodes[ idx ];
969                 if (params.focus) tab.focus();
970                 var panel = this.controller.view.panels.childNodes[ idx ];
971                 while ( panel.lastChild ) panel.removeChild( panel.lastChild );
972
973                 content_params.new_tab = function(a,b,c) { return obj.new_tab(a,b,c); };
974                 content_params.set_tab = function(a,b,c) { return obj.set_tab(a,b,c); };
975                 content_params.set_tab_name = function(name) { tab.setAttribute('label',(idx + 1) + ' ' + name); };
976                 content_params.open_chrome_window = function(a,b,c) { return xulG.window.open(a,b,c); };
977                 content_params.url_prefix = function(url) { return obj.url_prefix(url); };
978         content_params.network_meter = obj.network_meter;
979         content_params.chrome_xulG = xulG;
980                 if (params && params.tab_name) content_params.set_tab_name( params.tab_name );
981                 
982                 var frame;
983                 try {
984                         if (params && typeof params.browser != 'undefined') {
985                                 obj.id_incr++;
986                                 frame = this.w.document.createElement('browser');
987                                 frame.setAttribute('flex','1');
988                                 frame.setAttribute('type','content');
989                                 frame.setAttribute('id','frame_'+obj.id_incr);
990                                 panel.appendChild(frame);
991                                 try {
992                                         dump('creating browser with src = ' + url + '\n');
993                                         JSAN.use('util.browser');
994                                         var b = new util.browser();
995                                         b.init(
996                                                 {
997                                                         'url' : url,
998                                                         'push_xulG' : true,
999                                                         'alt_print' : false,
1000                                                         'browser_id' : 'frame_'+obj.id_incr,
1001                                                         'passthru_content_params' : content_params,
1002                                                 }
1003                                         );
1004                                 } catch(E) {
1005                                         alert(E);
1006                                 }
1007                         } else {
1008                                 frame = this.w.document.createElement('iframe');
1009                                 frame.setAttribute('flex','1');
1010                                 panel.appendChild(frame);
1011                                 dump('creating iframe with src = ' + url + '\n');
1012                                 frame.setAttribute('src',url);
1013                                 try {
1014                                         netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
1015                                         var cw = frame.contentWindow;
1016                                         if (typeof cw.wrappedJSObject != 'undefined') cw = cw.wrappedJSObject;
1017                                         cw.IAMXUL = true;
1018                                         cw.xulG = content_params;
1019                                 } catch(E) {
1020                                         this.error.sdump('D_ERROR', 'main.menu: ' + E);
1021                                 }
1022                         }
1023                 } catch(E) {
1024                         this.error.sdump('D_ERROR', 'main.menu:2: ' + E);
1025                         alert(offlineStrings.getString('menu.set_tab.error'));
1026                 }
1027
1028                 return frame;
1029         }
1030
1031 }
1032
1033 dump('exiting main/menu.js\n');