]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/js/dojo/openils/XUL.js
Acq+Vandelay: post-upload links open in embedded browser
[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             loc = xulG.urls.XUL_BROWSER + "?url=" + window.escape(loc);
61             content_params = dojo.mixin(
62                 {
63                     "no_xulG": false, "show_print_button": true,
64                     "show_nav_buttons": true,
65                     "passthru_content_params": extra_content_params
66                 }, content_params
67             );
68         }
69
70         xulG.new_tab(loc, {"tab_name": tab_name}, content_params);
71     };
72
73     /**
74      * @return bool True if a new session was successfully created, false otherwise.
75      */
76     openils.XUL.getNewSession = function(callback) {
77         return xulG.get_new_session({callback : callback});
78     }
79
80     /** 
81      * This can be used by privileged Firefox in addition to XUL.
82      * To use use in Firefox directly, set signed.applets.codebase_principal_support to true in about:config
83      */ 
84     openils.XUL.enableXPConnect = function() {
85         try {
86             netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
87         } catch (E) {
88             if(dojo.isFF) {
89                 console.error("Unable to enable UniversalXPConnect privileges.  " +
90                     "Try setting 'signed.applets.codebase_principal_support' to true in about:config");
91             }
92             return false;
93         }
94         return true;
95     }
96
97     /* This class cuts down on the obscenely long incantations needed to
98      * use XPCOM components. */
99     openils.XUL.SimpleXPCOM = function() {};
100     openils.XUL.SimpleXPCOM.prototype = {
101         "FP": {
102             "iface": Components.interfaces.nsIFilePicker,
103             "cls": "@mozilla.org/filepicker;1"
104         },
105         "FIS": {
106             "iface": Components.interfaces.nsIFileInputStream,
107             "cls": "@mozilla.org/network/file-input-stream;1"
108         },
109         "SIS": {
110             "iface": Components.interfaces.nsIScriptableInputStream,
111             "cls": "@mozilla.org/scriptableinputstream;1"
112         },
113         "FOS": {
114             "iface": Components.interfaces.nsIFileOutputStream,
115             "cls": "@mozilla.org/network/file-output-stream;1"
116         },
117         "create": function(key) {
118             return Components.classes[this[key].cls].
119                 createInstance(this[key].iface);
120         },
121         "getPrivilegeManager": function() {
122             return netscape.security.PrivilegeManager;
123         }
124     };
125
126     openils.XUL.contentFromFileOpenDialog = function(windowTitle, sizeLimit) {
127         var api = new openils.XUL.SimpleXPCOM();
128
129         /* The following enablePrivilege() call must happen at this exact
130          * level of scope -- not wrapped in another function -- otherwise
131          * it doesn't work. */
132         api.getPrivilegeManager().enablePrivilege("UniversalXPConnect");
133
134         var picker = api.create("FP");
135         picker.init(
136             window, windowTitle || "Upload File", api.FP.iface.modeOpen
137         );
138         if (picker.show() == api.FP.iface.returnOK && picker.file) {
139             var fis = api.create("FIS");
140             var sis = api.create("SIS");
141
142             fis.init(picker.file, 1 /* MODE_RDONLY */, 0, 0);
143             sis.init(fis);
144
145             return sis.read(sizeLimit || -1);
146         } else {
147             return null;
148         }
149     };
150
151     openils.XUL.contentToFileSaveDialog = function(content, windowTitle, dispositionArgs) {
152         var api = new openils.XUL.SimpleXPCOM();
153         api.getPrivilegeManager().enablePrivilege("UniversalXPConnect");
154
155         var picker = api.create("FP");
156         picker.init(
157             window, windowTitle || "Save File", api.FP.iface.modeSave
158         );
159
160         if (dispositionArgs) {
161             /**
162              * https://developer.mozilla.org/En/NsIFilePicker
163              * Example: 
164              * { defaultString : 'MyExport.csv',
165                  defaultExtension : '.csv',
166                  filterName : 'CSV',
167                  filterExtension : '*.csv',
168                  filterAll : true } */
169
170             picker.defaultString = dispositionArgs.defaultString;
171             picker.defaultExtension = dispositionArgs.defaultExtension;
172             if (dispositionArgs.filterName) {
173                 picker.appendFilter(
174                     dispositionArgs.filterName,
175                     dispositionArgs.filterExtension
176                 );
177             }
178             if (dispositionArgs.filterAll) 
179                 picker.appendFilters(picker.filterAll)
180         }
181
182         var result = picker.show();
183         if (picker.file &&
184                 (result == api.FP.iface.returnOK ||
185                     result == api.FP.iface.returnReplace)) {
186             if (!picker.file.exists())
187                 picker.file.create(0, 0644); /* XXX hardcoded = bad */
188             var fos = api.create("FOS");
189             fos.init(picker.file, 42 /* WRONLY | CREAT | TRUNCATE */, 0644, 0);
190             return fos.write(content, content.length);
191         } else {
192             return 0;
193         }
194     };
195  }catch (e) {/*meh*/}
196 }