]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/chrome/content/main/menu.js
Bring more i18n love to chrome/main
[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_copy_status' : [
234                                 ['oncommand'],
235                                 function() {
236                                         obj.data.stash_retrieve();
237                                         obj.set_tab(obj.url_prefix(urls.XUL_COPY_STATUS),{},{});
238                                 }
239                         ],
240
241                         /* Circulation Menu */
242                         'cmd_patron_register' : [
243                                 ['oncommand'],
244                                 function() {
245                                                                 function spawn_editor(p) {
246                                                                         var url = urls.XUL_PATRON_EDIT;
247                                                                         var param_count = 0;
248                                                                         for (var i in p) {
249                                                                                 if (param_count++ == 0) url += '?'; else url += '&';
250                                                                                 url += i + '=' + window.escape(p[i]);
251                                                                         }
252                                                                         var loc = obj.url_prefix( urls.XUL_REMOTE_BROWSER ) + '?url=' + window.escape( url );
253                                                                         obj.new_tab(
254                                                                                 loc, 
255                                                                                 {}, 
256                                                                                 { 
257                                                                                         'show_print_button' : true , 
258                                                                                         'tab_name' : offline.getString('menu.cmd_patron_register.related.tab'),
259                                                                                         'passthru_content_params' : {
260                                                                                                 'spawn_search' : function(s) { obj.spawn_search(s); },
261                                                                                                 'spawn_editor' : spawn_editor,
262                                                                                         }
263                                                                                 }
264                                                                         );
265                                                                 }
266
267                                         obj.data.stash_retrieve();
268                                         var loc = obj.url_prefix( urls.XUL_REMOTE_BROWSER ) 
269                                                 + '?url=' + window.escape( urls.XUL_PATRON_EDIT + '?ses=' + window.escape( ses() ) );
270                                         obj.set_tab(
271                                                 loc, 
272                                                 {}, 
273                                                 { 
274                                                         'show_print_button' : true , 
275                                                         'tab_name' : offlineStrings.getString('menu.cmd_patron_register.tab'),
276                                                         'passthru_content_params' : {
277                                                                 'spawn_search' : function(s) { obj.spawn_search(s); },
278                                                                 'spawn_editor' : spawn_editor,
279                                                         }
280                                                 }
281                                         );
282                                 }
283                         ],
284                         'cmd_circ_checkin' : [
285                                 ['oncommand'],
286                                 function() { 
287                                         obj.data.stash_retrieve();
288                                         obj.set_tab(obj.url_prefix(urls.XUL_CHECKIN),{},{});
289                                 }
290                         ],
291                         'cmd_circ_checkout' : [
292                                 ['oncommand'],
293                                 function() { 
294                                         obj.data.stash_retrieve();
295                                         obj.set_tab(obj.url_prefix(urls.XUL_PATRON_BARCODE_ENTRY),{},{});
296                                 }
297                         ],
298                         'cmd_circ_hold_capture' : [
299                                 ['oncommand'],
300                                 function() { 
301                                         obj.data.stash_retrieve();
302                                         obj.set_tab(obj.url_prefix(urls.XUL_CHECKIN)+'?hold_capture=1',{},{});
303                                 }
304                         ],
305                         'cmd_browse_holds' : [
306                                 ['oncommand'],
307                                 function() { 
308                                         obj.data.stash_retrieve();
309                                         obj.set_tab(obj.url_prefix(urls.XUL_HOLDS_BROWSER),{ 'tab_name' : offlineStrings.getString('menu.cmd_browse_holds.tab') },{});
310                                 }
311                         ],
312                         'cmd_browse_holds_shelf' : [
313                                 ['oncommand'],
314                                 function() { 
315                                         obj.data.stash_retrieve();
316                                         obj.set_tab(obj.url_prefix(urls.XUL_HOLDS_BROWSER)+'?shelf=1',{ 'tab_name' : offlineStrings.getString('menu.cmd_browse_holds_shelf.tab') },{});
317                                 }
318                         ],
319                         'cmd_circ_hold_pull_list' : [
320                                 ['oncommand'],
321                                 function() { 
322                                         obj.data.stash_retrieve();
323                                         var loc = urls.XUL_REMOTE_BROWSER + '?url=' + window.escape(
324                                                 obj.url_prefix(urls.XUL_HOLD_PULL_LIST) + '?ses='+window.escape(ses())
325                                         );
326                                         obj.set_tab( loc, {'tab_name' : offlineStrings.getString('menu.cmd_browse_hold_pull_list.tab')}, { 'show_print_button' : true, } );
327                                 }
328                         ],
329
330                         'cmd_in_house_use' : [
331                                 ['oncommand'],
332                                 function() { 
333                                         obj.data.stash_retrieve();
334                                         obj.set_tab(obj.url_prefix(urls.XUL_IN_HOUSE_USE),{},{});
335                                 }
336                         ],
337
338                         'cmd_standalone' : [
339                                 ['oncommand'],
340                                 function() { 
341                                         obj.set_tab(obj.url_prefix(urls.XUL_STANDALONE),{},{});
342                                 }
343                         ],
344
345                         'cmd_local_admin' : [
346                                 ['oncommand'],
347                                 function() { 
348                                         //obj.set_tab(obj.url_prefix(urls.XUL_LOCAL_ADMIN)+'?ses='+window.escape(ses())+'&session='+window.escape(ses()),{},{});
349                                         var loc = urls.XUL_REMOTE_BROWSER + '?url=' + window.escape(
350                                                 urls.XUL_LOCAL_ADMIN+'?ses='+window.escape(ses())+'&session='+window.escape(ses())
351                                         );
352                                         obj.set_tab( 
353                                                 loc, 
354                                                 {'tab_name' : offlineStrings.getString('menu.cmd_local_admin.tab'), 'browser' : true }, 
355                                                 { 'no_xulG' : false, 'show_nav_buttons' : true, 'show_print_button' : true } 
356                                         );
357
358                                 }
359                         ],
360
361                         'cmd_reprint' : [
362                                 ['oncommand'],
363                                 function() {
364                                         try {
365                                                 JSAN.use('util.print'); var print = new util.print();
366                                                 print.reprint_last();
367                                         } catch(E) {
368                                                 alert(E);
369                                         }
370                                 }
371                         ],
372
373                         'cmd_retrieve_last_patron' : [
374                                 ['oncommand'],
375                                 function() {
376                                         obj.data.stash_retrieve();
377                                         if (!obj.data.last_patron) {
378                                                 alert(offlineStrings.getString('menu.cmd_retrieve_last_patron.session.error'));
379                                                 return;
380                                         }
381                                         var url = obj.url_prefix( urls.XUL_PATRON_DISPLAY ); // + '?id=' + window.escape( obj.data.last_patron ) );
382                                         obj.set_tab( url, {}, { 'id' : obj.data.last_patron } );
383                                 }
384                         ],
385                         
386                         'cmd_retrieve_last_record' : [
387                                 ['oncommand'],
388                                 function() {
389                                         obj.data.stash_retrieve();
390                                         if (!obj.data.last_record) {
391                                                 alert(offlineStrings.getString('menu.cmd_retrieve_last_record.session.error'));
392                                                 return;
393                                         }
394                                         var opac_url = obj.url_prefix( urls.opac_rdetail ) + '?r=' + obj.data.last_record;
395                                         var content_params = {
396                                                 'session' : ses(),
397                                                 'authtime' : ses('authtime'),
398                                                 'opac_url' : opac_url,
399                                         };
400                                         obj.set_tab(
401                                                 obj.url_prefix(urls.XUL_OPAC_WRAPPER),
402                                                 {'tab_name' : offlineStrings.getString('menu.cmd_retrieve_last_record.status')},
403                                                 content_params
404                                         );
405                                 }
406                         ],
407
408
409                         /* Cataloging Menu */
410                         'cmd_z39_50_import' : [
411                                 ['oncommand'],
412                                 function() {
413                                         obj.data.stash_retrieve();
414                                         obj.set_tab(obj.url_prefix(urls.XUL_Z3950_IMPORT),{},{});
415                                 }
416                         ],
417                         'cmd_create_marc' : [
418                                 ['oncommand'],
419                                 function() {
420                                         obj.data.stash_retrieve();
421                                         obj.set_tab(obj.url_prefix(urls.XUL_MARC_NEW),{},{});
422                                 }
423                         ],
424
425                         /* Admin menu */
426                         'cmd_change_session' : [
427                                 ['oncommand'],
428                                 function() {
429                                         try {
430                                                 obj.data.stash_retrieve();
431                                                 JSAN.use('util.network'); var network = new util.network();
432                                                 var x = document.getElementById('oc_menuitem');
433                                                 var x_label = x.getAttribute('label_orig');
434                                                 var temp_au = js2JSON( obj.data.list.au[0] );
435                                                 var temp_ses = js2JSON( obj.data.session );
436                                                 if (obj.data.list.au.length > 1) {
437                                                         obj.data.list.au = [ obj.data.list.au[1] ];
438                                                         obj.data.stash('list');
439                                                         network.reset_titlebars( obj.data );
440                                                         x.setAttribute('label', x_label );
441                                                         network.simple_request('AUTH_DELETE', [ obj.data.session.key ] );
442                                                         obj.data.session = obj.data.previous_session;
443                                                         obj.data.stash('session');
444                                                         removeCSSClass(document.getElementById('main_tabbox'),'operator_change');
445                                                 } else {
446                                                         if (network.get_new_session(offlineStrings.getString('menu.cmd_chg_session.label'),{'url_prefix':obj.url_prefix})) {
447                                                                 obj.data.stash_retrieve();
448                                                                 obj.data.list.au[1] = JSON2js( temp_au );
449                                                                 obj.data.stash('list');
450                                                                 obj.data.previous_session = JSON2js( temp_ses );
451                                                                 obj.data.stash('previous_session');
452                                                                 x.setAttribute('label', offlineStrings.getFormattedString('menu.cmd_chg_session.operator.label', [obj.data.list.au[1].usrname()]) );
453                                                                 addCSSClass(document.getElementById('main_tabbox'),'operator_change');
454                                                         }
455                                                 }
456                                         } catch(E) {
457                                                 obj.error.standard_unexpected_error_alert('cmd_change_session',E);
458                                         }
459                                 }
460                         ],
461                         'cmd_manage_offline_xacts' : [
462                                 ['oncommand'],
463                                 function() {
464                                         obj.set_tab(obj.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS), {'tab_name' : offlineStrings.getString('menu.cmd_manage_offline_xacts.tab')}, {});
465                                 }
466                         ],
467                         'cmd_download_patrons' : [
468                                 ['oncommand'],
469                                 function() {
470                                         try {
471                                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
472                                                 var x = new XMLHttpRequest();
473                                                 var url = 'http://' + XML_HTTP_SERVER + '/standalone/list.txt';
474                                                 x.open("GET",url,false);
475                                                 x.send(null);
476                                                 if (x.status == 200) {
477                                                         JSAN.use('util.file'); var file = new util.file('offline_patron_list');
478                                                         file.write_content('truncate',x.responseText);
479                                                         file.close();
480                                                         file = new util.file('offline_patron_list.date');
481                                                         file.write_content('truncate',new Date());
482                                                         file.close();
483                                                         alert(offlineStrings.getString('menu.cmd_download_patrons.complete.status'));
484                                                 } else {
485                                                         alert(offlineStrings.getFormattedString('menu.cmd_download_patrons.error', [x.status, x.statusText]));
486                                                 }
487                                         } catch(E) {
488                                                 obj.error.standard_unexpected_error_alert('cmd_download_patrons',E);
489                                         }
490                                 }
491                         ],
492                         'cmd_adv_user_edit' : [
493                                 ['oncommand'],
494                                 function() {
495                                         obj.data.stash_retrieve();
496                                         obj.set_tab(obj.url_prefix(urls.XUL_ADV_USER_BARCODE_ENTRY), {}, {});
497                                 }
498                         ],
499                         'cmd_print_list_template_edit' : [
500                                 ['oncommand'],
501                                 function() {
502                                         obj.data.stash_retrieve();
503                                         obj.set_tab(obj.url_prefix(urls.XUL_PRINT_LIST_TEMPLATE_EDITOR), {}, {});
504                                 }
505                         ],
506                         'cmd_stat_cat_edit' : [
507                                 ['oncommand'],
508                                 function() {
509                                         obj.data.stash_retrieve();
510                                         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')},{});
511                                 }
512                         ],
513                         'cmd_non_cat_type_edit' : [
514                                 ['oncommand'],
515                                 function() {
516                                         obj.data.stash_retrieve();
517                                         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')},{});
518                                 }
519                         ],
520                         'cmd_copy_location_edit' : [
521                                 ['oncommand'],
522                                 function() {
523                                         obj.data.stash_retrieve();
524                                         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')},{});
525                                 }
526                         ],
527                         'cmd_test' : [
528                                 ['oncommand'],
529                                 function() {
530                                         obj.data.stash_retrieve();
531                                         var content_params = { 'session' : ses(), 'authtime' : ses('authtime') };
532                                         obj.set_tab(obj.url_prefix(urls.XUL_OPAC_WRAPPER), {}, content_params);
533                                 }
534                         ],
535                         'cmd_test_html' : [
536                                 ['oncommand'],
537                                 function() {
538                                         obj.data.stash_retrieve();
539                                         obj.set_tab(obj.url_prefix(urls.TEST_HTML) + '?ses='+window.escape(ses()),{ 'browser' : true },{});
540                                 }
541                         ],
542                         'cmd_test_xul' : [
543                                 ['oncommand'],
544                                 function() {
545                                         obj.data.stash_retrieve();
546                                         obj.set_tab(obj.url_prefix(urls.TEST_XUL) + '?ses='+window.escape(ses()),{ 'browser' : true },{});
547                                 }
548                         ],
549                         'cmd_console' : [
550                                 ['oncommand'],
551                                 function() {
552                                         obj.set_tab(obj.url_prefix(urls.XUL_DEBUG_CONSOLE),{'tab_name' : offlineStrings.getString('menu.cmd_console.tab')},{});
553                                 }
554                         ],
555                         'cmd_shell' : [
556                                 ['oncommand'],
557                                 function() {
558                                         obj.set_tab(obj.url_prefix(urls.XUL_DEBUG_SHELL),{'tab_name' : offlineStrings.getString('menu.cmd_shell.tab')},{});
559                                 }
560                         ],
561                         'cmd_xuleditor' : [
562                                 ['oncommand'],
563                                 function() {
564                                         obj.set_tab(obj.url_prefix(urls.XUL_DEBUG_XULEDITOR),{'tab_name' : offlineStrings.getString('menu.cmd_xuleditor.tab')},{});
565                                 }
566                         ],
567                         'cmd_fieldmapper' : [
568                                 ['oncommand'],
569                                 function() {
570                                         obj.set_tab(obj.url_prefix(urls.XUL_DEBUG_FIELDMAPPER),{'tab_name' : offlineStrings.getString('menu.cmd_fieldmapper.tab')},{});
571                                 }
572                         ],
573                         'cmd_survey_wizard' : [
574                                 ['oncommand'],
575                                 function() {
576                                         obj.data.stash_retrieve();
577                                         obj.window.open(obj.url_prefix(urls.XUL_SURVEY_WIZARD),'survey_wizard','chrome'); 
578                                 }
579                         ],
580                         'cmd_public_opac' : [
581                                 ['oncommand'],
582                                 function() {
583                                         var loc = urls.XUL_REMOTE_BROWSER + '?url=' + window.escape(
584                                                 urls.remote
585                                         );
586                                         obj.set_tab( 
587                                                 loc, 
588                                                 {'tab_name' : offlineStrings.getString('menu.cmd_public_opac.tab'), 'browser' : true}, 
589                                                 { 'no_xulG' : true, 'show_nav_buttons' : true, 'show_print_button' : true } 
590                                         );
591                                 }
592                         ],
593                         'cmd_clear_cache' : [
594                                 ['oncommand'],
595                                 function clear_the_cache() {
596                                         try {
597                                                 var cacheClass          = Components.classes["@mozilla.org/network/cache-service;1"];
598                                                 var cacheService        = cacheClass.getService(Components.interfaces.nsICacheService);
599                                                 cacheService.evictEntries(Components.interfaces.nsICache.STORE_ON_DISK);
600                                                 cacheService.evictEntries(Components.interfaces.nsICache.STORE_IN_MEMORY);
601                                         } catch(E) {
602                                                 dump(E+'\n');alert(E);
603                                         }
604                                 }
605                         ],
606                         'cmd_restore_all_tabs' : [
607                                 ['oncommand'],
608                                 function() {
609                                         var tabs = obj.controller.view.tabs;
610                                         for (var i = 0; i < tabs.childNodes.length; i++) {
611                                                 tabs.childNodes[i].hidden = false;
612                                         }
613                                 }
614                         ],
615                         'cmd_extension_manager' : [
616                                 ['oncommand'],
617                                 function() {
618                                         obj.set_tab('chrome://mozapps/content/extensions/extensions.xul?type=extensions',{'tab_name' : offlineStrings.getString('menu.cmd_extension_manager.tab')},{});
619                                 }
620                         ],
621                         'cmd_theme_manager' : [
622                                 ['oncommand'],
623                                 function() {
624                                         obj.set_tab('chrome://mozapps/content/extensions/extensions.xul?type=themes',{'tab_name' : offlineStrings.getString('menu.cmd_theme_manager.tab')},{});
625                                 }
626                         ],
627                         'cmd_about_config' : [
628                                 ['oncommand'],
629                                 function() {
630                                         obj.set_tab('chrome://global/content/config.xul',{'tab_name' : 'about:config'},{});
631                                 }
632                         ],
633                         'cmd_shutdown' : [
634                                 ['oncommand'],
635                                 function() {
636                                         if (window.confirm(offlineStrings.getString('menu.cmd_shutdown.prompt'))) {
637                                                 var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
638                                                 var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
639                                                 var enumerator = windowManagerInterface.getEnumerator(null);
640                                                 var w; // close all other windows
641                                                 while ( w = enumerator.getNext() ) {
642                                                         if (w != window) w.close();
643                                                 }
644                                                 window.close();
645                                         }
646                                 }
647                         ],
648                 };
649
650                 JSAN.use('util.controller');
651                 var cmd;
652                 obj.controller = new util.controller();
653                 obj.controller.init( { 'window_knows_me_by' : 'g.menu.controller', 'control_map' : cmd_map } );
654
655                 obj.controller.view.tabbox = window.document.getElementById('main_tabbox');
656                 obj.controller.view.tabs = obj.controller.view.tabbox.firstChild;
657                 obj.controller.view.panels = obj.controller.view.tabbox.lastChild;
658
659                 obj.new_tab(null,{'focus':true},null);
660
661                 obj.init_tab_focus_handlers();
662         },
663
664         'spawn_search' : function(s) {
665                 var obj = this;
666                 obj.error.sdump('D_TRACE', offlineStrings.getFormattedString('menu.spawn_search.msg', [js2JSON(s)]) ); 
667                 obj.data.stash_retrieve();
668                 var loc = obj.url_prefix(urls.XUL_PATRON_DISPLAY);
669                 loc += '?doit=1&query=' + window.escape(js2JSON(s));
670                 obj.new_tab( loc, {}, {} );
671         },
672
673         'init_tab_focus_handlers' : function() {
674                 var obj = this;
675                 for (var i = 0; i < obj.controller.view.tabs.childNodes.length; i++) {
676                         var tab = obj.controller.view.tabs.childNodes[i];
677                         var panel = obj.controller.view.panels.childNodes[i];
678                         tab.addEventListener(
679                                 'command',
680                                 function(p) {
681                                         return function() {
682                                                 try {
683                                                                 if (p
684                                                                         && p.firstChild 
685                                                                         && ( p.firstChild.nodeName == 'iframe' || p.firstChild.nodeName == 'browser' )
686                                                                         && p.firstChild.contentWindow 
687                                                                 ) {
688                                                                         if (typeof p.firstChild.contentWindow.default_focus == 'function') {
689                                                                                 p.firstChild.contentWindow.default_focus();
690                                                                         } else {
691                                                                                 //p.firstChild.contentWindow.firstChild.focus();
692                                                                         }
693                                                                 }
694                                                 } catch(E) {
695                                                         obj.error.sdump('D_ERROR','init_tab_focus_handler: ' + js2JSON(E));
696                                                 }
697                                         }
698                                 }(panel),
699                                 false
700                         );
701                 }
702         },
703
704         'close_all_tabs' : function() {
705                 var obj = this;
706                 try {
707                         var count = obj.controller.view.tabs.childNodes.length;
708                         for (var i = 0; i < count; i++) obj.close_tab();
709                         setTimeout( function(){ obj.controller.view.tabs.firstChild.focus(); }, 0);
710                 } catch(E) {
711                         obj.error.standard_unexpected_error_alert(offlineStrings.getString('menu.close_all_tabs.error'),E);
712                 }
713         },
714
715         'close_tab' : function () {
716                 var idx = this.controller.view.tabs.selectedIndex;
717                 var tab = this.controller.view.tabs.childNodes[idx];
718                 var panel = this.controller.view.panels.childNodes[ idx ];
719                 while ( panel.lastChild ) panel.removeChild( panel.lastChild );
720                 tab.setAttribute('label', offlineStrings.getFormattedString('menu.close_tab.update_tab_label', [(idx+1)]));
721                 if (idx == 0) {
722                         try {
723                                 this.controller.view.tabs.advanceSelectedTab(+1);
724                         } catch(E) {
725                                 this.error.sdump('D_TAB','failed tabs.advanceSelectedTab(+1):'+js2JSON(E) + '\n');
726                                 try {
727                                         this.controller.view.tabs.advanceSelectedTab(-1);
728                                 } catch(E) {
729                                         this.error.sdump('D_TAB','failed again tabs.advanceSelectedTab(-1):'+
730                                                 js2JSON(E) + '\n');
731                                 }
732                         }
733                 } else {
734                         try {
735                                 this.controller.view.tabs.advanceSelectedTab(-1);
736                         } catch(E) {
737                                 this.error.sdump('D_TAB','failed tabs.advanceSelectedTab(-1):'+js2JSON(E) + '\n');
738                                 try {
739                                         this.controller.view.tabs.advanceSelectedTab(+1);
740                                 } catch(E) {
741                                         this.error.sdump('D_TAB','failed again tabs.advanceSelectedTab(+1):'+
742                                                 js2JSON(E) + '\n');
743                                 }
744                         }
745
746                 }
747                 
748                 this.error.sdump('D_TAB','\tnew tabbox.selectedIndex = ' + this.controller.view.tabbox.selectedIndex + '\n');
749
750                 this.controller.view.tabs.childNodes[ idx ].hidden = true;
751                 this.error.sdump('D_TAB','tabs.childNodes[ ' + idx + ' ].hidden = true;\n');
752
753                 // Make sure we keep at least one tab open.
754                 var tab_flag = true;
755                 for (var i = 0; i < this.controller.view.tabs.childNodes.length; i++) {
756                         var tab = this.controller.view.tabs.childNodes[i];
757                         if (!tab.hidden)
758                                 tab_flag = false;
759                 }
760                 if (tab_flag) {
761                         this.controller.view.tabs.selectedIndex = 0;
762                         this.new_tab(); 
763                 }
764         },
765
766         'find_free_tab' : function() {
767                 var last_not_hidden = -1;
768                 for (var i = 0; i<this.controller.view.tabs.childNodes.length; i++) {
769                         var tab = this.controller.view.tabs.childNodes[i];
770                         if (!tab.hidden)
771                                 last_not_hidden = i;
772                 }
773                 if (last_not_hidden == this.controller.view.tabs.childNodes.length - 1)
774                         last_not_hidden = -1;
775                 // If the one next to last_not_hidden is hidden, we want it.
776                 // Basically, we fill in tabs after existing tabs for as 
777                 // long as possible.
778                 var idx = last_not_hidden + 1;
779                 var candidate = this.controller.view.tabs.childNodes[ idx ];
780                 if (candidate.hidden)
781                         return idx;
782                 // Alright, find the first hidden then
783                 for (var i = 0; i<this.controller.view.tabs.childNodes.length; i++) {
784                         var tab = this.controller.view.tabs.childNodes[i];
785                         if (tab.hidden)
786                                 return i;
787                 }
788                 return -1;
789         },
790
791         'new_tab' : function(url,params,content_params) {
792                 var tc = this.find_free_tab();
793                 if (tc == -1) { return null; } // 9 tabs max
794                 var tab = this.controller.view.tabs.childNodes[ tc ];
795                 tab.hidden = false;
796                 if (!content_params) content_params = {};
797                 if (!params) params = { 'tab_name' : offlineStrings.getString('menu.new_tab.tab', [(tc+1)]) };
798                 if (!params.nofocus) params.focus = true; /* make focus the default */
799                 try {
800                         if (params.focus) this.controller.view.tabs.selectedIndex = tc;
801                         params.index = tc;
802                         this.set_tab(url,params,content_params);
803                 } catch(E) {
804                         this.error.sdump('D_ERROR',E);
805                 }
806         },
807
808         'set_tab' : function(url,params,content_params) {
809                 var obj = this;
810                 if (!url) url = '/xul/server/';
811                 if (!url.match(/:\/\//) && !url.match(/^data:/)) url = urls.remote + url;
812                 if (!params) params = {};
813                 if (!content_params) content_params = {};
814                 var idx = this.controller.view.tabs.selectedIndex;
815                 if (params && typeof params.index != 'undefined') idx = params.index;
816                 var tab = this.controller.view.tabs.childNodes[ idx ];
817                 var panel = this.controller.view.panels.childNodes[ idx ];
818                 while ( panel.lastChild ) panel.removeChild( panel.lastChild );
819
820                 content_params.new_tab = function(a,b,c) { return obj.new_tab(a,b,c); };
821                 content_params.set_tab = function(a,b,c) { return obj.set_tab(a,b,c); };
822                 content_params.set_tab_name = function(name) { tab.setAttribute('label',(idx + 1) + ' ' + name); };
823                 content_params.open_chrome_window = function(a,b,c) { return obj.window.open(a,b,c); };
824                 content_params.url_prefix = function(url) { return obj.url_prefix(url); };
825                 if (params && params.tab_name) content_params.set_tab_name( params.tab_name );
826                 
827                 var frame;
828                 try {
829                         if (params && typeof params.browser != 'undefined') {
830                                 obj.id_incr++;
831                                 frame = this.w.document.createElement('browser');
832                                 frame.setAttribute('flex','1');
833                                 frame.setAttribute('type','content');
834                                 frame.setAttribute('id','frame_'+obj.id_incr);
835                                 panel.appendChild(frame);
836                                 try {
837                                         dump('creating browser with src = ' + url + '\n');
838                                         JSAN.use('util.browser');
839                                         var b = new util.browser();
840                                         b.init(
841                                                 {
842                                                         'url' : url,
843                                                         'push_xulG' : true,
844                                                         'alt_print' : false,
845                                                         'browser_id' : 'frame_'+obj.id_incr,
846                                                         'passthru_content_params' : content_params,
847                                                 }
848                                         );
849                                 } catch(E) {
850                                         alert(E);
851                                 }
852                         } else {
853                                 frame = this.w.document.createElement('iframe');
854                                 frame.setAttribute('flex','1');
855                                 panel.appendChild(frame);
856                                 dump('creating iframe with src = ' + url + '\n');
857                                 frame.setAttribute('src',url);
858                                 try {
859                                         netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
860                                         var cw = frame.contentWindow;
861                                         if (typeof cw.wrappedJSObject != 'undefined') cw = cw.wrappedJSObject;
862                                         cw.IAMXUL = true;
863                                         cw.xulG = content_params;
864                                 } catch(E) {
865                                         this.error.sdump('D_ERROR', 'main.menu: ' + E);
866                                 }
867                         }
868                 } catch(E) {
869                         this.error.sdump('D_ERROR', 'main.menu:2: ' + E);
870                         alert(offlineStrings.getString('menu.set_tab.error'));
871                 }
872
873                 return frame;
874         }
875
876 }
877
878 dump('exiting main/menu.js\n');