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