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