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