]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/chrome/content/main/menu.js
added menu options for vandelay (marc import/export) and conify (server settings...
[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
456                         /* Cataloging Menu */
457                         'cmd_z39_50_import' : [
458                                 ['oncommand'],
459                                 function() {
460                                         obj.data.stash_retrieve();
461                                         obj.set_tab(obj.url_prefix(urls.XUL_Z3950_IMPORT),{},{});
462                                 }
463                         ],
464                         'cmd_create_marc' : [
465                                 ['oncommand'],
466                                 function() {
467                                         obj.data.stash_retrieve();
468                                         obj.set_tab(obj.url_prefix(urls.XUL_MARC_NEW),{},{});
469                                 }
470                         ],
471
472                         /* Admin menu */
473                         'cmd_change_session' : [
474                                 ['oncommand'],
475                                 function() {
476                                         try {
477                                                 obj.data.stash_retrieve();
478                                                 JSAN.use('util.network'); var network = new util.network();
479                                                 var x = document.getElementById('oc_menuitem');
480                                                 var x_label = x.getAttribute('label_orig');
481                                                 var temp_au = js2JSON( obj.data.list.au[0] );
482                                                 var temp_ses = js2JSON( obj.data.session );
483                                                 if (obj.data.list.au.length > 1) {
484                                                         obj.data.list.au = [ obj.data.list.au[1] ];
485                                                         obj.data.stash('list');
486                                                         network.reset_titlebars( obj.data );
487                                                         x.setAttribute('label', x_label );
488                                                         network.simple_request('AUTH_DELETE', [ obj.data.session.key ] );
489                                                         obj.data.session = obj.data.previous_session;
490                                                         obj.data.stash('session');
491                                                         removeCSSClass(document.getElementById('main_tabbox'),'operator_change');
492                                                 } else {
493                                                         if (network.get_new_session(offlineStrings.getString('menu.cmd_chg_session.label'),{'url_prefix':obj.url_prefix})) {
494                                                                 obj.data.stash_retrieve();
495                                                                 obj.data.list.au[1] = JSON2js( temp_au );
496                                                                 obj.data.stash('list');
497                                                                 obj.data.previous_session = JSON2js( temp_ses );
498                                                                 obj.data.stash('previous_session');
499                                                                 x.setAttribute('label', offlineStrings.getFormattedString('menu.cmd_chg_session.operator.label', [obj.data.list.au[1].usrname()]) );
500                                                                 addCSSClass(document.getElementById('main_tabbox'),'operator_change');
501                                                         }
502                                                 }
503                                         } catch(E) {
504                                                 obj.error.standard_unexpected_error_alert('cmd_change_session',E);
505                                         }
506                                 }
507                         ],
508                         'cmd_manage_offline_xacts' : [
509                                 ['oncommand'],
510                                 function() {
511                                         obj.set_tab(obj.url_prefix(urls.XUL_OFFLINE_MANAGE_XACTS), {'tab_name' : offlineStrings.getString('menu.cmd_manage_offline_xacts.tab')}, {});
512                                 }
513                         ],
514                         'cmd_download_patrons' : [
515                                 ['oncommand'],
516                                 function() {
517                                         try {
518                                                 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
519                                                 var x = new XMLHttpRequest();
520                                                 var url = 'http://' + XML_HTTP_SERVER + '/standalone/list.txt';
521                                                 x.open("GET",url,false);
522                                                 x.send(null);
523                                                 if (x.status == 200) {
524                                                         JSAN.use('util.file'); var file = new util.file('offline_patron_list');
525                                                         file.write_content('truncate',x.responseText);
526                                                         file.close();
527                                                         file = new util.file('offline_patron_list.date');
528                                                         file.write_content('truncate',new Date());
529                                                         file.close();
530                                                         alert(offlineStrings.getString('menu.cmd_download_patrons.complete.status'));
531                                                 } else {
532                                                         alert(offlineStrings.getFormattedString('menu.cmd_download_patrons.error', [x.status, x.statusText]));
533                                                 }
534                                         } catch(E) {
535                                                 obj.error.standard_unexpected_error_alert('cmd_download_patrons',E);
536                                         }
537                                 }
538                         ],
539                         'cmd_adv_user_edit' : [
540                                 ['oncommand'],
541                                 function() {
542                                         obj.data.stash_retrieve();
543                                         obj.set_tab(obj.url_prefix(urls.XUL_PATRON_BARCODE_ENTRY), {}, { 'perm_editor' : true });
544                                 }
545                         ],
546                         'cmd_print_list_template_edit' : [
547                                 ['oncommand'],
548                                 function() {
549                                         obj.data.stash_retrieve();
550                                         obj.set_tab(obj.url_prefix(urls.XUL_PRINT_LIST_TEMPLATE_EDITOR), {}, {});
551                                 }
552                         ],
553                         'cmd_stat_cat_edit' : [
554                                 ['oncommand'],
555                                 function() {
556                                         obj.data.stash_retrieve();
557                                         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')},{});
558                                 }
559                         ],
560                         'cmd_non_cat_type_edit' : [
561                                 ['oncommand'],
562                                 function() {
563                                         obj.data.stash_retrieve();
564                                         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')},{});
565                                 }
566                         ],
567                         'cmd_copy_location_edit' : [
568                                 ['oncommand'],
569                                 function() {
570                                         obj.data.stash_retrieve();
571                                         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')},{});
572                                 }
573                         ],
574                         'cmd_test' : [
575                                 ['oncommand'],
576                                 function() {
577                                         obj.data.stash_retrieve();
578                                         var content_params = { 'session' : ses(), 'authtime' : ses('authtime') };
579                                         obj.set_tab(obj.url_prefix(urls.XUL_OPAC_WRAPPER), {}, content_params);
580                                 }
581                         ],
582                         'cmd_test_html' : [
583                                 ['oncommand'],
584                                 function() {
585                                         obj.data.stash_retrieve();
586                                         obj.set_tab(obj.url_prefix(urls.TEST_HTML) + '?ses='+window.escape(ses()),{ 'browser' : true },{});
587                                 }
588                         ],
589                         'cmd_test_xul' : [
590                                 ['oncommand'],
591                                 function() {
592                                         obj.data.stash_retrieve();
593                                         obj.set_tab(obj.url_prefix(urls.TEST_XUL) + '?ses='+window.escape(ses()),{ 'browser' : true },{});
594                                 }
595                         ],
596                         'cmd_console' : [
597                                 ['oncommand'],
598                                 function() {
599                                         obj.set_tab(obj.url_prefix(urls.XUL_DEBUG_CONSOLE),{'tab_name' : offlineStrings.getString('menu.cmd_console.tab')},{});
600                                 }
601                         ],
602                         'cmd_shell' : [
603                                 ['oncommand'],
604                                 function() {
605                                         obj.set_tab(obj.url_prefix(urls.XUL_DEBUG_SHELL),{'tab_name' : offlineStrings.getString('menu.cmd_shell.tab')},{});
606                                 }
607                         ],
608                         'cmd_xuleditor' : [
609                                 ['oncommand'],
610                                 function() {
611                                         obj.set_tab(obj.url_prefix(urls.XUL_DEBUG_XULEDITOR),{'tab_name' : offlineStrings.getString('menu.cmd_xuleditor.tab')},{});
612                                 }
613                         ],
614                         'cmd_fieldmapper' : [
615                                 ['oncommand'],
616                                 function() {
617                                         obj.set_tab(obj.url_prefix(urls.XUL_DEBUG_FIELDMAPPER),{'tab_name' : offlineStrings.getString('menu.cmd_fieldmapper.tab')},{});
618                                 }
619                         ],
620                         'cmd_survey_wizard' : [
621                                 ['oncommand'],
622                                 function() {
623                                         obj.data.stash_retrieve();
624                                         obj.window.open(obj.url_prefix(urls.XUL_SURVEY_WIZARD),'survey_wizard','chrome'); 
625                                 }
626                         ],
627                         'cmd_public_opac' : [
628                                 ['oncommand'],
629                                 function() {
630                                         var loc = urls.XUL_REMOTE_BROWSER + '?url=' + window.escape(
631                                                 urls.remote
632                                         );
633                                         obj.set_tab( 
634                                                 loc, 
635                                                 {'tab_name' : offlineStrings.getString('menu.cmd_public_opac.tab'), 'browser' : true}, 
636                                                 { 'no_xulG' : true, 'show_nav_buttons' : true, 'show_print_button' : true } 
637                                         );
638                                 }
639                         ],
640                         'cmd_clear_cache' : [
641                                 ['oncommand'],
642                                 function clear_the_cache() {
643                                         try {
644                                                 var cacheClass          = Components.classes["@mozilla.org/network/cache-service;1"];
645                                                 var cacheService        = cacheClass.getService(Components.interfaces.nsICacheService);
646                                                 cacheService.evictEntries(Components.interfaces.nsICache.STORE_ON_DISK);
647                                                 cacheService.evictEntries(Components.interfaces.nsICache.STORE_IN_MEMORY);
648                                         } catch(E) {
649                                                 dump(E+'\n');alert(E);
650                                         }
651                                 }
652                         ],
653                         'cmd_restore_all_tabs' : [
654                                 ['oncommand'],
655                                 function() {
656                                         var tabs = obj.controller.view.tabs;
657                                         for (var i = 0; i < tabs.childNodes.length; i++) {
658                                                 tabs.childNodes[i].hidden = false;
659                                         }
660                                 }
661                         ],
662                         'cmd_extension_manager' : [
663                                 ['oncommand'],
664                                 function() {
665                                         obj.set_tab('chrome://mozapps/content/extensions/extensions.xul?type=extensions',{'tab_name' : offlineStrings.getString('menu.cmd_extension_manager.tab')},{});
666                                 }
667                         ],
668                         'cmd_theme_manager' : [
669                                 ['oncommand'],
670                                 function() {
671                                         obj.set_tab('chrome://mozapps/content/extensions/extensions.xul?type=themes',{'tab_name' : offlineStrings.getString('menu.cmd_theme_manager.tab')},{});
672                                 }
673                         ],
674                         'cmd_about_config' : [
675                                 ['oncommand'],
676                                 function() {
677                                         obj.set_tab('chrome://global/content/config.xul',{'tab_name' : 'about:config'},{});
678                                 }
679                         ],
680                         'cmd_shutdown' : [
681                                 ['oncommand'],
682                                 function() {
683                                         if (window.confirm(offlineStrings.getString('menu.cmd_shutdown.prompt'))) {
684                                                 var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
685                                                 var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
686                                                 var enumerator = windowManagerInterface.getEnumerator(null);
687                                                 var w; // close all other windows
688                                                 while ( w = enumerator.getNext() ) {
689                                                         if (w != window) w.close();
690                                                 }
691                                                 window.close();
692                                         }
693                                 }
694                         ],
695                 };
696
697                 JSAN.use('util.controller');
698                 var cmd;
699                 obj.controller = new util.controller();
700                 obj.controller.init( { 'window_knows_me_by' : 'g.menu.controller', 'control_map' : cmd_map } );
701
702                 obj.controller.view.tabbox = window.document.getElementById('main_tabbox');
703                 obj.controller.view.tabs = obj.controller.view.tabbox.firstChild;
704                 obj.controller.view.panels = obj.controller.view.tabbox.lastChild;
705
706                 obj.new_tab(null,{'focus':true},null);
707
708                 obj.init_tab_focus_handlers();
709         },
710
711         'spawn_search' : function(s) {
712                 var obj = this;
713                 obj.error.sdump('D_TRACE', offlineStrings.getFormattedString('menu.spawn_search.msg', [js2JSON(s)]) ); 
714                 obj.data.stash_retrieve();
715                 var loc = obj.url_prefix(urls.XUL_PATRON_DISPLAY);
716                 loc += '?doit=1&query=' + window.escape(js2JSON(s));
717                 obj.new_tab( loc, {}, {} );
718         },
719
720         'init_tab_focus_handlers' : function() {
721                 var obj = this;
722                 for (var i = 0; i < obj.controller.view.tabs.childNodes.length; i++) {
723                         var tab = obj.controller.view.tabs.childNodes[i];
724                         var panel = obj.controller.view.panels.childNodes[i];
725                         tab.addEventListener(
726                                 'command',
727                                 function(p) {
728                                         return function() {
729                                                 try {
730                                                                 if (p
731                                                                         && p.firstChild 
732                                                                         && ( p.firstChild.nodeName == 'iframe' || p.firstChild.nodeName == 'browser' )
733                                                                         && p.firstChild.contentWindow 
734                                                                 ) {
735                                                                         if (typeof p.firstChild.contentWindow.default_focus == 'function') {
736                                                                                 p.firstChild.contentWindow.default_focus();
737                                                                         } else {
738                                                                                 //p.firstChild.contentWindow.firstChild.focus();
739                                                                         }
740                                                                 }
741                                                 } catch(E) {
742                                                         obj.error.sdump('D_ERROR','init_tab_focus_handler: ' + js2JSON(E));
743                                                 }
744                                         }
745                                 }(panel),
746                                 false
747                         );
748                 }
749         },
750
751         'close_all_tabs' : function() {
752                 var obj = this;
753                 try {
754                         var count = obj.controller.view.tabs.childNodes.length;
755                         for (var i = 0; i < count; i++) obj.close_tab();
756                         setTimeout( function(){ obj.controller.view.tabs.firstChild.focus(); }, 0);
757                 } catch(E) {
758                         obj.error.standard_unexpected_error_alert(offlineStrings.getString('menu.close_all_tabs.error'),E);
759                 }
760         },
761
762         'close_tab' : function () {
763                 var idx = this.controller.view.tabs.selectedIndex;
764                 var tab = this.controller.view.tabs.childNodes[idx];
765                 var panel = this.controller.view.panels.childNodes[ idx ];
766                 while ( panel.lastChild ) panel.removeChild( panel.lastChild );
767                 if (idx == 0) {
768                         try {
769                                 this.controller.view.tabs.advanceSelectedTab(+1);
770                         } catch(E) {
771                                 this.error.sdump('D_TAB','failed tabs.advanceSelectedTab(+1):'+js2JSON(E) + '\n');
772                                 try {
773                                         this.controller.view.tabs.advanceSelectedTab(-1);
774                                 } catch(E) {
775                                         this.error.sdump('D_TAB','failed again tabs.advanceSelectedTab(-1):'+
776                                                 js2JSON(E) + '\n');
777                                 }
778                         }
779                 } else {
780                         try {
781                                 this.controller.view.tabs.advanceSelectedTab(-1);
782                         } catch(E) {
783                                 this.error.sdump('D_TAB','failed tabs.advanceSelectedTab(-1):'+js2JSON(E) + '\n');
784                                 try {
785                                         this.controller.view.tabs.advanceSelectedTab(+1);
786                                 } catch(E) {
787                                         this.error.sdump('D_TAB','failed again tabs.advanceSelectedTab(+1):'+
788                                                 js2JSON(E) + '\n');
789                                 }
790                         }
791
792                 }
793                 
794                 this.error.sdump('D_TAB','\tnew tabbox.selectedIndex = ' + this.controller.view.tabbox.selectedIndex + '\n');
795
796                 this.controller.view.tabs.childNodes[ idx ].hidden = true;
797                 this.error.sdump('D_TAB','tabs.childNodes[ ' + idx + ' ].hidden = true;\n');
798
799                 // Make sure we keep at least one tab open.
800                 var tab_flag = true;
801                 for (var i = 0; i < this.controller.view.tabs.childNodes.length; i++) {
802                         var tab = this.controller.view.tabs.childNodes[i];
803                         if (!tab.hidden)
804                                 tab_flag = false;
805                 }
806                 if (tab_flag) {
807                         this.controller.view.tabs.selectedIndex = 0;
808                         this.new_tab(); 
809                 }
810         },
811
812         'find_free_tab' : function() {
813                 var last_not_hidden = -1;
814                 for (var i = 0; i<this.controller.view.tabs.childNodes.length; i++) {
815                         var tab = this.controller.view.tabs.childNodes[i];
816                         if (!tab.hidden)
817                                 last_not_hidden = i;
818                 }
819                 if (last_not_hidden == this.controller.view.tabs.childNodes.length - 1)
820                         last_not_hidden = -1;
821                 // If the one next to last_not_hidden is hidden, we want it.
822                 // Basically, we fill in tabs after existing tabs for as 
823                 // long as possible.
824                 var idx = last_not_hidden + 1;
825                 var candidate = this.controller.view.tabs.childNodes[ idx ];
826                 if (candidate.hidden)
827                         return idx;
828                 // Alright, find the first hidden then
829                 for (var i = 0; i<this.controller.view.tabs.childNodes.length; i++) {
830                         var tab = this.controller.view.tabs.childNodes[i];
831                         if (tab.hidden)
832                                 return i;
833                 }
834                 return -1;
835         },
836
837         'new_tab' : function(url,params,content_params) {
838                 var tc = this.find_free_tab();
839                 if (tc == -1) { return null; } // 9 tabs max
840                 var tab = this.controller.view.tabs.childNodes[ tc ];
841                 tab.hidden = false;
842                 if (!content_params) content_params = {};
843                 if (!params) params = {};
844                 if (!params.tab_name) params.tab_name = offlineStrings.getString('menu.new_tab.tab');
845                 if (!params.nofocus) params.focus = true; /* make focus the default */
846                 try {
847                         if (params.focus) this.controller.view.tabs.selectedIndex = tc;
848                         params.index = tc;
849                         this.set_tab(url,params,content_params);
850                 } catch(E) {
851                         this.error.sdump('D_ERROR',E);
852                 }
853         },
854
855         'set_tab' : function(url,params,content_params) {
856                 var obj = this;
857                 if (!url) url = '/xul/server/';
858                 if (!url.match(/:\/\//) && !url.match(/^data:/)) url = urls.remote + url;
859                 if (!params) params = {};
860                 if (!content_params) content_params = {};
861                 var idx = this.controller.view.tabs.selectedIndex;
862                 if (params && typeof params.index != 'undefined') idx = params.index;
863                 var tab = this.controller.view.tabs.childNodes[ idx ];
864                 var panel = this.controller.view.panels.childNodes[ idx ];
865                 while ( panel.lastChild ) panel.removeChild( panel.lastChild );
866
867                 content_params.new_tab = function(a,b,c) { return obj.new_tab(a,b,c); };
868                 content_params.set_tab = function(a,b,c) { return obj.set_tab(a,b,c); };
869                 content_params.set_tab_name = function(name) { tab.setAttribute('label',(idx + 1) + ' ' + name); };
870                 content_params.open_chrome_window = function(a,b,c) { return obj.window.open(a,b,c); };
871                 content_params.url_prefix = function(url) { return obj.url_prefix(url); };
872                 if (params && params.tab_name) content_params.set_tab_name( params.tab_name );
873                 
874                 var frame;
875                 try {
876                         if (params && typeof params.browser != 'undefined') {
877                                 obj.id_incr++;
878                                 frame = this.w.document.createElement('browser');
879                                 frame.setAttribute('flex','1');
880                                 frame.setAttribute('type','content');
881                                 frame.setAttribute('id','frame_'+obj.id_incr);
882                                 panel.appendChild(frame);
883                                 try {
884                                         dump('creating browser with src = ' + url + '\n');
885                                         JSAN.use('util.browser');
886                                         var b = new util.browser();
887                                         b.init(
888                                                 {
889                                                         'url' : url,
890                                                         'push_xulG' : true,
891                                                         'alt_print' : false,
892                                                         'browser_id' : 'frame_'+obj.id_incr,
893                                                         'passthru_content_params' : content_params,
894                                                 }
895                                         );
896                                 } catch(E) {
897                                         alert(E);
898                                 }
899                         } else {
900                                 frame = this.w.document.createElement('iframe');
901                                 frame.setAttribute('flex','1');
902                                 panel.appendChild(frame);
903                                 dump('creating iframe with src = ' + url + '\n');
904                                 frame.setAttribute('src',url);
905                                 try {
906                                         netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
907                                         var cw = frame.contentWindow;
908                                         if (typeof cw.wrappedJSObject != 'undefined') cw = cw.wrappedJSObject;
909                                         cw.IAMXUL = true;
910                                         cw.xulG = content_params;
911                                 } catch(E) {
912                                         this.error.sdump('D_ERROR', 'main.menu: ' + E);
913                                 }
914                         }
915                 } catch(E) {
916                         this.error.sdump('D_ERROR', 'main.menu:2: ' + E);
917                         alert(offlineStrings.getString('menu.set_tab.error'));
918                 }
919
920                 return frame;
921         }
922
923 }
924
925 dump('exiting main/menu.js\n');