1 if(!dojo._hasResource["openils.XUL"]) {
3 dojo.provide("openils.XUL");
4 dojo.require('dojo.cookie');
5 dojo.declare('openils.XUL', null, {});
7 openils.XUL.isXUL = function() {
8 if(location.protocol == 'chrome:' || location.protocol == 'oils:') return true;
9 return Boolean(window.IAMXUL);
13 openils.XUL.buildId = function() {
14 return window.XUL_BUILD_ID || '';
17 openils.XUL.getStash = function() {
18 if(openils.XUL.isXUL()) {
20 var CacheClass = Components.classes["@open-ils.org/openils_data_cache;1"].getService();
21 return CacheClass.wrappedJSObject.data;
23 console.log("Error loading XUL stash: " + e);
24 return { 'error' : e };
28 return { 'error' : 'openils.XUL.isXUL() == false' };
31 openils.XUL.newTab = function(path, tabInfo, options) {
33 throw new Error('xulG is not defined. Cannot open tab');
34 xulG.new_tab(path, tabInfo, options);
37 openils.XUL.newTabEasy = function(
38 url, tab_name, extra_content_params, wrap_in_browser
40 var content_params = {
41 "session": openils.User.authtoken,
42 "authtime": openils.User.authtime
45 ["url_prefix", "new_tab", "set_tab", "close_tab", "new_patron_tab",
46 "set_patron_tab", "volume_item_creator", "get_new_session",
47 "holdings_maintenance_tab", "set_tab_name", "open_chrome_window",
48 "url_prefix", "network_meter", "page_meter", "set_statusbar",
50 ].forEach(function(k) { content_params[k] = xulG[k]; });
52 if (extra_content_params)
53 dojo.mixin(content_params, extra_content_params);
55 var loc = xulG.url_prefix(url);
57 if (wrap_in_browser) {
58 var urls = xulG.urls || window.urls;
59 loc = urls.XUL_BROWSER + "?url=" + window.escape(loc);
60 content_params = dojo.mixin(
62 "no_xulG": false, "show_print_button": true,
63 "show_nav_buttons": true,
64 "passthru_content_params": extra_content_params
69 xulG.new_tab(loc, {"tab_name": tab_name}, content_params);
73 * @return bool True if a new session was successfully created, false otherwise.
75 openils.XUL.getNewSession = function(callback) {
76 return xulG.get_new_session({callback : callback});
79 /* This class cuts down on the obscenely long incantations needed to
80 * use XPCOM components. */
81 openils.XUL.SimpleXPCOM = function() {};
82 openils.XUL.SimpleXPCOM.prototype = {
84 "iface": Components.interfaces.nsIFilePicker,
85 "cls": "@mozilla.org/filepicker;1"
88 "iface": Components.interfaces.nsIFileInputStream,
89 "cls": "@mozilla.org/network/file-input-stream;1"
92 "iface": Components.interfaces.nsIScriptableInputStream,
93 "cls": "@mozilla.org/scriptableinputstream;1"
96 "iface": Components.interfaces.nsIFileOutputStream,
97 "cls": "@mozilla.org/network/file-output-stream;1"
100 "iface": Components.interfaces.nsIConverterOutputStream,
101 "cls": "@mozilla.org/intl/converter-output-stream;1"
103 "create": function(key) {
104 return Components.classes[this[key].cls].
105 createInstance(this[key].iface);
109 openils.XUL.contentFromFileOpenDialog = function(windowTitle, sizeLimit) {
110 var api = new openils.XUL.SimpleXPCOM();
112 var picker = api.create("FP");
114 window, windowTitle || "Upload File", api.FP.iface.modeOpen
116 if (picker.show() == api.FP.iface.returnOK && picker.file) {
117 var fis = api.create("FIS");
118 var sis = api.create("SIS");
120 fis.init(picker.file, 1 /* MODE_RDONLY */, 0, 0);
123 return sis.read(sizeLimit || -1);
129 openils.XUL.contentToFileSaveDialog = function(content, windowTitle, dispositionArgs) {
130 var api = new openils.XUL.SimpleXPCOM();
132 var picker = api.create("FP");
134 window, windowTitle || "Save File", api.FP.iface.modeSave
137 if (dispositionArgs) {
139 * https://developer.mozilla.org/En/NsIFilePicker
141 * { defaultString : 'MyExport.csv',
142 defaultExtension : '.csv',
144 filterExtension : '*.csv',
145 filterAll : true } */
147 picker.defaultString = dispositionArgs.defaultString;
148 picker.defaultExtension = dispositionArgs.defaultExtension;
149 if (dispositionArgs.filterName) {
151 dispositionArgs.filterName,
152 dispositionArgs.filterExtension
155 if (dispositionArgs.filterAll)
156 picker.appendFilters(picker.filterAll)
159 var result = picker.show();
161 (result == api.FP.iface.returnOK ||
162 result == api.FP.iface.returnReplace)) {
163 if (!picker.file.exists())
164 picker.file.create(0, 0644); /* XXX hardcoded = bad */
166 var fos = api.create("FOS");
167 fos.init(picker.file, 42 /* WRONLY | CREAT | TRUNCATE */, 0644, 0);
169 var cos = api.create("COS");
170 cos.init(fos, "UTF-8", 0, 0); /* It's the 21st century. You don't
172 cos.writeString(content);