]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/chrome/content/util/browser.js
printing the contents of iframes is sometimes problematic, especially with complex...
[working/Evergreen.git] / Open-ILS / xul / staff_client / chrome / content / util / browser.js
1 dump('entering util.browser.js\n');
2
3 if (typeof util == 'undefined') util = {};
4 util.browser = function (params) {
5     try {
6         netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
7         JSAN.use('util.error'); this.error = new util.error();
8     } catch(E) {
9         dump('util.browser: ' + E + '\n');
10     }
11 }
12
13 util.browser.prototype = {
14
15     'init' : function( params ) {
16
17         try {
18             netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
19
20             var obj = this;
21
22             obj.url = params['url'];
23             obj.push_xulG = params['push_xulG'];
24             obj.html_source = params['html_source'];
25             obj.browser_id = params['browser_id'];
26             obj.debug_label = params['debug_label'];
27             obj.passthru_content_params = params['passthru_content_params'];
28             obj.on_url_load = params['on_url_load'];
29
30             JSAN.use('util.controller'); obj.controller = new util.controller();
31             obj.controller.init(
32                 {
33                     control_map : {
34                         'cmd_broken' : [
35                             ['command'],
36                             function() { alert('Not Yet Implemented'); }
37                         ],
38                         'cmd_debug' : [
39                             ['command'],
40                             function() {
41                                 var curr_url = obj.get_content().location.href;
42                                 var url = window.prompt('Original URL: ' + obj.url + '\nCurrent URL: ' + curr_url + '\nEnter new URL:',curr_url);
43                                 if (url) { obj.get_content().location.href = url; }
44                             }
45                         ],
46                         'cmd_print' : [
47                             ['command'],
48                             function() {
49                                 try {
50                                     netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
51                                     var content = obj.get_content();
52                                     JSAN.use('util.print'); var p = new util.print();
53                                     var print_params = {};
54                                     if (obj.html_source) {
55                                         print_params.msg = obj.html_source;
56                                     }
57                                     if (typeof content.printable_output == 'function') {
58                                         print_params.msg = content.printable_output();
59                                     }
60                                     JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.stash_retrieve();
61                                     if (data.print_strategy == 'webBrowserPrint' || !data.print_strategy) {
62                                         // Override the print strategy temporarily in this context
63                                         print_params.print_strategy = 'window.print';
64                                     }
65                                     p.NSPrint(content,false,print_params);
66                                 } catch(E) {
67                                     alert('browser.js, cmd_print exception: ' + E);
68                                 }
69                             }
70                         ],
71                         'cmd_forward' : [
72                             ['command'],
73                             function() {
74                                 try {
75                                     netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
76                                     var n = obj.getWebNavigation();
77                                     if (n.canGoForward) n.goForward();
78                                 } catch(E) {
79                                     var err = 'cmd_forward: ' + E;
80                                     obj.error.sdump('D_ERROR',err);
81                                 }
82                             }
83                         ],
84                         'cmd_back' : [
85                             ['command'],
86                             function() {
87                                 try {
88                                     netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
89                                     var n = obj.getWebNavigation();
90                                     if (n.canGoBack) n.goBack();
91                                 } catch(E) {
92                                     var err = 'cmd_back: ' + E;
93                                     obj.error.sdump('D_ERROR',err);
94                                 }
95                             }
96                         ],
97                         'cmd_reload' : [
98                             ['command'],
99                             function() {
100                                 try {
101                                     netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
102                                     var n = obj.getWebNavigation();
103                                     n.reload( Components.interfaces.nsIWebNavigation.LOAD_FLAGS_NONE );
104                                 } catch(E) {
105                                     var err = 'cmd_reload: ' + E;
106                                     obj.error.sdump('D_ERROR',err);
107                                 }
108                             }
109                         ]
110                     }
111                 }
112             );
113             obj.controller.render();
114
115             var browser_id = 'browser_browser'; if (obj.browser_id) browser_id = obj.browser_id;
116             obj.controller.view.browser_browser = document.getElementById(browser_id);
117
118             obj.buildProgressListener();
119             /*
120             dump('obj.controller.view.browser_browser.addProgressListener = ' 
121                 + obj.controller.view.browser_browser.addProgressListener + '\n');
122             */
123             obj.controller.view.browser_browser.addProgressListener(obj.progressListener,
124                             Components.interfaces.nsIWebProgress.NOTIFY_ALL );
125
126             obj.controller.view.browser_browser.setAttribute('src',obj.url);
127             //dump('browser url = ' + obj.url + '\n');
128
129             window.help_context_set_locally = true;
130
131         } catch(E) {
132             this.error.sdump('D_ERROR','util.browser.init: ' + E + '\n');
133         }
134     },
135
136     'get_content' : function() {
137         try {
138             netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
139             if (this.controller.view.browser_browser.contentWindow.wrappedJSObject) {
140                 return this.controller.view.browser_browser.contentWindow.wrappedJSObject;
141             } else {
142                 return this.controller.view.browser_browser.contentWindow;
143             }
144         } catch(E) {
145             this.error.sdump('D_ERROR','util.browser.get_content(): ' + E);
146         }
147     },
148
149     'push_variables' : function() {
150         try {
151             var obj = this;
152             var s = '';
153             try { s += obj.url + '\n' + obj.get_content().location.href + '\n'; } catch(E) { s+=E + '\n'; }
154             if (!obj.push_xulG) return;
155             netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
156             var cw = this.get_content();
157             cw.IAMXUL = true;
158             cw.XUL_BUILD_ID = '/xul/server/'.split(/\//)[2];
159             cw.xulG = obj.passthru_content_params || {};
160             cw.xulG.set_tab = window.xulG.set_tab;
161             cw.xulG.new_tab = window.xulG.new_tab;
162             cw.xulG.new_patron_tab = window.xulG.new_patron_tab;
163             cw.xulG.set_patron_tab = window.xulG.set_patron_tab;
164             cw.xulG.volume_item_creator = window.xulG.volume_item_creator;
165             cw.xulG.get_new_session = window.xulG.get_new_session;
166             cw.xulG.holdings_maintenance_tab = window.xulG.holdings_maintenance_tab;
167             cw.xulG.url_prefix = window.xulG.url_prefix;
168             cw.xulG.urls = window.urls;
169             try { s += ('******** cw = ' + cw + ' cw.xulG = ' + (cw.xulG) + '\n'); } catch(E) { s+=E + '\n'; }
170             obj.error.sdump('D_BROWSER',s);
171         } catch(E) {
172             this.error.sdump('D_ERROR','util.browser.push_variables: ' + E + '\n');
173         }
174     },
175
176     'getWebNavigation' : function() {
177         try {
178             netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
179             var wn = this.controller.view.browser_browser.webNavigation;
180             var s = this.url + '\n' + this.get_content().location.href + '\n';
181             s += ('getWebNavigation() = ' + wn + '\n');
182             //this.error.sdump('D_BROWSER',s);
183             return wn;
184         } catch(E) {
185             this.error.sdump('D_ERROR','util.browser.getWebNavigation(): ' + E );
186         }
187     },
188
189     'updateNavButtons' : function() {
190         netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
191         var obj = this; 
192         var s = obj.url + '\n' + obj.get_content().location.href + '\n';
193         try {
194             var n = obj.getWebNavigation();
195             s += ('webNavigation = ' + n + '\n');
196             s += ('webNavigation.canGoForward = ' + n.canGoForward + '\n');
197             if (n.canGoForward) {
198                 if (typeof obj.controller.view.cmd_forward != 'undefined') {
199                     obj.controller.view.cmd_forward.disabled = false;
200                     obj.controller.view.cmd_forward.setAttribute('disabled','false');
201                 }
202             } else {
203                 if (typeof obj.controller.view.cmd_forward != 'undefined') {
204                     obj.controller.view.cmd_forward.disabled = true;
205                     obj.controller.view.cmd_forward.setAttribute('disabled','true');
206                 }
207             }
208         } catch(E) {
209             s += E + '\n';
210         }
211         try {
212             var n = obj.getWebNavigation();
213             s += ('webNavigation = ' + n + '\n');
214             s += ('webNavigation.canGoBack = ' + n.canGoBack + '\n');
215             if (n.canGoBack) {
216                 if (typeof obj.controller.view.cmd_back != 'undefined') {
217                     obj.controller.view.cmd_back.disabled = false;
218                     obj.controller.view.cmd_back.setAttribute('disabled','false');
219                 }
220             } else {
221                 if (typeof obj.controller.view.cmd_back != 'undefined') {
222                     obj.controller.view.cmd_back.disabled = true;
223                     obj.controller.view.cmd_back.setAttribute('disabled','true');
224                 }
225             }
226         } catch(E) {
227             s += E + '\n';
228         }
229         //this.error.sdump('D_BROWSER',s);
230
231         // Let's also update @protocol, @hostname, @port, and @pathname on the <help> widget
232         if (xulG.set_help_context) {
233             try {
234                 var help_params = {
235                     'protocol' : obj.get_content().location.protocol,
236                     'hostname' : obj.get_content().location.hostname,
237                     'port' : obj.get_content().location.port,
238                     'pathname' : obj.get_content().location.pathname,
239                     'src' : ''
240                 };
241                 xulG.set_help_context(help_params);
242             } catch(E) {
243                 dump('Error in browser.js, setting location on help widget: ' + E);
244             }
245         } else {
246             dump(location.href + ': browser.js, updateNavButtons, xulG = ' + xulG + ' xulG.set_help_context = ' + xulG.set_help_context + '\n');
247         }
248     },
249
250     'buildProgressListener' : function() {
251
252         try {
253             netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
254
255             var obj = this;
256             obj.progressListener = {
257                 onProgressChange    : function(){},
258                 onLocationChange    : function(){},
259                 onStatusChange        : function(){},
260                 onSecurityChange    : function(){},
261                 onStateChange         : function ( webProgress, request, stateFlags, status) {
262                     try {
263                         netscape.security.PrivilegeManager.enablePrivilege( "UniversalXPConnect" );
264                         var s = obj.url + '\n' + obj.get_content().location.href + '\n';
265                         const nsIWebProgressListener = Components.interfaces.nsIWebProgressListener;
266                         const nsIChannel = Components.interfaces.nsIChannel;
267                         ////// handle the throbber
268                         var throbber = xulG.page_meter;
269                         if (throbber) {
270                             var busy = false;
271                             if (!(stateFlags & nsIWebProgressListener.STATE_RESTORING)) {
272                                 busy = true;
273                                 throbber.on();
274                             }
275                             if (stateFlags & nsIWebProgressListener.STATE_STOP) {
276                                 busy = false;
277                                 setTimeout(
278                                     function() {
279                                         if (!busy) { throbber.off(); }
280                                     }, 2000
281                                 );
282                             }
283                         }
284                         //////
285                         if (stateFlags == 65540 || stateFlags == 65537 || stateFlags == 65552) { return; }
286                         s += ('onStateChange: stateFlags = ' + stateFlags + ' status = ' + status + '\n');
287                         if (stateFlags & nsIWebProgressListener.STATE_IS_REQUEST) {
288                             s += ('\tSTATE_IS_REQUEST\n');
289                         }
290                         if (stateFlags & nsIWebProgressListener.STATE_IS_DOCUMENT) {
291                             s += ('\tSTATE_IS_DOCUMENT\n');
292                             if( stateFlags & nsIWebProgressListener.STATE_STOP ) {
293                                 obj.push_variables(); obj.updateNavButtons();
294                                 if (typeof obj.on_url_load == 'function') {
295                                     try {
296                                         obj.error.sdump('D_TRACE','calling on_url_load');
297                                         var helpers = {
298                                             'doc_write' : function(html) {
299                                                 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
300                                                 obj.get_content().document.write(html);
301                                             },
302                                             'doc_close' : function() {
303                                                 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
304                                                 obj.get_content().document.close();
305                                             }
306                                         }
307                                         obj.on_url_load( obj.controller.view.browser_browser, obj, helpers );
308                                     } catch(E) {
309                                         obj.error.sdump('D_ERROR','on_url_load: ' + E );
310                                     }
311                                 }
312                                 if (obj.debug_label) {
313                                     try {
314                                         document.getElementById(obj.debug_label).setAttribute('tooltiptext','url: ' + obj.get_content().location.href);
315                                     } catch(E) {
316                                         obj.error.sdump('D_ERROR','on_url_load, debug_label: ' + E );
317                                     }
318                                 }
319                             }
320                         }
321                         if (stateFlags & nsIWebProgressListener.STATE_IS_NETWORK) {
322                             s += ('\tSTATE_IS_NETWORK\n');
323                         }
324                         if (stateFlags & nsIWebProgressListener.STATE_IS_WINDOW) {
325                             s += ('\tSTATE_IS_WINDOW\n');
326                         }
327                         if (stateFlags & nsIWebProgressListener.STATE_START) {
328                             s += ('\tSTATE_START\n');
329                         }
330                         if (stateFlags & nsIWebProgressListener.STATE_REDIRECTING) {
331                             s += ('\tSTATE_REDIRECTING\n');
332                         }
333                         if (stateFlags & nsIWebProgressListener.STATE_TRANSFERING) {
334                             s += ('\tSTATE_TRANSFERING\n');
335                         }
336                         if (stateFlags & nsIWebProgressListener.STATE_NEGOTIATING) {
337                             s += ('\tSTATE_NEGOTIATING\n');
338                         }
339                         if (stateFlags & nsIWebProgressListener.STATE_STOP) {
340                             s += ('\tSTATE_STOP\n');
341                         }
342                         //obj.error.sdump('D_BROWSER',s);    
343                         if (throbber) { throbber.tooltip(s); }
344                     } catch(E) {
345                         obj.error.sdump('D_ERROR','util.browser.progresslistener.onstatechange: ' + (E));
346                     }
347                 }
348             }
349             obj.progressListener.QueryInterface = function(){return this;};
350         } catch(E) {
351             this.error.sdump('D_ERROR','util.browser.buildProgressListener: ' + E + '\n');
352         }
353     }
354 }
355
356 dump('exiting util.browser.js\n');