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