]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/js/dojo/openils/XUL.js
9385091b90c842d809f414bd7e12294baf2668fb
[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         if(location.protocol == 'chrome:' || location.protocol == 'oils:') return true;
9         return Boolean(window.IAMXUL);
10     }
11
12  try {
13     openils.XUL.buildId = function() {
14         return window.XUL_BUILD_ID || '';
15     }
16     
17     openils.XUL.getStash = function() {
18         if(openils.XUL.isXUL()) {
19             try {
20                 var CacheClass = Components.classes["@open-ils.org/openils_data_cache;1"].getService();
21                 return CacheClass.wrappedJSObject.data;
22             } catch(e) {
23                 console.log("Error loading XUL stash: " + e);
24                 return { 'error' : e };
25             }
26         }
27
28         return { 'error' : 'openils.XUL.isXUL() == false' };
29     }
30
31     openils.XUL.newTab = function(path, tabInfo, options) {
32         if(xulG == undefined) 
33             throw new Error('xulG is not defined.  Cannot open tab');
34         xulG.new_tab(path, tabInfo, options);
35     }
36
37     openils.XUL.newTabEasy = function(
38         url, tab_name, extra_content_params, wrap_in_browser
39     ) {
40         var content_params = {
41             "session": openils.User.authtoken,
42             "authtime": openils.User.authtime
43         };
44
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",
49             "set_help_context"
50         ].forEach(function(k) { content_params[k] = xulG[k]; });
51
52         if (extra_content_params)
53             dojo.mixin(content_params, extra_content_params);
54
55         var loc = xulG.url_prefix(url);
56
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(
61                 {
62                     "no_xulG": false, "show_print_button": true,
63                     "show_nav_buttons": true,
64                     "passthru_content_params": extra_content_params
65                 }, content_params
66             );
67         }
68
69         xulG.new_tab(loc, {"tab_name": tab_name}, content_params);
70     };
71
72     /**
73      * @return bool True if a new session was successfully created, false otherwise.
74      */
75     openils.XUL.getNewSession = function(callback) {
76         return xulG.get_new_session({callback : callback});
77     }
78
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 = {
83         "FP": {
84             "iface": Components.interfaces.nsIFilePicker,
85             "cls": "@mozilla.org/filepicker;1"
86         },
87         "FIS": {
88             "iface": Components.interfaces.nsIFileInputStream,
89             "cls": "@mozilla.org/network/file-input-stream;1"
90         },
91         "SIS": {
92             "iface": Components.interfaces.nsIScriptableInputStream,
93             "cls": "@mozilla.org/scriptableinputstream;1"
94         },
95         "FOS": {
96             "iface": Components.interfaces.nsIFileOutputStream,
97             "cls": "@mozilla.org/network/file-output-stream;1"
98         },
99         "create": function(key) {
100             return Components.classes[this[key].cls].
101                 createInstance(this[key].iface);
102         }
103     };
104
105     openils.XUL.contentFromFileOpenDialog = function(windowTitle, sizeLimit) {
106         var api = new openils.XUL.SimpleXPCOM();
107
108         var picker = api.create("FP");
109         picker.init(
110             window, windowTitle || "Upload File", api.FP.iface.modeOpen
111         );
112         if (picker.show() == api.FP.iface.returnOK && picker.file) {
113             var fis = api.create("FIS");
114             var sis = api.create("SIS");
115
116             fis.init(picker.file, 1 /* MODE_RDONLY */, 0, 0);
117             sis.init(fis);
118
119             return sis.read(sizeLimit || -1);
120         } else {
121             return null;
122         }
123     };
124
125     openils.XUL.contentToFileSaveDialog = function(content, windowTitle, dispositionArgs) {
126         var api = new openils.XUL.SimpleXPCOM();
127
128         var picker = api.create("FP");
129         picker.init(
130             window, windowTitle || "Save File", api.FP.iface.modeSave
131         );
132
133         if (dispositionArgs) {
134             /**
135              * https://developer.mozilla.org/En/NsIFilePicker
136              * Example: 
137              * { defaultString : 'MyExport.csv',
138                  defaultExtension : '.csv',
139                  filterName : 'CSV',
140                  filterExtension : '*.csv',
141                  filterAll : true } */
142
143             picker.defaultString = dispositionArgs.defaultString;
144             picker.defaultExtension = dispositionArgs.defaultExtension;
145             if (dispositionArgs.filterName) {
146                 picker.appendFilter(
147                     dispositionArgs.filterName,
148                     dispositionArgs.filterExtension
149                 );
150             }
151             if (dispositionArgs.filterAll) 
152                 picker.appendFilters(picker.filterAll)
153         }
154
155         var result = picker.show();
156         if (picker.file &&
157                 (result == api.FP.iface.returnOK ||
158                     result == api.FP.iface.returnReplace)) {
159             if (!picker.file.exists())
160                 picker.file.create(0, 0644); /* XXX hardcoded = bad */
161             var fos = api.create("FOS");
162             fos.init(picker.file, 42 /* WRONLY | CREAT | TRUNCATE */, 0644, 0);
163             return fos.write(content, content.length);
164         } else {
165             return 0;
166         }
167     };
168  }catch (e) {/*meh*/}
169 }