1 dump('entering main/main.js\n');
7 var openTabs = new Array();
9 var tempFocusWindow = null;
11 function grant_perms(url) {
12 var perms = "UniversalXPConnect UniversalPreferencesWrite UniversalBrowserWrite UniversalPreferencesRead UniversalBrowserRead UniversalFileRead";
13 dump('Granting ' + perms + ' to ' + url + '\n');
15 G.pref.setCharPref("capability.principal.codebase.p0.granted", perms);
16 G.pref.setCharPref("capability.principal.codebase.p0.id", url);
17 G.pref.setCharPref("capability.principal.codebase.p1.granted", perms);
18 G.pref.setCharPref("capability.principal.codebase.p1.id", url.replace('http:','https:'));
19 G.pref.setBoolPref("dom.disable_open_during_load",false);
20 G.pref.setBoolPref("browser.popups.showPopupBlocker",false);
25 function clear_the_cache() {
27 var cacheClass = Components.classes["@mozilla.org/network/cache-service;1"];
28 var cacheService = cacheClass.getService(Components.interfaces.nsICacheService);
29 cacheService.evictEntries(Components.interfaces.nsICache.STORE_ON_DISK);
30 cacheService.evictEntries(Components.interfaces.nsICache.STORE_IN_MEMORY);
32 dump(E+'\n');alert(E);
36 function toOpenWindowByType(inType, uri) { /* for Venkman */
38 var winopts = "chrome,extrachrome,menubar,resizable,scrollbars,status,toolbar";
39 window.open(uri, "_blank", winopts);
45 function start_debugger() {
48 try { start_venkman(); } catch(E) { alert(E); }
53 function start_inspector() {
56 try { inspectDOMDocument(); } catch(E) { alert(E); }
61 function start_chrome_list() {
64 try { startChromeList(); } catch(E) { alert(E); }
69 function start_js_shell() {
72 try { window.open('chrome://open_ils_staff_client/content/util/shell.html','shell','chrome,resizable,scrollbars'); } catch(E) { alert(E); }
77 function new_tabs(aTabList, aContinue) {
78 if(aTabList != null) {
79 openTabs = openTabs.concat(aTabList);
81 if(G.data.session) { // Just add to the list of stuff to open unless we are logged in
82 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
83 var targetwindow = null;
84 var focuswindow = null;
85 var focustab = {'focus' : true};
86 if(aContinue == true && tempWindow.closed == false) {
87 if(tempWindow.g == undefined || tempWindow.g.menu == undefined) {
94 targetwindow = tempWindow;
96 focuswindow = tempFocusWindow;
97 tempFocusWindow = null;
98 focustab = {'nofocus' : true};
100 else if(tempWindow != null) { // In theory, we are waiting on a setTimeout
101 if(tempWindow.closed == true) // But someone closed our window?
104 tempFocusWindow = null;
113 var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"].
114 getService(Components.interfaces.nsIWindowMediator);
115 // This may look out of place, but this is so we can continue this loop from down below
117 while(openTabs.length > 0) {
118 newTab = openTabs.shift();
119 if(newTab == 'new' || newTab == 'init') {
120 if(newTab != 'init' && openTabs.length > 0 && openTabs[0] != 'new') {
121 firstURL = openTabs.shift();
122 if(firstURL != 'tab') { // 'new' followed by 'tab' should be equal to 'init' in functionality, this should do that
124 firstURL = urls[firstURL];
126 firstURL = '&firstURL=' + window.escape(firstURL);
135 targetwindow = xulG.window.open(urls.XUL_MENU_FRAME
136 + '?server='+window.escape(G.data.server) + firstURL,
137 '_blank','chrome,resizable'
139 targetwindow.xulG = xulG;
140 if (focuswindow == null) {
141 focuswindow = targetwindow;
143 tempWindow = targetwindow;
144 tempFocusWindow = focuswindow;
147 new_tabs(null, true);
152 if(newTab == 'tab') {
155 else if(urls[newTab]) {
156 newTab = urls[newTab];
158 if(targetwindow != null) { // Already have a previous target window? Use it first.
159 if(targetwindow.g.menu.new_tab(newTab,focustab,null)) {
160 focustab = {'nofocus' : true};
164 var enumerator = wm.getEnumerator('eg_menu');
165 while(enumerator.hasMoreElements()) {
166 targetwindow = enumerator.getNext();
167 if(targetwindow.g.menu.new_tab(newTab,focustab,null)) {
168 focustab = {'nofocus' : true};
169 if (focuswindow == null) {
170 focuswindow = targetwindow;
175 // No windows found to add the tab to? Make a new one.
176 if(newTab == null) { // Were we making a "default" tab?
177 openTabs.unshift('init'); // 'init' does that for us!
180 openTabs.unshift('new',newTab);
184 if(focuswindow != null) {
190 function main_init() {
191 dump('entering main_init()\n');
194 if("arguments" in window && window.arguments.length > 0 && window.arguments[0].wrappedJSObject != undefined && window.arguments[0].wrappedJSObject.openTabs != undefined) {
195 openTabs = openTabs.concat(window.arguments[0].wrappedJSObject.openTabs);
198 // Now we can safely load the strings without the cache getting wiped
199 offlineStrings = document.getElementById('offlineStrings');
200 authStrings = document.getElementById('authStrings');
202 if (typeof JSAN == 'undefined') {
204 offlineStrings.getString('common.jsan.missing')
207 /////////////////////////////////////////////////////////////////////////////
209 JSAN.errorLevel = "die"; // none, warn, or die
210 JSAN.addRepository('..');
212 //JSAN.use('test.test'); test.test.hello_world();
217 G.pref = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
219 JSAN.use('util.error');
220 G.error = new util.error();
221 G.error.sdump('D_ERROR', offlineStrings.getString('main.testing'));
223 JSAN.use('util.window');
224 G.window = new util.window();
226 JSAN.use('auth.controller');
227 G.auth = new auth.controller( { 'window' : mw } );
229 JSAN.use('OpenILS.data');
230 G.data = new OpenILS.data();
231 G.data.on_error = G.auth.logoff;
233 JSAN.use('util.file');
234 G.file = new util.file();
236 G.file.get('ws_info');
237 G.ws_info = G.file.get_object(); G.file.close();
241 G.data.ws_info = G.ws_info; G.data.stash('ws_info');
243 G.auth.on_login = function() {
245 var url = G.auth.controller.view.server_prompt.value || urls.remote;
247 G.data.server_unadorned = url; G.data.stash('server_unadorned'); G.data.stash_retrieve();
249 if (! url.match( '^http://' ) ) { url = 'http://' + url; }
251 G.data.server = url; G.data.stash('server');
252 G.data.session = { 'key' : G.auth.session.key, 'auth' : G.auth.session.authtime }; G.data.stash('session');
253 G.data.stash_retrieve();
255 var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
256 var cookieUri = ios.newURI("http://" + G.data.server_unadorned, null, null);
257 var cookieUriSSL = ios.newURI("https://" + G.data.server_unadorned, null, null);
258 var cookieSvc = Components.classes["@mozilla.org/cookieService;1"].getService(Components.interfaces.nsICookieService);
260 cookieSvc.setCookieString(cookieUri, null, "ses="+G.data.session.key, null);
261 cookieSvc.setCookieString(cookieUriSSL, null, "ses="+G.data.session.key, null);
262 cookieSvc.setCookieString(cookieUri, null, "xul=1", null);
263 cookieSvc.setCookieString(cookieUriSSL, null, "xul=1", null);
266 alert(offlineStrings.getFormattedString(main.session_cookie.error, [E]));
279 if (G.data.ws_info && G.data.ws_info[G.auth.controller.view.server_prompt.value]) {
280 JSAN.use('util.widgets');
281 var deck = document.getElementById('progress_space');
282 util.widgets.remove_children( deck );
283 var iframe = document.createElement('iframe'); deck.appendChild(iframe);
284 iframe.setAttribute( 'src', url + urls.XUL_LOGIN_DATA );
285 iframe.contentWindow.xulG = xulG;
286 G.data_xul = iframe.contentWindow;
289 var deck = G.auth.controller.view.ws_deck;
290 JSAN.use('util.widgets'); util.widgets.remove_children('ws_deck');
291 var iframe = document.createElement('iframe'); deck.appendChild(iframe);
292 iframe.setAttribute( 'src', url + urls.XUL_WORKSTATION_INFO );
293 iframe.contentWindow.xulG = xulG;
294 deck.selectedIndex = deck.childNodes.length - 1;
298 G.auth.on_standalone = function() {
300 G.window.open(urls.XUL_STANDALONE,'Offline','chrome,resizable');
306 G.auth.on_standalone_export = function() {
308 JSAN.use('util.file'); var file = new util.file('pending_xacts');
309 if (file._file.exists()) {
310 var file2 = new util.file('');
311 var f = file2.pick_file( { 'mode' : 'save', 'title' : offlineStrings.getString('main.transaction_export.title') } );
314 var r = G.error.yns_alert(
315 offlineStrings.getFormattedString('main.transaction_export.prompt', [f.leafName]),
316 offlineStrings.getString('main.transaction_export.prompt.title'),
317 offlineStrings.getString('common.yes'),
318 offlineStrings.getString('common.no'),
320 offlineStrings.getString('common.confirm')
322 if (r != 0) { file.close(); return; }
324 var e_file = new util.file(''); e_file._file = f;
325 e_file.write_content( 'truncate', file.get_content() );
327 var r = G.error.yns_alert(
328 offlineStrings.getFormattedString('main.transaction_export.success.prompt', [f.leafName]),
329 offlineStrings.getString('main.transaction_export.success.title'),
330 offlineStrings.getString('common.yes'),
331 offlineStrings.getString('common.no'),
333 offlineStrings.getString('common.confirm')
337 var filename = 'pending_xacts_exported_' + new Date().getTime();
338 var t_file = new util.file(filename);
339 while (t_file._file.exists()) {
340 filename = 'pending_xacts_' + new Date().getTime() + '.exported';
341 t_file = new util.file(filename);
343 throw(offlineStrings.getString('main.transaction_export.filename.error'));
346 file.close(); file = new util.file('pending_xacts'); // prevents a bug with .moveTo below
347 file._file.moveTo(null,filename);
349 alert(offlineStrings.getString('main.transaction_export.duplicate.warning'));
352 alert(offlineStrings.getString('main.transaction_export.no_filename.error'));
355 alert(offlineStrings.getString('main.transaction_export.no_transactions.error'));
363 G.auth.on_standalone_import = function() {
365 JSAN.use('util.file'); var file = new util.file('pending_xacts');
366 if (file._file.exists()) {
367 alert(offlineStrings.getString('main.transaction_import.outstanding.error'));
369 var file2 = new util.file('');
370 var f = file2.pick_file( { 'mode' : 'open', 'title' : offlineStrings.getString('main.transaction_import.title')} );
371 if (f && f.exists()) {
372 var i_file = new util.file(''); i_file._file = f;
373 file.write_content( 'truncate', i_file.get_content() );
375 var r = G.error.yns_alert(
376 offlineStrings.getFormattedString('main.transaction_import.delete.prompt', [f.leafName]),
377 offlineStrings.getString('main.transaction_import.success'),
378 offlineStrings.getString('common.yes'),
379 offlineStrings.getString('common.no'),
381 offlineStrings.getString('common.confirm')
394 G.auth.on_debug = function(action) {
397 G.window.open(urls.XUL_DEBUG_CONSOLE,'testconsole','chrome,resizable');
401 alert(offlineStrings.getString('main.on_debug.clear_cache'));
404 alert(offlineStrings.getString('main.on_debug.debug'));
410 // XML_HTTP_SERVER will get reset to G.auth.controller.view.server_prompt.value
412 /////////////////////////////////////////////////////////////////////////////
414 var version = CLIENT_VERSION;
415 if (CLIENT_STAMP.length == 0) {
416 version = 'versionless debug build';
417 document.getElementById('debug_gb').hidden = false;
421 if (G.pref && G.pref.getBoolPref('open-ils.debug_options')) {
422 document.getElementById('debug_gb').hidden = false;
427 var appInfo = Components.classes["@mozilla.org/xre/app-info;1"]
428 .getService(Components.interfaces.nsIXULAppInfo);
430 if (appInfo.ID == "staff-client@open-ils.org")
433 if (G.pref && G.pref.getBoolPref('app.update.enabled')) {
434 document.getElementById('check_upgrade_sep').hidden = false;
435 var upgrademenu = document.getElementById('check_upgrade');
436 upgrademenu.hidden = false;
437 G.upgradeCheck = function () {
438 var um = Components.classes["@mozilla.org/updates/update-manager;1"]
439 .getService(Components.interfaces.nsIUpdateManager);
440 var prompter = Components.classes["@mozilla.org/updates/update-prompt;1"]
441 .createInstance(Components.interfaces.nsIUpdatePrompt);
443 if (um.activeUpdate && um.activeUpdate.state == "pending")
444 prompter.showUpdateDownloaded(um.activeUpdate);
446 prompter.checkForUpdates();
448 upgrademenu.addEventListener(
458 window.title = authStrings.getFormattedString('staff.auth.titlebar.label', version);
459 var x = document.getElementById('about_btn');
464 G.window.open('about.html','about','chrome,resizable,width=800,height=600');
465 } catch(E) { alert(E); }
470 var y = document.getElementById('new_window_btn');
474 if (G.data.session) {
475 new_tabs(Array('new'), null, null);
477 alert ( offlineStrings.getString('main.new_window_btn.login_first_warning') );
483 JSAN.use('util.mozilla');
484 var z = document.getElementById('locale_menupopup');
486 while (z.lastChild) z.removeChild(z.lastChild);
487 var locales = util.mozilla.chromeRegistry().getLocalesForPackage( String( location.href ).split(/\//)[2] );
488 var current_locale = util.mozilla.prefs().getCharPref('general.useragent.locale');
489 while (locales.hasMore()) {
490 var locale = locales.getNext();
491 var parts = locale.split(/-/);
494 label = locale + ' : ' + util.mozilla.languages().GetStringFromName(parts[0]);
495 if (parts.length > 1) {
497 label += ' (' + util.mozilla.regions().GetStringFromName(parts[1].toLowerCase()) + ')';
499 label += ' (' + parts[1] + ')';
505 var mi = document.createElement('menuitem');
506 mi.setAttribute('label',label);
507 mi.setAttribute('value',locale);
508 if (locale == current_locale) {
509 if (z.parentNode.tagName == 'menulist') {
510 mi.setAttribute('selected','true');
511 z.parentNode.setAttribute('label',label);
512 z.parentNode.setAttribute('value',locale);
518 var xx = document.getElementById('apply_locale_btn');
522 util.mozilla.change_locale(z.parentNode.value);
527 if ( found_ws_info_in_Achrome() && G.pref && G.pref.getBoolPref("open-ils.write_in_user_chrome_directory") ) {
528 //var hbox = x.parentNode; var b = document.createElement('button');
529 //b.setAttribute('label','Migrate legacy settings'); hbox.appendChild(b);
530 //b.addEventListener(
534 // handle_migration();
535 // } catch(E) { alert(E); }
539 if (window.confirm(offlineStrings.getString('main.settings.migrate'))) {
540 setTimeout( function() { handle_migration(); }, 0 );
544 window.addEventListener(
548 G.data.stash_retrieve();
549 if (typeof G.data.unsaved_data != 'undefined') {
550 if (G.data.unsaved_data > 0) {
551 var confirmation = window.confirm(offlineStrings.getString('menu.shutdown.unsaved_data_warning'));
558 G.data.unsaved_data = 0;
559 G.data.stash('unsaved_data');
569 var error = offlineStrings.getFormattedString('common.exception', [E, '']);
570 try { G.error.sdump('D_ERROR',error); } catch(E) { dump(error); }
573 dump('exiting main_init()\n');
576 function found_ws_info_in_Achrome() {
577 JSAN.use('util.file');
578 var f = new util.file();
579 var f_in_chrome = f.get('ws_info','chrome');
580 var path = f_in_chrome.exists() ? f_in_chrome.path : false;
585 function found_ws_info_in_Uchrome() {
586 JSAN.use('util.file');
587 var f = new util.file();
588 var f_in_uchrome = f.get('ws_info','uchrome');
589 var path = f_in_uchrome.exists() ? f_in_uchrome.path : false;
594 function handle_migration() {
595 if ( found_ws_info_in_Uchrome() ) {
596 alert(offlineStrings.getFormattedString('main.settings.migrate.failed', [found_ws_info_in_Uchrome(), found_ws_info_in_Achrome()])
599 var dirService = Components.classes["@mozilla.org/file/directory_service;1"].getService( Components.interfaces.nsIProperties );
600 var f_new = dirService.get( "UChrm", Components.interfaces.nsIFile );
601 var f_old = dirService.get( "AChrom", Components.interfaces.nsIFile );
602 f_old.append(myPackageDir); f_old.append("content"); f_old.append("conf");
603 if (window.confirm(offlineStrings.getFormattedString("main.settings.migrate.confirm", [f_old.path, f_new.path]))) {
604 var files = f_old.directoryEntries;
605 while (files.hasMoreElements()) {
606 var file = files.getNext();
607 var file2 = file.QueryInterface( Components.interfaces.nsILocalFile );
609 file2.moveTo( f_new, '' );
611 alert(offlineStrings.getFormattedString('main.settings.migrate.error', [file2.path, f_new.path]) + '\n');
614 location.href = location.href; // huh?
619 dump('exiting main/main.js\n');