]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/chrome/content/util/browser.js
infrastructure for context sensitive print setting
[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             obj.printer_context = params['printer_context'] || 'default';
30
31             JSAN.use('util.controller'); obj.controller = new util.controller();
32             obj.controller.init(
33                 {
34                     control_map : {
35                         'cmd_broken' : [
36                             ['command'],
37                             function() { alert('Not Yet Implemented'); }
38                         ],
39                         'cmd_debug' : [
40                             ['command'],
41                             function() {
42                                 var curr_url = obj.get_content().location.href;
43                                 var url = window.prompt('Original URL: ' + obj.url + '\nCurrent URL: ' + curr_url + '\nEnter new URL:',curr_url);
44                                 if (url) { obj.get_content().location.href = url; }
45                             }
46                         ],
47                         'cmd_print' : [
48                             ['command'],
49                             function() {
50                                 try {
51                                     netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
52                                     var content = obj.get_content();
53                                     JSAN.use('util.print'); var p = new util.print();
54                                     var print_params = {};
55                                     if (obj.html_source) {
56                                         print_params.msg = obj.html_source;
57                                         print_params.content_type = 'text/html';
58                                     }
59                                     if (typeof content.printable_output == 'function') {
60                                         print_params.msg = content.printable_output();
61                                         print_params.content_type = 'text/plain';
62                                     }
63                                     JSAN.use('OpenILS.data'); var data = new OpenILS.data(); data.stash_retrieve();
64                                     if (
65                                         !data.print_strategy
66                                         || !data.print_strategy[obj.printer_context]
67                                         || (data.print_strategy[obj.printer_context] && data.print_strategy[obj.printer_context] == 'webBrowserPrint')
68                                         || !data.print_strategy['default']
69                                         || (data.print_strategy['default'] && data.print_strategy['default'] == 'webBrowserPrint')
70                                     ) {
71                                         // Override the print strategy temporarily in this context
72                                         print_params.print_strategy = 'window.print';
73                                     }
74                                     p.NSPrint(content,false,print_params);
75                                 } catch(E) {
76                                     alert('browser.js, cmd_print exception: ' + E);
77                                 }
78                             }
79                         ],
80                         'cmd_forward' : [
81                             ['command'],
82                             function() {
83                                 try {
84                                     netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
85                                     var n = obj.getWebNavigation();
86                                     if (n.canGoForward) n.goForward();
87                                 } catch(E) {
88                                     var err = 'cmd_forward: ' + E;
89                                     obj.error.sdump('D_ERROR',err);
90                                 }
91                             }
92                         ],
93                         'cmd_back' : [
94                             ['command'],
95                             function() {
96                                 try {
97                                     netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
98                                     var n = obj.getWebNavigation();
99                                     if (n.canGoBack) n.goBack();
100                                 } catch(E) {
101                                     var err = 'cmd_back: ' + E;
102                                     obj.error.sdump('D_ERROR',err);
103                                 }
104                             }
105                         ],
106                         'cmd_reload' : [
107                             ['command'],
108                             function() {
109                                 try {
110                                     netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
111                                     var n = obj.getWebNavigation();
112                                     n.reload( Components.interfaces.nsIWebNavigation.LOAD_FLAGS_NONE );
113                                 } catch(E) {
114                                     var err = 'cmd_reload: ' + E;
115                                     obj.error.sdump('D_ERROR',err);
116                                 }
117                             }
118                         ],
119                         'cmd_find' : [
120                             ['command'],
121                             function() {
122                                 var text = window.prompt('Enter text to find:');
123                                 obj.find(text);
124                             }
125                         ]
126                     }
127                 }
128             );
129             obj.controller.render();
130
131             var browser_id = 'browser_browser'; if (obj.browser_id) browser_id = obj.browser_id;
132             obj.controller.view.browser_browser = document.getElementById(browser_id);
133
134             obj.buildProgressListener();
135             /*
136             dump('obj.controller.view.browser_browser.addProgressListener = ' 
137                 + obj.controller.view.browser_browser.addProgressListener + '\n');
138             */
139             obj.controller.view.browser_browser.addProgressListener(obj.progressListener,
140                             Components.interfaces.nsIWebProgress.NOTIFY_ALL );
141
142             obj.controller.view.browser_browser.setAttribute('src',obj.url);
143             //dump('browser url = ' + obj.url + '\n');
144
145             window.help_context_set_locally = true;
146
147         } catch(E) {
148             this.error.sdump('D_ERROR','util.browser.init: ' + E + '\n');
149         }
150     },
151
152     'find' : function(text) {
153         var obj = this;
154         try {
155             netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
156
157             function getBrowser() {
158                 return obj.controller.view.browser_browser;
159             }
160
161             function getFocusedSelCtrl() {
162                 var ds = getBrowser().docShell;
163                 var dsEnum = ds.getDocShellEnumerator(Components.interfaces.nsIDocShellTreeItem.typeContent,
164                                                     Components.interfaces.nsIDocShell.ENUMERATE_FORWARDS);
165                 while (dsEnum.hasMoreElements()) {
166                     ds = dsEnum.getNext().QueryInterface(Components.interfaces.nsIDocShell);
167                     if (ds.hasFocus) {
168                         var display = ds.QueryInterface(Components.interfaces.nsIInterfaceRequestor).getInterface(Components.interfaces.nsISelectionDisplay);
169                         if (!display) return null;
170                         return display.QueryInterface(Components.interfaces.nsISelectionController);
171                     }
172                 }
173
174                 // One last try
175                 return getBrowser().docShell
176                     .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
177                     .getInterface(Components.interfaces.nsISelectionDisplay)
178                     .QueryInterface(Components.interfaces.nsISelectionController);
179             }
180
181             function setSelection(range) {
182                 try {
183                     var selctrlcomp = Components.interfaces.nsISelectionController;
184                     var selctrl = getFocusedSelCtrl();
185                     var sel = selctrl.getSelection(selctrlcomp.SELECTION_NORMAL);
186                     sel.removeAllRanges();
187                     sel.addRange(range.cloneRange());
188
189                     selctrl.scrollSelectionIntoView(selctrlcomp.SELECTION_NORMAL,
190                         selctrlcomp.SELECTION_FOCUS_REGION,
191                         true);
192                 } catch(e) {alert("setSelection: " + e);}
193             }
194
195             var doc = obj.get_content().document;
196             var body = doc.body;
197             var count = body.childNodes.length;
198             var finder = Components.classes["@mozilla.org/embedcomp/rangefind;1"].createInstance()
199                 .QueryInterface(Components.interfaces.nsIFind);
200             var searchRange = doc.createRange();
201             var startPt = doc.createRange();
202             var endPt = doc.createRange();
203                 searchRange.setStart(body,0);
204                 searchRange.setEnd(body, count);
205                 startPt.setStart(body, 0);
206                 startPt.setEnd(body, 0);
207                 endPt.setStart(body, count);
208                 endPt.setEnd(body, count);
209             var retRange = finder.Find(text, searchRange, startPt, endPt);
210             dump('retRange = ' + retRange + '\n');
211             setSelection(retRange);
212         } catch(E) {
213             alert('Error in browser.js, find(): ' + E);
214         }
215     },
216
217     'get_content' : function() {
218         try {
219             netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
220             if (this.controller.view.browser_browser.contentWindow.wrappedJSObject) {
221                 return this.controller.view.browser_browser.contentWindow.wrappedJSObject;
222             } else {
223                 return this.controller.view.browser_browser.contentWindow;
224             }
225         } catch(E) {
226             this.error.sdump('D_ERROR','util.browser.get_content(): ' + E);
227         }
228     },
229
230     'push_variables' : function() {
231         try {
232             var obj = this;
233             var s = '';
234             try { s += obj.url + '\n' + obj.get_content().location.href + '\n'; } catch(E) { s+=E + '\n'; }
235             if (!obj.push_xulG) return;
236             netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
237             var cw = this.get_content();
238             cw.IAMXUL = true;
239             cw.XUL_BUILD_ID = '/xul/server/'.split(/\//)[2];
240             cw.xulG = obj.passthru_content_params || {};
241             if (!cw.xulG.set_tab) { cw.xulG.set_tab = function(a,b,c) { return window.xulG.set_tab(a,b,c); }; }
242             if (!cw.xulG.new_tab) { cw.xulG.new_tab = function(a,b,c) { return window.xulG.new_tab(a,b,c); }; }
243             if (!cw.xulG.new_patron_tab) { cw.xulG.new_patron_tab = function(a,b) { return window.xulG.new_patron_tab(a,b); }; }
244             if (!cw.xulG.set_patron_tab) { cw.xulG.set_patron_tab = function(a,b) { return window.xulG.set_patron_tab(a,b); }; }
245             if (!cw.xulG.volume_item_creator) { cw.xulG.volume_item_creator = function(a) { return window.xulG.volume_item_creator(a); }; }
246             if (!cw.xulG.get_new_session) { cw.xulG.get_new_session = function(a) { return window.xulG.get_new_session(a); }; }
247             if (!cw.xulG.holdings_maintenance_tab) { cw.xulG.holdings_maintenance_tab = function(a,b,c) { return window.xulG.holdings_maintenance_tab(a,b,c); }; }
248             if (!cw.xulG.url_prefix) { cw.xulG.url_prefix = function(url) { return window.xulG.url_prefix(url); }; }
249             if (!cw.xulG.urls) { cw.xulG.urls = window.urls; }
250             try { s += ('******** cw = ' + cw + ' cw.xulG = ' + (cw.xulG) + '\n'); } catch(E) { s+=E + '\n'; }
251             obj.error.sdump('D_BROWSER',s);
252         } catch(E) {
253             this.error.sdump('D_ERROR','util.browser.push_variables: ' + E + '\n');
254         }
255     },
256
257     'getWebNavigation' : function() {
258         try {
259             netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
260             var wn = this.controller.view.browser_browser.webNavigation;
261             var s = this.url + '\n' + this.get_content().location.href + '\n';
262             s += ('getWebNavigation() = ' + wn + '\n');
263             //this.error.sdump('D_BROWSER',s);
264             return wn;
265         } catch(E) {
266             this.error.sdump('D_ERROR','util.browser.getWebNavigation(): ' + E );
267         }
268     },
269
270     'updateNavButtons' : function() {
271         netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
272         var obj = this; 
273         var s = obj.url + '\n' + obj.get_content().location.href + '\n';
274         try {
275             var n = obj.getWebNavigation();
276             s += ('webNavigation = ' + n + '\n');
277             s += ('webNavigation.canGoForward = ' + n.canGoForward + '\n');
278             if (n.canGoForward) {
279                 if (typeof obj.controller.view.cmd_forward != 'undefined') {
280                     obj.controller.view.cmd_forward.disabled = false;
281                     obj.controller.view.cmd_forward.setAttribute('disabled','false');
282                 }
283             } else {
284                 if (typeof obj.controller.view.cmd_forward != 'undefined') {
285                     obj.controller.view.cmd_forward.disabled = true;
286                     obj.controller.view.cmd_forward.setAttribute('disabled','true');
287                 }
288             }
289         } catch(E) {
290             s += E + '\n';
291         }
292         try {
293             var n = obj.getWebNavigation();
294             s += ('webNavigation = ' + n + '\n');
295             s += ('webNavigation.canGoBack = ' + n.canGoBack + '\n');
296             if (n.canGoBack) {
297                 if (typeof obj.controller.view.cmd_back != 'undefined') {
298                     obj.controller.view.cmd_back.disabled = false;
299                     obj.controller.view.cmd_back.setAttribute('disabled','false');
300                 }
301             } else {
302                 if (typeof obj.controller.view.cmd_back != 'undefined') {
303                     obj.controller.view.cmd_back.disabled = true;
304                     obj.controller.view.cmd_back.setAttribute('disabled','true');
305                 }
306             }
307         } catch(E) {
308             s += E + '\n';
309         }
310         //this.error.sdump('D_BROWSER',s);
311
312         // Let's also update @protocol, @hostname, @port, and @pathname on the <help> widget
313         if (xulG.set_help_context) {
314             try {
315                 var help_params = {
316                     'protocol' : obj.get_content().location.protocol,
317                     'hostname' : obj.get_content().location.hostname,
318                     'port' : obj.get_content().location.port,
319                     'pathname' : obj.get_content().location.pathname,
320                     'src' : ''
321                 };
322                 xulG.set_help_context(help_params);
323             } catch(E) {
324                 dump('Error in browser.js, setting location on help widget: ' + E);
325             }
326         } else {
327             dump(location.href + ': browser.js, updateNavButtons, xulG = ' + xulG + ' xulG.set_help_context = ' + xulG.set_help_context + '\n');
328         }
329     },
330
331     'buildProgressListener' : function() {
332
333         try {
334             netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
335
336             var obj = this;
337             obj.progressListener = {
338                 onProgressChange    : function(){},
339                 onLocationChange    : function(){},
340                 onStatusChange        : function(){},
341                 onSecurityChange    : function(){},
342                 onStateChange         : function ( webProgress, request, stateFlags, status) {
343                     try {
344                         netscape.security.PrivilegeManager.enablePrivilege( "UniversalXPConnect" );
345                         var s = obj.url + '\n' + obj.get_content().location.href + '\n';
346                         const nsIWebProgressListener = Components.interfaces.nsIWebProgressListener;
347                         const nsIChannel = Components.interfaces.nsIChannel;
348                         ////// handle the throbber
349                         var throbber = xulG.page_meter;
350                         if (throbber) {
351                             var busy = false;
352                             if (!(stateFlags & nsIWebProgressListener.STATE_RESTORING)) {
353                                 busy = true;
354                                 throbber.on();
355                             }
356                             if (stateFlags & nsIWebProgressListener.STATE_STOP) {
357                                 busy = false;
358                                 setTimeout(
359                                     function() {
360                                         if (!busy) { throbber.off(); }
361                                     }, 2000
362                                 );
363                             }
364                         }
365                         //////
366                         if (stateFlags == 65540 || stateFlags == 65537 || stateFlags == 65552) { return; }
367                         s += ('onStateChange: stateFlags = ' + stateFlags + ' status = ' + status + '\n');
368                         if (stateFlags & nsIWebProgressListener.STATE_IS_REQUEST) {
369                             s += ('\tSTATE_IS_REQUEST\n');
370                         }
371                         if (stateFlags & nsIWebProgressListener.STATE_IS_DOCUMENT) {
372                             s += ('\tSTATE_IS_DOCUMENT\n');
373                             if( stateFlags & nsIWebProgressListener.STATE_STOP ) {
374                                 obj.push_variables(); obj.updateNavButtons();
375                                 if (typeof obj.on_url_load == 'function') {
376                                     try {
377                                         obj.error.sdump('D_TRACE','calling on_url_load');
378                                         var helpers = {
379                                             'doc_write' : function(html) {
380                                                 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
381                                                 obj.get_content().document.write(html);
382                                             },
383                                             'doc_close' : function() {
384                                                 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
385                                                 obj.get_content().document.close();
386                                             }
387                                         }
388                                         obj.on_url_load( obj.controller.view.browser_browser, obj, helpers );
389                                     } catch(E) {
390                                         obj.error.sdump('D_ERROR','on_url_load: ' + E );
391                                     }
392                                 }
393                                 if (obj.debug_label) {
394                                     try {
395                                         document.getElementById(obj.debug_label).setAttribute('tooltiptext','url: ' + obj.get_content().location.href);
396                                     } catch(E) {
397                                         obj.error.sdump('D_ERROR','on_url_load, debug_label: ' + E );
398                                     }
399                                 }
400                             }
401                         }
402                         if (stateFlags & nsIWebProgressListener.STATE_IS_NETWORK) {
403                             s += ('\tSTATE_IS_NETWORK\n');
404                         }
405                         if (stateFlags & nsIWebProgressListener.STATE_IS_WINDOW) {
406                             s += ('\tSTATE_IS_WINDOW\n');
407                         }
408                         if (stateFlags & nsIWebProgressListener.STATE_START) {
409                             s += ('\tSTATE_START\n');
410                         }
411                         if (stateFlags & nsIWebProgressListener.STATE_REDIRECTING) {
412                             s += ('\tSTATE_REDIRECTING\n');
413                         }
414                         if (stateFlags & nsIWebProgressListener.STATE_TRANSFERING) {
415                             s += ('\tSTATE_TRANSFERING\n');
416                         }
417                         if (stateFlags & nsIWebProgressListener.STATE_NEGOTIATING) {
418                             s += ('\tSTATE_NEGOTIATING\n');
419                         }
420                         if (stateFlags & nsIWebProgressListener.STATE_STOP) {
421                             s += ('\tSTATE_STOP\n');
422                         }
423                         //obj.error.sdump('D_BROWSER',s);    
424                         if (throbber) { throbber.tooltip(s); }
425                     } catch(E) {
426                         obj.error.sdump('D_ERROR','util.browser.progresslistener.onstatechange: ' + (E));
427                     }
428                 }
429             }
430             obj.progressListener.QueryInterface = function(){return this;};
431         } catch(E) {
432             this.error.sdump('D_ERROR','util.browser.buildProgressListener: ' + E + '\n');
433         }
434     }
435 }
436
437 dump('exiting util.browser.js\n');