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