1 dump('entering util/error.js\n');
3 if (typeof util == 'undefined') util = {};
4 util.error = function () {
7 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
8 this.consoleService = Components.classes['@mozilla.org/consoleservice;1']
9 .getService(Components.interfaces.nsIConsoleService);
11 this.consoleDump = false;
12 dump('util.error constructor: ' + E + '\n');
15 this.sdump_last_time = new Date();
19 JSAN.use('util.sound'); this.sound = new util.sound();
24 util.error.prototype = {
27 'consoleDump' : false,
31 'arg_dump_full' : false,
33 'debug' : function(e){
34 dump('-----------------------------------------\n'
35 + e + '\n-----------------------------------------\n' );
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 },
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,
54 'D_CONSTRUCTOR' : false,
57 'D_DATA_STASH' : { 'alert' : false },
58 'D_DATA_RETRIEVE' : false,
61 'D_PAGED_TREE' : false,
62 'D_GRID_LIST' : false,
63 'D_HTML_TABLE' : false,
66 'D_LIST_DUMP_WITH_KEYS_ON_CLEAR' : false,
67 'D_LIST_DUMP_ON_CLEAR' : false,
69 'D_AUTH' : { 'dump' : true },
70 'D_OPAC' : { 'dump' : true },
72 'D_BROWSER' : { 'dump' : true },
74 'D_PATRON_SEARCH' : false,
75 'D_PATRON_SEARCH_FORM' : false,
76 'D_PATRON_SEARCH_RESULTS' : false,
78 'D_PATRON_DISPLAY' : false,
79 'D_PATRON_DISPLAY_STATUS' : false,
80 'D_PATRON_DISPLAY_CONTACT' : false,
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,
89 'D_CHECKIN_ITEMS' : false,
91 'D_HOLD_CAPTURE' : false,
92 'D_HOLD_CAPTURE_ITEMS' : false,
94 'D_PATRON_UTILS' : false,
95 'D_CIRC_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 },
110 'D_WIN' : { 'dump' : true },
114 'filter_console_init' : function (p) {
115 this.sdump('D_FILTER',this.arg_dump(arguments,{0:true}));
117 var filterConsoleListener = {
118 observe: function( msg ) {
120 p.observe_msg( msg );
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;
134 this.consoleService.registerListener(filterConsoleListener);
139 this.sdump('D_TRACE_EXIT',this.arg_dump(arguments));
142 'sdump' : function (level,msg) {
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);
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();
166 dump('Calling sdump but ' + E + '\n');
170 'arg_dump' : function (args,dump_these) {
171 var s = '*>*>*> Called function ';
175 s += args.callee.toString().match(/\w+/g)[1] + ' : ';
176 for (var i = 0; i < args.length; i++)
177 s += typeof(args[i]) + ' ';
179 for (var i = 0; i < args.length; i++)
183 //dump('dump_these[i] = ' + dump_these[i] + ' arg = ' + arg + '\n');
185 if (typeof(dump_these[i])=='string') {
187 if (dump_these[i].slice(0,1) == '.') {
188 var cmd = 'arg' + dump_these[i];
191 result = eval( cmd );
193 result = cmd + ' ==> ' + E;
195 s += '\targ #' + i + ': ' + cmd + ' = ' + result;
199 result = eval( dump_these[i] );
201 result = dump_these[i] + ' ==> ' + E;
203 s += '\targ #' + i + ': ' + result;
207 s += '\targ #' + i + ' = ';
209 //s += js2JSON( arg );
217 if (this.arg_dump_full)
218 s += 'Definition: ' + args.callee.toString() + '\n';
223 return s + '\nDEBUG ME: ' + js2JSON(E) + '\n';
227 'handle_error' : function (E,annoy) {
229 if (instanceOf(E,ex)) {
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();
236 s += '\n\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n';
237 s += 'This is a bug that we will fix later.\n\n';
239 s += js2JSON(E).substr(0,1024) + '\n\n';
242 s += E.substr(0,1024) + '\n\n';
247 if (snd_really_bad) snd_really_bad();
256 's_alert' : function (s) { alert(s); },
258 'standard_network_error_alert' : function(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;
264 'Communication Failure',
265 'Ok', null, null, 'Check here to confirm this message'
269 'standard_unexpected_error_alert' : function(msg,E) {
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.";
275 if (E.ilsevent == -1 /* Network/Server Problem */ ) {
276 return obj.standard_network_error_alert(msg);
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.";
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(
288 'Ok', 'Debug Output to send to Helpdesk', null, 'Check here to confirm this message',
289 '/xul/server/skin/media/images/skull.png'
292 JSAN.use('util.window'); var win = new util.window();
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)) ),
296 'chrome,resizable,width=700,height=500'
300 alert('Not Yet Implemented');
304 'yns_alert' : function (s,title,b1,b2,b3,c,image) {
308 if (location.href.match(/^chrome/)) return this.yns_alert_original(s,title,b1,b2,b3,c);
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 */
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
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");
328 //FIMXE - is that good enough of an escape job?
329 s = s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
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) + '"/>';
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 }
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;
360 //return this.yns_alert(s,title,b1,b2,b3,c,image);
366 dump('yns_alert failed: ' + E + '\ns = ' + s + '\ntitle = ' + title + '\nb1 = ' + b1 + '\nb2 = ' + b2 + '\nb3 = ' + b3 + '\nc = ' + c + '\nimage = ' + image + '\n');
368 this.yns_alert_original(s + '\n\nAlso, yns_alert failed: ' + E,title,b1,b2,b3,c);
373 'yns_alert_formatted' : function (s,title,b1,b2,b3,c,image) {
377 if (location.href.match(/^chrome/)) return this.yns_alert_original(s,title,b1,b2,b3,c);
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 */
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
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");
397 //FIMXE - is that good enough of an escape job?
398 s = s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
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) + '"/>';
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 }
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;
429 //return this.yns_alert(s,title,b1,b2,b3,c,image);
435 alert('yns_alert_formatted failed: ' + E + '\ns = ' + s + '\ntitle = ' + title + '\nb1 = ' + b1 + '\nb2 = ' + b2 + '\nb3 = ' + b3 + '\nc = ' + c + '\nimage = ' + image + '\n');
441 'yns_alert_original' : function (s,title,b1,b2,b3,c) {
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
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");
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);
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;
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.
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);
483 'print_tabs' : function(t) {
485 for (var j = 0; j < t; j++ ) { r = r + "\t"; }
489 'pretty_print' : function(s) {
490 var r = ''; var t = 0;
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] == ',') {
506 r = r + "\n" + this.print_tabs(t);
515 dump('exiting util/error.js\n');