]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/chrome/content/util/error.js
JavaScript strictness cleanup to reduce warning noise at console
[Evergreen.git] / Open-ILS / xul / staff_client / chrome / content / util / error.js
1 dump('entering util/error.js\n');
2
3 if (typeof util == 'undefined') util = {};
4 util.error = function () {
5
6         try {
7                 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
8                 this.consoleService = Components.classes['@mozilla.org/consoleservice;1']
9                         .getService(Components.interfaces.nsIConsoleService);
10         } catch(E) {
11                 this.consoleDump = false;
12                 dump('util.error constructor: ' + E + '\n');
13         }
14
15         this.sdump_last_time = new Date();
16
17         this.OpenILS = {};
18
19         JSAN.use('util.sound'); this.sound = new util.sound();
20
21         return this;
22 };
23
24 util.error.prototype = {
25
26         'printDebug' : true,
27         'consoleDump' : false,
28         'debugDump' : true,
29         'fileDump' : false,
30         'alertDump' : false,
31         'arg_dump_full' : false,
32
33         'debug' : function(e){
34                 dump('-----------------------------------------\n' 
35                         + e + '\n-----------------------------------------\n' );
36         },
37
38         'sdump_levels' : {
39
40                 'D_NONE' : false, 
41                 'D_ALL' : false, 
42                 'D_ERROR' : { 'dump' : true, 'console' : true }, 
43                 'D_DEBUG' : { 'dump' : true, 'console' : true }, 
44                 'D_TRACE' :  { 'dump' : true }, 
45                 'D_ALERT' : { 'alert' : true, 'dump' : true },
46                 'D_WARN' : false, 
47                 'D_COLUMN_RENDER_ERROR' : false, 
48                 'D_XULRUNNER' : false, 
49                 'D_DECK' : { 'dump' : true },
50                 'D_TRACE_ENTER' :  false, 
51                 'D_TRACE_EXIT' :  false, 
52                 'D_TIMEOUT' :  false, 
53                 'D_FILTER' : false,
54                 'D_CONSTRUCTOR' : false, 
55                 'D_FIREFOX' : false, 
56                 'D_LEGACY' : false, 
57                 'D_DATA_STASH' : { 'alert' : false }, 
58                 'D_DATA_RETRIEVE' : false,
59
60                 'D_CLAM' : false, 
61                 'D_PAGED_TREE' : false, 
62                 'D_GRID_LIST' : false, 
63                 'D_HTML_TABLE' : false,
64                 'D_TAB' : false, 
65                 'D_LIST' : false, 
66                 'D_LIST_DUMP_WITH_KEYS_ON_CLEAR' : false, 
67                 'D_LIST_DUMP_ON_CLEAR' : false,
68
69                 'D_AUTH' : { 'dump' : true }, 
70                 'D_OPAC' : { 'dump' : true }, 
71                 'D_CAT' : false, 
72                 'D_BROWSER' : { 'dump' : true },
73
74                 'D_PATRON_SEARCH' : false, 
75                 'D_PATRON_SEARCH_FORM' : false, 
76                 'D_PATRON_SEARCH_RESULTS' : false,
77
78                 'D_PATRON_DISPLAY' : false, 
79                 'D_PATRON_DISPLAY_STATUS' : false, 
80                 'D_PATRON_DISPLAY_CONTACT' : false,
81
82                 'D_PATRON_ITEMS' : false, 
83                 'D_PATRON_CHECKOUT_ITEMS' : false, 
84                 'D_PATRON_HOLDS' : false,
85                 'D_PATRON_BILLS' : false, 
86                 'D_PATRON_EDIT' : false,
87
88                 'D_CHECKIN' : false, 
89                 'D_CHECKIN_ITEMS' : false,
90
91                 'D_HOLD_CAPTURE' : false, 
92                 'D_HOLD_CAPTURE_ITEMS' : false,
93
94                 'D_PATRON_UTILS' : false, 
95                 'D_CIRC_UTILS' : false,
96
97                 'D_FILE' : false, 
98                 'D_EXPLODE' : false, 
99                 'D_FM_UTILS' : false, 
100                 'D_PRINT' : { 'dump' : true }, 
101                 'D_OBSERVERS' : { 'dump' : true, 'console' : false, 'alert' : false },
102                 'D_CACHE' : { 'dump' : true, 'console' : false, 'alert' : false },
103                 'D_SES' : { 'dump' : true, 'console' : false },
104                 'D_SES_FUNC' : false, 
105                 'D_SES_RESULT' : { 'dump' : true }, 
106                 'D_SES_ERROR' : { 'dump' : true, 'console' : true }, 
107                 'D_SPAWN' : false, 
108                 'D_STRING' : false,
109                 'D_UTIL' : false, 
110                 'D_WIN' : { 'dump' : true }, 
111                 'D_WIDGETS' : false
112         },
113
114         'filter_console_init' : function (p) {
115                 this.sdump('D_FILTER',this.arg_dump(arguments,{0:true}));
116
117                 var filterConsoleListener = {
118                         observe: function( msg ) {
119                                 try {
120                                         p.observe_msg( msg );
121                                 } catch(E) {
122                                         alert(E);
123                                 }
124                         },
125                         QueryInterface: function (iid) {
126                                 if (!iid.equals(Components.interfaces.nsIConsoleListener) &&
127                                         !iid.equals(Components.interfaces.nsISupports)) {
128                                                 throw Components.results.NS_ERROR_NO_INTERFACE;
129                                 }
130                                 return this;
131                         }
132                 };
133                 try {
134                         this.consoleService.registerListener(filterConsoleListener);    
135                 } catch(E) {
136                         alert(E);
137                 }
138
139                 this.sdump('D_TRACE_EXIT',this.arg_dump(arguments));
140         },
141
142         'sdump' : function (level,msg) {
143                 try {
144                         var now = new Date();
145                         var message = now.valueOf() + '\tdelta = ' + (now.valueOf() - this.sdump_last_time.valueOf()) + '\t' + level + '\n' + msg;
146                         if (this.sdump_levels['D_NONE']) return null;
147                         if (this.sdump_levels[level]||this.sdump_levels['D_ALL']) {
148                                 this.sdump_last_time = now;
149                                 if (this.debugDump || ( this.sdump_levels[level] && this.sdump_levels[level].debug ) ) this.debug(message);
150                                 if (this.alertDump || ( this.sdump_levels[level] && this.sdump_levels[level].alert ) ) alert(message);
151                                 if (this.consoleDump || ( this.sdump_levels[level] && this.sdump_levels[level].console ) ) {
152                                         netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
153                                         this.consoleService.logStringMessage(message);
154                                 }
155                                 if (this.fileDump || ( this.sdump_levels[level] && this.sdump_levels[level].file ) ) {
156                                         if (level!='D_FILE') {
157                                                 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
158                                                 JSAN.use('util.file'); var master_log = new util.file('log');
159                                                 master_log.write_content('append',message); master_log.close();
160                                                 var specific_log = new util.file('log_'+level);
161                                                 specific_log.write_content('append',message); specific_log.close();
162                                         }
163                                 }
164                         }
165                 } catch(E) {
166                         dump('Calling sdump but ' + E + '\n');
167                 }
168         },
169
170         'arg_dump' : function (args,dump_these) {
171                 var s = '*>*>*> Called function ';
172                 try {
173                         if (!dump_these)
174                                 dump_these = {};
175                         s += args.callee.toString().match(/\w+/g)[1] + ' : ';
176                         for (var i = 0; i < args.length; i++)
177                                 s += typeof(args[i]) + ' ';
178                         s += '\n';
179                         for (var i = 0; i < args.length; i++)
180                                 if (dump_these[i]) {
181
182                                         var arg = args[i];
183                                         //dump('dump_these[i] = ' + dump_these[i] + '  arg = ' + arg + '\n');
184
185                                         if (typeof(dump_these[i])=='string') {
186
187                                                 if (dump_these[i].slice(0,1) == '.') {
188                                                         var cmd = 'arg' + dump_these[i];
189                                                         var result;
190                                                         try {
191                                                                 result = eval( cmd );
192                                                         } catch(E) {
193                                                                 result = cmd + ' ==> ' + E;
194                                                         }
195                                                         s += '\targ #' + i + ': ' + cmd + ' = ' + result;
196                                                 } else {
197                                                         var result;
198                                                         try {
199                                                                 result = eval( dump_these[i] );
200                                                         } catch(E) {
201                                                                 result = dump_these[i] + ' ==> ' + E;
202                                                         }
203                                                         s += '\targ #' + i + ': ' + result;
204                                                 }
205         
206                                         } else {
207                                                 s += '\targ #' + i + ' = ';
208                                                 try {
209                                                         //s += js2JSON( arg );
210                                                         s += arg;
211                                                 } catch(E) {
212                                                         s += arg;
213                                                 }
214                                         }
215         
216                                         s += '\n';
217                                         if (this.arg_dump_full)
218                                                 s += 'Definition: ' + args.callee.toString() + '\n';
219         
220                                 }
221                         return s;
222                 } catch(E) {
223                         return s + '\nDEBUG ME: ' + js2JSON(E) + '\n';
224                 }
225         },
226
227         'handle_error' : function (E,annoy) {
228                 var s = '';
229                 if (instanceOf(E,ex)) {
230                         s += E.err_msg();
231                         //s += '\n\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n';
232                         //s += 'This error was anticipated.\n\n';
233                         //s += js2JSON(E).substr(0,200) + '...\n\n';
234                         if (snd_bad) snd_bad();
235                 } else {
236                         s += '\n\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n';
237                         s += 'This is a bug that we will fix later.\n\n';
238                         try {
239                                 s += js2JSON(E).substr(0,1024) + '\n\n';
240                         } catch(E2) {
241                                 try {
242                                         s += E.substr(0,1024) + '\n\n';
243                                 } catch(E3) {
244                                         s += E + '\n\n';
245                                 }
246                         }
247                         if (snd_really_bad) snd_really_bad();
248                 }
249                 sdump('D_ERROR',s);
250                 if (annoy)
251                         this.s_alert(s);
252                 else
253                         alert(s);
254         },
255
256         's_alert' : function (s) { alert(s); },
257
258         'standard_network_error_alert' : function(msg) {
259                 var obj = this;
260                 if (!msg) msg = '';
261                 var alert_msg = 'We experienced a network/server communication failure.  Please check your internet connection and try this action again.  Repeated failures may require attention from your local IT staff or your friendly Evergreen developers.\n\n' + msg;
262                 obj.yns_alert(
263                         alert_msg,      
264                         'Communication Failure',
265                         'Ok', null, null, 'Check here to confirm this message'
266                 );
267         },
268
269         'standard_unexpected_error_alert' : function(msg,E) {
270                 var obj = this;
271                 if (typeof E.ilsevent != 'undefined') {
272                         if (E.ilsevent == 0 /* SUCCESS */ ) {
273                                 msg = "The action involved likely succeeded, however, this part of the software needs to be updated to better understand success messages from the server, so please let us know about it.";
274                         }
275                         if (E.ilsevent == -1 /* Network/Server Problem */ ) {
276                                 return obj.standard_network_error_alert(msg);
277                         }
278                         if (E.ilsevent == 5000 /* PERM_FAILURE */ ) {
279                                 msg = "The action involved likely failed due to insufficient permissions.  However, this part of the software needs to be updated to better understand permission messages from the server, so please let us know about it.";
280                         }
281                 }
282                 if (!msg) msg = '';
283                 var alert_msg = 'FIXME:  If you encounter this alert, please inform your IT/ILS helpdesk staff or your friendly Evergreen developers.\n\n' + (new Date()) + '\n\n' + msg + '\n\n' + (typeof E.ilsevent != 'undefined' ? E.textcode + '\n' + (E.desc ? E.desc + '\n' : '') : '') + ( typeof E.status != 'undefined' ? 'Status: ' + E.status + '\n': '' );
284                 obj.sdump('D_ERROR',msg + ' : ' + js2JSON(E));
285                 var r = obj.yns_alert(
286                         alert_msg,      
287                         'Unhandled Error',
288                         'Ok', 'Debug Output to send to Helpdesk', null, 'Check here to confirm this message',
289                         '/xul/server/skin/media/images/skull.png'
290                 );
291                 if (r == 1) {
292                         JSAN.use('util.window'); var win = new util.window();
293                         win.open(
294                                 'data:text/plain,' + window.escape( 'Please open a helpdesk ticket and include the following text: \n\n' + (new Date()) + '\n\n' + msg + '\n\n' + obj.pretty_print(js2JSON(E)) ),
295                                 'error_alert',
296                                 'chrome,resizable,width=700,height=500'
297                         );
298                 }
299                 if (r==2) {
300                         alert('Not Yet Implemented');
301                 }
302         },
303
304         'yns_alert' : function (s,title,b1,b2,b3,c,image) {
305
306                 try {
307
308                         if (location.href.match(/^chrome/)) return this.yns_alert_original(s,title,b1,b2,b3,c);
309
310                 /* The original purpose of yns_alert was to prevent errors from being scanned through accidentally with a barcode scanner.  
311                 However, this can be done in a less annoying manner by rolling our own dialog and not having any of the options in focus */
312
313                 /*
314                         s       = Message to display
315                         title   = Text in Title Bar
316                         b1      = Text for button 1
317                         b2      = Text for button 2
318                         b3      = Text for button 3
319                         c       = Text for confirmation checkbox.  null for no confirm
320                 */
321
322                 dump('yns_alert:\n\ts = ' + s + '\n\ttitle = ' + title + '\n\tb1 = ' + b1 + '\n\tb2 = ' + b2 + '\n\tb3 = ' + b3 + '\n\tc = ' + c + '\n');
323                 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect UniversalBrowserWrite");
324
325                 this.sound.bad();
326
327
328                 //FIMXE - is that good enough of an escape job?
329                 s = s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
330
331                 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" xmlns:html="http://www.w3.org/1999/xhtml" flex="1">' 
332                         + '<groupbox flex="1" style="overflow: auto; border: solid thin red;"><caption label="' + (title) + '"/>';
333
334                 if (image) xml += '<hbox><image src="' + image + '"/><spacer flex="1"/></hbox>';
335                 xml += '<description style="font-size: large">' + (s)
336                         + '</description></groupbox><groupbox><caption label="Options"/><hbox>';
337                 var b1_key = b1 ? b1[0] : '';
338                 var b2_key = b2 ? b2[0] : '';
339                 var b3_key = b3 ? b3[0] : ''; /* FIXME - need to check for collisions */
340                 if (b1) xml += '<button id="b1" accesskey="' + b1_key + '" label="' + (b1) + '" name="fancy_submit" value="b1"/>'
341                 if (b2) xml += '<button id="b2" accesskey="' + b2_key + '" label="' + (b2) + '" name="fancy_submit" value="b2"/>'
342                 if (b3) xml += '<button id="b3" accesskey="' + b3_key + '" label="' + (b3) + '" name="fancy_submit" value="b3"/>'
343                 xml += '</hbox></groupbox></vbox>';
344                 JSAN.use('OpenILS.data');
345                 //var data = new OpenILS.data(); data.init({'via':'stash'});
346                 //data.temp_yns_xml = xml; data.stash('temp_yns_xml');
347                 var url = urls.XUL_FANCY_PROMPT; // + '?xml_in_stash=temp_yns_xml' + '&title=' + window.escape(title);
348                 if (typeof xulG != 'undefined') if (typeof xulG.url_prefix == 'function') url = xulG.url_prefix( url );
349                 JSAN.use('util.window'); var win = new util.window();
350                 var fancy_prompt_data = win.open(
351                         url, 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500', { 'xml' : xml, 'title' : title }
352                 );
353                 if (fancy_prompt_data.fancy_status == 'complete') {
354                         switch(fancy_prompt_data.fancy_submit) {
355                                 case 'b1' : return 0; break;
356                                 case 'b2' : return 1; break;
357                                 case 'b3' : return 2; break;
358                         }
359                 } else {
360                         //return this.yns_alert(s,title,b1,b2,b3,c,image);
361                         return null;
362                 }
363
364                 } catch(E) {
365
366                         dump('yns_alert failed: ' + E + '\ns = ' + s + '\ntitle = ' + title + '\nb1 = ' + b1 + '\nb2 = ' + b2 + '\nb3 = ' + b3 + '\nc = ' + c + '\nimage = ' + image + '\n');
367
368                         this.yns_alert_original(s + '\n\nAlso, yns_alert failed: ' + E,title,b1,b2,b3,c);
369
370                 }
371         },
372
373         'yns_alert_formatted' : function (s,title,b1,b2,b3,c,image) {
374
375                 try {
376
377                         if (location.href.match(/^chrome/)) return this.yns_alert_original(s,title,b1,b2,b3,c);
378
379                 /* The original purpose of yns_alert was to prevent errors from being scanned through accidentally with a barcode scanner.  
380                 However, this can be done in a less annoying manner by rolling our own dialog and not having any of the options in focus */
381
382                 /*
383                         s       = Message to display
384                         title   = Text in Title Bar
385                         b1      = Text for button 1
386                         b2      = Text for button 2
387                         b3      = Text for button 3
388                         c       = Text for confirmation checkbox.  null for no confirm
389                 */
390
391                 dump('yns_alert:\n\ts = ' + s + '\n\ttitle = ' + title + '\n\tb1 = ' + b1 + '\n\tb2 = ' + b2 + '\n\tb3 = ' + b3 + '\n\tc = ' + c + '\n');
392                 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect UniversalBrowserWrite");
393
394                 this.sound.bad();
395
396
397                 //FIMXE - is that good enough of an escape job?
398                 s = s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
399
400                 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" xmlns:html="http://www.w3.org/1999/xhtml" flex="1">' 
401                         + '<groupbox flex="1" style="overflow: auto; border: solid thin red;"><caption label="' + (title) + '"/>';
402
403                 if (image) xml += '<hbox><image src="' + image + '"/><spacer flex="1"/></hbox>';
404                 xml += '<description style="font-size: large"><html:pre style="font-size: large">' + (s)
405                         + '</html:pre></description></groupbox><groupbox><caption label="Options"/><hbox>';
406                 var b1_key = b1 ? b1[0] : '';
407                 var b2_key = b2 ? b2[0] : '';
408                 var b3_key = b3 ? b3[0] : ''; /* FIXME - need to check for collisions */
409                 if (b1) xml += '<button id="b1" accesskey="' + b1_key + '" label="' + (b1) + '" name="fancy_submit" value="b1"/>'
410                 if (b2) xml += '<button id="b2" accesskey="' + b2_key + '" label="' + (b2) + '" name="fancy_submit" value="b2"/>'
411                 if (b3) xml += '<button id="b3" accesskey="' + b3_key + '" label="' + (b3) + '" name="fancy_submit" value="b3"/>'
412                 xml += '</hbox></groupbox></vbox>';
413                 JSAN.use('OpenILS.data');
414                 //var data = new OpenILS.data(); data.init({'via':'stash'});
415                 //data.temp_yns_xml = xml; data.stash('temp_yns_xml');
416                 var url = urls.XUL_FANCY_PROMPT; // + '?xml_in_stash=temp_yns_xml' + '&title=' + window.escape(title);
417                 if (typeof xulG != 'undefined') if (typeof xulG.url_prefix == 'function') url = xulG.url_prefix( url );
418                 JSAN.use('util.window'); var win = new util.window();
419                 var fancy_prompt_data = win.open(
420                         url, 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500', { 'xml' : xml, 'title' : title }
421                 );
422                 if (fancy_prompt_data.fancy_status == 'complete') {
423                         switch(fancy_prompt_data.fancy_submit) {
424                                 case 'b1' : return 0; break;
425                                 case 'b2' : return 1; break;
426                                 case 'b3' : return 2; break;
427                         }
428                 } else {
429                         //return this.yns_alert(s,title,b1,b2,b3,c,image);
430                         return null;
431                 }
432
433                 } catch(E) {
434
435                         alert('yns_alert_formatted failed: ' + E + '\ns = ' + s + '\ntitle = ' + title + '\nb1 = ' + b1 + '\nb2 = ' + b2 + '\nb3 = ' + b3 + '\nc = ' + c + '\nimage = ' + image + '\n');
436
437                 }
438
439         },
440
441         'yns_alert_original' : function (s,title,b1,b2,b3,c) {
442
443                 /*
444                         s       = Message to display
445                         title   = Text in Title Bar
446                         b1      = Text for button 1
447                         b2      = Text for button 2
448                         b3      = Text for button 3
449                         c       = Text for confirmation checkbox.  null for no confirm
450                 */
451
452                 dump('yns_alert:\n\ts = ' + s + '\n\ttitle = ' + title + '\n\tb1 = ' + b1 + '\n\tb2 = ' + b2 + '\n\tb3 = ' + b3 + '\n\tc = ' + c + '\n');
453                 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
454
455                 this.sound.bad();
456
457                 // get a reference to the prompt service component.
458                 var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
459                         .getService(Components.interfaces.nsIPromptService);
460
461                 // set the buttons that will appear on the dialog. It should be
462                 // a set of constants multiplied by button position constants. In this case,
463                 // three buttons appear, Save, Cancel and a custom button.
464                 //var flags=promptService.BUTTON_TITLE_OK * promptService.BUTTON_POS_0 +
465                 //      promptService.BUTTON_TITLE_CANCEL * promptService.BUTTON_POS_1 +
466                 //      promptService.BUTTON_TITLE_IS_STRING * promptService.BUTTON_POS_2;
467                 var flags = promptService.BUTTON_TITLE_IS_STRING * promptService.BUTTON_POS_0 +
468                         promptService.BUTTON_TITLE_IS_STRING * promptService.BUTTON_POS_1 +
469                         promptService.BUTTON_TITLE_IS_STRING * promptService.BUTTON_POS_2; 
470
471                 // display the dialog box. The flags set above are passed
472                 // as the fourth argument. The next three arguments are custom labels used for
473                 // the buttons, which are used if BUTTON_TITLE_IS_STRING is assigned to a
474                 // particular button. The last two arguments are for an optional check box.
475                 var check = {};
476                 var rv = promptService.confirmEx(window,title, s, flags, b1, b2, b3, c, check);
477                 if (c && !check.value) {
478                         return this.yns_alert(s,title,b1,b2,b3,c);
479                 }
480                 return rv;
481         },
482
483         'print_tabs' : function(t) {
484                 var r = '';
485                 for (var j = 0; j < t; j++ ) { r = r + "\t"; }
486                 return r;
487         },
488
489         'pretty_print' : function(s) {
490                 var r = ''; var t = 0;
491                 for (var i in s) {
492                         if (s[i] == '{') {
493                                 r = r + "\n" + this.print_tabs(t) + s[i]; t++;
494                                 r = r + "\n" + this.print_tabs(t);
495                         } else if (s[i] == '[') {
496                                 r = r + "\n" + this.print_tabs(t) + s[i]; t++;
497                                 r = r + "\n" + this.print_tabs(t);
498                         } else if (s[i] == '}') {
499                                 t--; r = r + "\n" + this.print_tabs(t) + s[i];
500                                 r = r + "\n" + this.print_tabs(t);
501                         } else if (s[i] == ']') {
502                                 t--; r = r + "\n" + this.print_tabs(t) + s[i];
503                                 r = r + "\n" + this.print_tabs(t);
504                         } else if (s[i] == ',') {
505                                 r = r + s[i];
506                                 r = r + "\n" + this.print_tabs(t);
507                         } else {
508                                 r = r + s[i];
509                         }
510                 }
511                 return r;
512         }
513 }
514
515 dump('exiting util/error.js\n');