]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/js/dojo/openils/XUL.js
Fix broken menu entries under "Other -> Booking" in patron interface
[working/Evergreen.git] / Open-ILS / web / js / dojo / openils / XUL.js
1 if(!dojo._hasResource["openils.XUL"]) {
2
3     dojo.provide("openils.XUL");
4     dojo.require('dojo.cookie');
5     dojo.declare('openils.XUL', null, {});
6
7     openils.XUL.isXUL = function() {
8         return Boolean(dojo.cookie('xul')) || Boolean(window.IAMXUL);
9     }
10
11  try {
12     openils.XUL.buildId = function() {
13         return window.XUL_BUILD_ID || '';
14     }
15     
16     openils.XUL.getStash = function() {
17         if(openils.XUL.isXUL()) {
18             try {
19                 if(openils.XUL.enableXPConnect()) {
20                     netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
21                     var CacheClass = new Components.Constructor("@mozilla.org/openils_data_cache;1", "nsIOpenILS");
22                     return new CacheClass().wrappedJSObject.OpenILS.prototype.data;
23                 }
24             } catch(e) {
25                 console.log("Error loading XUL stash: " + e);
26                 return { 'error' : e };
27             }
28         }
29
30         return { 'error' : 'openils.XUL.isXUL() == false' };
31     }
32
33     openils.XUL.newTab = function(path, tabInfo, options) {
34         if(xulG == undefined) 
35             throw new Error('xulG is not defined.  Cannot open tab');
36         xulG.new_tab(path, tabInfo, options);
37     }
38
39     openils.XUL.newTabEasy = function(
40         url, tab_name, extra_content_params, wrap_in_browser
41     ) {
42         var content_params = {
43             "session": openils.User.authtoken,
44             "authtime": openils.User.authtime
45         };
46
47         ["url_prefix", "new_tab", "set_tab", "close_tab", "new_patron_tab",
48             "set_patron_tab", "volume_item_creator", "get_new_session",
49             "holdings_maintenance_tab", "set_tab_name", "open_chrome_window",
50             "url_prefix", "network_meter", "page_meter", "set_statusbar",
51             "set_help_context"
52         ].forEach(function(k) { content_params[k] = xulG[k]; });
53
54         if (extra_content_params)
55             dojo.mixin(content_params, extra_content_params);
56
57         var loc = xulG.url_prefix(url);
58
59         if (wrap_in_browser) {
60             var urls = xulG.urls || window.urls;
61             loc = urls.XUL_BROWSER + "?url=" + window.escape(loc);
62             content_params = dojo.mixin(
63                 {
64                     "no_xulG": false, "show_print_button": true,
65                     "show_nav_buttons": true,
66                     "passthru_content_params": extra_content_params
67                 }, content_params
68             );
69         }
70
71         xulG.new_tab(loc, {"tab_name": tab_name}, content_params);
72     };
73
74     /**
75      * @return bool True if a new session was successfully created, false otherwise.
76      */
77     openils.XUL.getNewSession = function(callback) {
78         return xulG.get_new_session({callback : callback});
79     }
80
81     /** 
82      * This can be used by privileged Firefox in addition to XUL.
83      * To use use in Firefox directly, set signed.applets.codebase_principal_support to true in about:config
84      */ 
85     openils.XUL.enableXPConnect = function() {
86         try {
87             netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
88         } catch (E) {
89             if(dojo.isFF) {
90                 console.error("Unable to enable UniversalXPConnect privileges.  " +
91                     "Try setting 'signed.applets.codebase_principal_support' to true in about:config");
92             }
93             return false;
94         }
95         return true;
96     }
97
98     /* This class cuts down on the obscenely long incantations needed to
99      * use XPCOM components. */
100     openils.XUL.SimpleXPCOM = function() {};
101     openils.XUL.SimpleXPCOM.prototype = {
102         "FP": {
103             "iface": Components.interfaces.nsIFilePicker,
104             "cls": "@mozilla.org/filepicker;1"
105         },
106         "FIS": {
107             "iface": Components.interfaces.nsIFileInputStream,
108             "cls": "@mozilla.org/network/file-input-stream;1"
109         },
110         "SIS": {
111             "iface": Components.interfaces.nsIScriptableInputStream,
112             "cls": "@mozilla.org/scriptableinputstream;1"
113         },
114         "FOS": {
115             "iface": Components.interfaces.nsIFileOutputStream,
116             "cls": "@mozilla.org/network/file-output-stream;1"
117         },
118         "create": function(key) {
119             return Components.classes[this[key].cls].
120                 createInstance(this[key].iface);
121         },
122         "getPrivilegeManager": function() {
123             return netscape.security.PrivilegeManager;
124         }
125     };
126
127     openils.XUL.contentFromFileOpenDialog = function(windowTitle, sizeLimit) {
128         var api = new openils.XUL.SimpleXPCOM();
129
130         /* The following enablePrivilege() call must happen at this exact
131          * level of scope -- not wrapped in another function -- otherwise
132          * it doesn't work. */
133         api.getPrivilegeManager().enablePrivilege("UniversalXPConnect");
134
135         var picker = api.create("FP");
136         picker.init(
137             window, windowTitle || "Upload File", api.FP.iface.modeOpen
138         );
139         if (picker.show() == api.FP.iface.returnOK && picker.file) {
140             var fis = api.create("FIS");
141             var sis = api.create("SIS");
142
143             fis.init(picker.file, 1 /* MODE_RDONLY */, 0, 0);
144             sis.init(fis);
145
146             return sis.read(sizeLimit || -1);
147         } else {
148             return null;
149         }
150     };
151
152     openils.XUL.contentToFileSaveDialog = function(content, windowTitle, dispositionArgs) {
153         var api = new openils.XUL.SimpleXPCOM();
154         api.getPrivilegeManager().enablePrivilege("UniversalXPConnect");
155
156         var picker = api.create("FP");
157         picker.init(
158             window, windowTitle || "Save File", api.FP.iface.modeSave
159         );
160
161         if (dispositionArgs) {
162             /**
163              * https://developer.mozilla.org/En/NsIFilePicker
164              * Example: 
165              * { defaultString : 'MyExport.csv',
166                  defaultExtension : '.csv',
167                  filterName : 'CSV',
168                  filterExtension : '*.csv',
169                  filterAll : true } */
170
171             picker.defaultString = dispositionArgs.defaultString;
172             picker.defaultExtension = dispositionArgs.defaultExtension;
173             if (dispositionArgs.filterName) {
174                 picker.appendFilter(
175                     dispositionArgs.filterName,
176                     dispositionArgs.filterExtension
177                 );
178             }
179             if (dispositionArgs.filterAll) 
180                 picker.appendFilters(picker.filterAll)
181         }
182
183         var result = picker.show();
184         if (picker.file &&
185                 (result == api.FP.iface.returnOK ||
186                     result == api.FP.iface.returnReplace)) {
187             if (!picker.file.exists())
188                 picker.file.create(0, 0644); /* XXX hardcoded = bad */
189             var fos = api.create("FOS");
190             fos.init(picker.file, 42 /* WRONLY | CREAT | TRUNCATE */, 0644, 0);
191             return fos.write(content, content.length);
192         } else {
193             return 0;
194         }
195     };
196  }catch (e) {/*meh*/}
197 }