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_XULRUNNER' : false,
48 'D_DECK' : { 'dump' : true },
49 'D_TRACE_ENTER' : false,
50 'D_TRACE_EXIT' : false,
53 'D_CONSTRUCTOR' : false,
56 'D_DATA_STASH' : { 'alert' : false },
57 'D_DATA_RETRIEVE' : false,
60 'D_PAGED_TREE' : false,
61 'D_GRID_LIST' : false,
62 'D_HTML_TABLE' : false,
65 'D_LIST_DUMP_WITH_KEYS_ON_CLEAR' : false,
66 'D_LIST_DUMP_ON_CLEAR' : false,
68 'D_AUTH' : { 'dump' : true },
69 'D_OPAC' : { 'dump' : true },
71 'D_BROWSER' : { 'dump' : true },
73 'D_PATRON_SEARCH' : false,
74 'D_PATRON_SEARCH_FORM' : false,
75 'D_PATRON_SEARCH_RESULTS' : false,
77 'D_PATRON_DISPLAY' : false,
78 'D_PATRON_DISPLAY_STATUS' : false,
79 'D_PATRON_DISPLAY_CONTACT' : false,
81 'D_PATRON_ITEMS' : false,
82 'D_PATRON_CHECKOUT_ITEMS' : false,
83 'D_PATRON_HOLDS' : false,
84 'D_PATRON_BILLS' : false,
85 'D_PATRON_EDIT' : false,
88 'D_CHECKIN_ITEMS' : false,
90 'D_HOLD_CAPTURE' : false,
91 'D_HOLD_CAPTURE_ITEMS' : false,
93 'D_PATRON_UTILS' : false,
94 'D_CIRC_UTILS' : false,
99 'D_PRINT' : { 'dump' : true },
100 'D_SES' : { 'dump' : true },
101 'D_SES_FUNC' : false,
102 'D_SES_RESULT' : { 'dump' : true },
103 'D_SES_ERROR' : { 'dump' : true, 'console' : true },
111 'filter_console_init' : function (p) {
112 this.sdump('D_FILTER',this.arg_dump(arguments,{0:true}));
114 var filterConsoleListener = {
115 observe: function( msg ) {
117 p.observe_msg( msg );
122 QueryInterface: function (iid) {
123 if (!iid.equals(Components.interfaces.nsIConsoleListener) &&
124 !iid.equals(Components.interfaces.nsISupports)) {
125 throw Components.results.NS_ERROR_NO_INTERFACE;
131 this.consoleService.registerListener(filterConsoleListener);
136 this.sdump('D_TRACE_EXIT',this.arg_dump(arguments));
139 'sdump' : function (level,msg) {
141 var now = new Date();
142 var message = now.valueOf() + '\tdelta = ' + (now.valueOf() - this.sdump_last_time.valueOf()) + '\t' + level + '\n' + msg;
143 if (this.sdump_levels['D_NONE']) return null;
144 if (this.sdump_levels[level]||this.sdump_levels['D_ALL']) {
145 this.sdump_last_time = now;
146 if (this.debugDump || ( this.sdump_levels[level] && this.sdump_levels[level].debug ) ) this.debug(message);
147 if (this.alertDump || ( this.sdump_levels[level] && this.sdump_levels[level].alert ) ) alert(message);
148 if (this.consoleDump || ( this.sdump_levels[level] && this.sdump_levels[level].console ) ) {
149 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
150 this.consoleService.logStringMessage(message);
152 if (this.fileDump || ( this.sdump_levels[level] && this.sdump_levels[level].file ) ) {
153 if (level!='D_FILE') {
154 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
155 JSAN.use('util.file'); var master_log = new util.file('log');
156 master_log.write_content('append',message); master_log.close();
157 var specific_log = new util.file('log_'+level);
158 specific_log.write_content('append',message); specific_log.close();
163 dump('Calling sdump but ' + E + '\n');
167 'arg_dump' : function (args,dump_these) {
168 var s = '*>*>*> Called function ';
172 s += args.callee.toString().match(/\w+/g)[1] + ' : ';
173 for (var i = 0; i < args.length; i++)
174 s += typeof(args[i]) + ' ';
176 for (var i = 0; i < args.length; i++)
180 //dump('dump_these[i] = ' + dump_these[i] + ' arg = ' + arg + '\n');
182 if (typeof(dump_these[i])=='string') {
184 if (dump_these[i].slice(0,1) == '.') {
185 var cmd = 'arg' + dump_these[i];
188 result = eval( cmd );
190 result = cmd + ' ==> ' + E;
192 s += '\targ #' + i + ': ' + cmd + ' = ' + result;
196 result = eval( dump_these[i] );
198 result = dump_these[i] + ' ==> ' + E;
200 s += '\targ #' + i + ': ' + result;
204 s += '\targ #' + i + ' = ';
206 //s += js2JSON( arg );
214 if (this.arg_dump_full)
215 s += 'Definition: ' + args.callee.toString() + '\n';
220 return s + '\nDEBUG ME: ' + js2JSON(E) + '\n';
224 'handle_error' : function (E,annoy) {
226 if (instanceOf(E,ex)) {
228 //s += '\n\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n';
229 //s += 'This error was anticipated.\n\n';
230 //s += js2JSON(E).substr(0,200) + '...\n\n';
231 if (snd_bad) snd_bad();
233 s += '\n\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n';
234 s += 'This is a bug that we will fix later.\n\n';
236 s += js2JSON(E).substr(0,1024) + '\n\n';
239 s += E.substr(0,1024) + '\n\n';
244 if (snd_really_bad) snd_really_bad();
253 's_alert' : function (s) { alert(s); },
255 'get_ilsevent' : function(status) {
256 JSAN.use('OpenILS.data');
257 this.OpenILS.data = new OpenILS.data(); this.OpenILS.data.init({'via':'stash'});
258 return this.OpenILS.data.entities['ilsevent.'+status];
261 'standard_network_error_alert' : function(msg) {
264 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.substr(0,100);
267 'Communication Failure',
268 'Ok', null, null, 'Check here to confirm this message'
272 'standard_unexpected_error_alert' : function(msg,E) {
274 if (typeof E.ilsevent != 'undefined') {
275 if (E.ilsevent == 0 /* SUCCESS */ ) {
276 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.";
278 if (E.ilsevent == -1 /* Network/Server Problem */ ) {
279 return obj.standard_network_error_alert(msg);
281 if (E.ilsevent == 5000 /* PERM_FAILURE */ ) {
282 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.";
286 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': '' );
287 obj.sdump('D_ERROR',msg + ' : ' + js2JSON(E));
288 var r = obj.yns_alert(
291 'Ok', 'Debug Output to send to Helpdesk', null, 'Check here to confirm this message',
292 '/xul/server/skin/media/images/skull.png'
295 JSAN.use('util.window'); var win = new util.window();
297 '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)) ),
299 'chrome,resizable,width=700,height=500'
303 alert('Not Yet Implemented');
307 'yns_alert' : function (s,title,b1,b2,b3,c,image) {
311 if (location.href.match(/^chrome/)) return this.yns_alert_original(s,title,b1,b2,b3,c);
313 /* The original purpose of yns_alert was to prevent errors from being scanned through accidentally with a barcode scanner.
314 However, this can be done in a less annoying manner by rolling our own dialog and not having any of the options in focus */
317 s = Message to display
318 title = Text in Title Bar
319 b1 = Text for button 1
320 b2 = Text for button 2
321 b3 = Text for button 3
322 c = Text for confirmation checkbox. null for no confirm
325 dump('yns_alert:\n\ts = ' + s + '\n\ttitle = ' + title + '\n\tb1 = ' + b1 + '\n\tb2 = ' + b2 + '\n\tb3 = ' + b3 + '\n\tc = ' + c + '\n');
326 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect UniversalBrowserWrite");
331 //FIMXE - is that good enough of an escape job?
332 s = s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
334 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" xmlns:html="http://www.w3.org/1999/xhtml" flex="1">'
335 + '<groupbox flex="1" style="overflow: auto; border: solid thin red;"><caption label="' + (title) + '"/>';
337 if (image) xml += '<hbox><image src="' + image + '"/><spacer flex="1"/></hbox>';
338 xml += '<description style="font-size: large">' + (s)
339 + '</description></groupbox><groupbox><caption label="Options"/><hbox>';
340 var b1_key = b1 ? b1[0] : '';
341 var b2_key = b2 ? b2[0] : '';
342 var b3_key = b3 ? b3[0] : ''; /* FIXME - need to check for collisions */
343 if (b1) xml += '<button id="b1" accesskey="' + b1_key + '" label="' + (b1) + '" name="fancy_submit" value="b1"/>'
344 if (b2) xml += '<button id="b2" accesskey="' + b2_key + '" label="' + (b2) + '" name="fancy_submit" value="b2"/>'
345 if (b3) xml += '<button id="b3" accesskey="' + b3_key + '" label="' + (b3) + '" name="fancy_submit" value="b3"/>'
346 xml += '</hbox></groupbox></vbox>';
347 JSAN.use('OpenILS.data');
348 var data = new OpenILS.data(); data.init({'via':'stash'});
349 data.temp_yns_xml = xml; data.stash('temp_yns_xml');
350 var url = urls.XUL_FANCY_PROMPT + '?xml_in_stash=temp_yns_xml' + '&title=' + window.escape(title);
351 if (xulG && xulG.url_prefix) url = xulG.url_prefix( url );
353 url, 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500'
355 data.init({'via':'stash'});
356 if (data.fancy_prompt_data != '') {
357 switch(data.fancy_prompt_data.fancy_submit) {
358 case 'b1' : return 0; break;
359 case 'b2' : return 1; break;
360 case 'b3' : return 2; break;
363 //return this.yns_alert(s,title,b1,b2,b3,c,image);
369 dump('yns_alert failed: ' + E + '\ns = ' + s + '\ntitle = ' + title + '\nb1 = ' + b1 + '\nb2 = ' + b2 + '\nb3 = ' + b3 + '\nc = ' + c + '\nimage = ' + image + '\n');
371 this.yns_alert_original(s + '\n\nAlso, yns_alert failed: ' + E,title,b1,b2,b3,c);
376 'yns_alert_formatted' : function (s,title,b1,b2,b3,c,image) {
380 if (location.href.match(/^chrome/)) return this.yns_alert_original(s,title,b1,b2,b3,c);
382 /* The original purpose of yns_alert was to prevent errors from being scanned through accidentally with a barcode scanner.
383 However, this can be done in a less annoying manner by rolling our own dialog and not having any of the options in focus */
386 s = Message to display
387 title = Text in Title Bar
388 b1 = Text for button 1
389 b2 = Text for button 2
390 b3 = Text for button 3
391 c = Text for confirmation checkbox. null for no confirm
394 dump('yns_alert:\n\ts = ' + s + '\n\ttitle = ' + title + '\n\tb1 = ' + b1 + '\n\tb2 = ' + b2 + '\n\tb3 = ' + b3 + '\n\tc = ' + c + '\n');
395 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect UniversalBrowserWrite");
400 //FIMXE - is that good enough of an escape job?
401 s = s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
403 var xml = '<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" xmlns:html="http://www.w3.org/1999/xhtml" flex="1">'
404 + '<groupbox flex="1" style="overflow: auto; border: solid thin red;"><caption label="' + (title) + '"/>';
406 if (image) xml += '<hbox><image src="' + image + '"/><spacer flex="1"/></hbox>';
407 xml += '<description style="font-size: large"><html:pre style="font-size: large">' + (s)
408 + '</html:pre></description></groupbox><groupbox><caption label="Options"/><hbox>';
409 var b1_key = b1 ? b1[0] : '';
410 var b2_key = b2 ? b2[0] : '';
411 var b3_key = b3 ? b3[0] : ''; /* FIXME - need to check for collisions */
412 if (b1) xml += '<button id="b1" accesskey="' + b1_key + '" label="' + (b1) + '" name="fancy_submit" value="b1"/>'
413 if (b2) xml += '<button id="b2" accesskey="' + b2_key + '" label="' + (b2) + '" name="fancy_submit" value="b2"/>'
414 if (b3) xml += '<button id="b3" accesskey="' + b3_key + '" label="' + (b3) + '" name="fancy_submit" value="b3"/>'
415 xml += '</hbox></groupbox></vbox>';
416 JSAN.use('OpenILS.data');
417 var data = new OpenILS.data(); data.init({'via':'stash'});
418 data.temp_yns_xml = xml; data.stash('temp_yns_xml');
419 var url = urls.XUL_FANCY_PROMPT + '?xml_in_stash=temp_yns_xml' + '&title=' + window.escape(title);
420 if (xulG && xulG.url_prefix) url = xulG.url_prefix( url );
422 url, 'fancy_prompt', 'chrome,resizable,modal,width=700,height=500'
424 data.init({'via':'stash'});
425 if (data.fancy_prompt_data != '') {
426 switch(data.fancy_prompt_data.fancy_submit) {
427 case 'b1' : return 0; break;
428 case 'b2' : return 1; break;
429 case 'b3' : return 2; break;
432 //return this.yns_alert(s,title,b1,b2,b3,c,image);
438 alert('yns_alert_formatted failed: ' + E + '\ns = ' + s + '\ntitle = ' + title + '\nb1 = ' + b1 + '\nb2 = ' + b2 + '\nb3 = ' + b3 + '\nc = ' + c + '\nimage = ' + image + '\n');
444 'yns_alert_original' : function (s,title,b1,b2,b3,c) {
447 s = Message to display
448 title = Text in Title Bar
449 b1 = Text for button 1
450 b2 = Text for button 2
451 b3 = Text for button 3
452 c = Text for confirmation checkbox. null for no confirm
455 dump('yns_alert:\n\ts = ' + s + '\n\ttitle = ' + title + '\n\tb1 = ' + b1 + '\n\tb2 = ' + b2 + '\n\tb3 = ' + b3 + '\n\tc = ' + c + '\n');
456 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
460 // get a reference to the prompt service component.
461 var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
462 .getService(Components.interfaces.nsIPromptService);
464 // set the buttons that will appear on the dialog. It should be
465 // a set of constants multiplied by button position constants. In this case,
466 // three buttons appear, Save, Cancel and a custom button.
467 //var flags=promptService.BUTTON_TITLE_OK * promptService.BUTTON_POS_0 +
468 // promptService.BUTTON_TITLE_CANCEL * promptService.BUTTON_POS_1 +
469 // promptService.BUTTON_TITLE_IS_STRING * promptService.BUTTON_POS_2;
470 var flags = promptService.BUTTON_TITLE_IS_STRING * promptService.BUTTON_POS_0 +
471 promptService.BUTTON_TITLE_IS_STRING * promptService.BUTTON_POS_1 +
472 promptService.BUTTON_TITLE_IS_STRING * promptService.BUTTON_POS_2;
474 // display the dialog box. The flags set above are passed
475 // as the fourth argument. The next three arguments are custom labels used for
476 // the buttons, which are used if BUTTON_TITLE_IS_STRING is assigned to a
477 // particular button. The last two arguments are for an optional check box.
479 var rv = promptService.confirmEx(window,title, s, flags, b1, b2, b3, c, check);
480 if (c && !check.value) {
481 return this.yns_alert(s,title,b1,b2,b3,c);
486 'print_tabs' : function(t) {
488 for (var j = 0; j < t; j++ ) { r = r + "\t"; }
492 'pretty_print' : function(s) {
493 var r = ''; var t = 0;
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 r = r + "\n" + this.print_tabs(t) + s[i]; t++;
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 t--; r = r + "\n" + this.print_tabs(t) + s[i];
506 r = r + "\n" + this.print_tabs(t);
507 } else if (s[i] == ',') {
509 r = r + "\n" + this.print_tabs(t);
518 dump('exiting util/error.js\n');