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