fix in tab ui for top.restoreSession
[openemr.git] / phpmyadmin / js / error_report.js
blob9c55c83494de63d36ec1783e52c7cfb04a402783
1 /* vim: set expandtab sw=4 ts=4 sts=4: */
2 /**
3  * general function, usually for data manipulation pages
4  *
5  */
7 var ErrorReport = {
8     /**
9      * @var object stores the last exception info
10      */
11     _last_exception: null,
12     /**
13      * handles thrown error exceptions based on user preferences
14      *
15      * @return void
16      */
17     error_handler: function (exception) {
18         if (exception.name === null || typeof(exception.name) == "undefined") {
19             exception.name = ErrorReport._extractExceptionName(exception);
20         }
21         ErrorReport._last_exception = exception;
22         $.get("error_report.php", {
23             ajax_request: true,
24             server: PMA_commonParams.get('server'),
25             token: PMA_commonParams.get('token'),
26             get_settings: true,
27             exception_type: 'js'
28         }, function (data) {
29             if (data.success !== true) {
30                 PMA_ajaxShowMessage(data.error, false);
31                 return;
32             }
33             if (data.report_setting == "ask") {
34                 ErrorReport._showErrorNotification();
35             } else if (data.report_setting == "always") {
36                 report_data = ErrorReport._get_report_data(exception);
37                 post_data = $.extend(report_data, {
38                     send_error_report: true,
39                     automatic: true
40                 });
41                 $.post("error_report.php", post_data, function (data) {
42                     if (data.success === false) {
43                         //in the case of an error, show the error message returned.
44                         PMA_ajaxShowMessage(data.error, false);
45                     } else {
46                         PMA_ajaxShowMessage(data.message, false);
47                     }
48                 });
49             }
50         });
51     },
52     /**
53      * Shows the modal dialog previewing the report
54      *
55      * @param exception object error report info
56      *
57      * @return void
58      */
59     _showReportDialog: function (exception) {
60         var report_data = ErrorReport._get_report_data(exception);
62         /*Remove the hidden dialogs if there are*/
63         if ($('#error_report_dialog').length !== 0) {
64             $('#error_report_dialog').remove();
65         }
66         var $div = $('<div id="error_report_dialog"></div>');
68         var button_options = {};
70         button_options[PMA_messages.strSendErrorReport] = function () {
71             var $dialog = $(this);
72             var post_data = $.extend(report_data, {
73                 send_error_report: true,
74                 description: $("#report_description").val(),
75                 always_send: $("#always_send_checkbox")[0].checked
76             });
77             $.post("error_report.php", post_data, function (data) {
78                 $dialog.dialog('close');
79                 if (data.success === false) {
80                     //in the case of an error, show the error message returned.
81                     PMA_ajaxShowMessage(data.error, false);
82                 } else {
83                     PMA_ajaxShowMessage(data.message, 3000);
84                 }
85             });
86         };
88         button_options[PMA_messages.strCancel] = function () {
89             $(this).dialog('close');
90         };
92         $.post("error_report.php", report_data, function (data) {
93             if (data.success === false) {
94                 //in the case of an error, show the error message returned.
95                 PMA_ajaxShowMessage(data.error, false);
96             } else {
97                 // Show dialog if the request was successful
98                 $div
99                 .append(data.message)
100                 .dialog({
101                     title: PMA_messages.strSubmitErrorReport,
102                     width: 650,
103                     modal: true,
104                     buttons: button_options,
105                     close: function () {
106                         $(this).remove();
107                     }
108                 });
109             }
110         }); // end $.get()
111     },
112     /**
113      * Shows the small notification that asks for user permission
114      *
115      * @return void
116      */
117     _showErrorNotification: function () {
118         ErrorReport._removeErrorNotification();
120         var $div = $(
121             '<div style="position:fixed;bottom:0;left:0;right:0;margin:0;' +
122             'z-index:1000" class="error" id="error_notification"></div>'
123         ).append(
124             PMA_getImage("s_error.png") + PMA_messages.strErrorOccurred
125         );
127         var $buttons = $('<div class="floatright"></div>');
129         var button_html  = '<button id="show_error_report">';
130         button_html += PMA_messages.strShowReportDetails;
131         button_html += '</button>';
133         button_html += '<a id="change_error_settings">';
134         button_html += PMA_getImage('s_cog.png', PMA_messages.strChangeReportSettings);
135         button_html += '</a>';
137         button_html += '<a href="#" id="ignore_error">';
138         button_html += PMA_getImage('b_close.png', PMA_messages.strIgnore);
139         button_html += '</a>';
141         $buttons.html(button_html);
143         $div.append($buttons);
144         $div.appendTo(document.body);
145         $("#change_error_settings").on("click", ErrorReport._redirect_to_settings);
146         $("#show_error_report").on("click", ErrorReport._createReportDialog);
147         $("#ignore_error").on("click", ErrorReport._removeErrorNotification);
148     },
149     /**
150      * Removes the notification if it was displayed before
151      *
152      * @return void
153      */
154     _removeErrorNotification: function (e) {
155         if (e) {
156             // don't remove the hash fragment by navigating to #
157             e.preventDefault();
158         }
159         $("#error_notification").fadeOut(function () {
160             $(this).remove();
161         });
162     },
163     /**
164      * Extracts Exception name from message if it exists
165      *
166      * @return String
167      */
168     _extractExceptionName: function (exception) {
169         if (exception.message === null || typeof(exception.message) == "undefined"){
170             return "";
171         } else {
172             var reg = /([a-zA-Z]+):/;
173             var regex_result = null;
174             regex_result = reg.exec(exception.message);
175             if(regex_result && regex_result.length == 2)
176                 return regex_result[1];
177             else
178                 return "";
179         }
180     },
181     /**
182      * Shows the modal dialog previewing the report
183      *
184      * @return void
185      */
186     _createReportDialog: function () {
187         ErrorReport._removeErrorNotification();
188         ErrorReport._showReportDialog(ErrorReport._last_exception);
189     },
190     /**
191      * Redirects to the settings page containing error report
192      * preferences
193      *
194      * @return void
195      */
196     _redirect_to_settings: function () {
197         window.location.href = "prefs_forms.php?token=" + PMA_commonParams.get('token');
198     },
199     /**
200      * Returns the report data to send to the server
201      *
202      * @param exception object exception info
203      *
204      * @return object
205      */
206     _get_report_data: function (exception) {
207         var report_data = {
208             "ajax_request": true,
209             "token": PMA_commonParams.get('token'),
210             "exception": exception,
211             "current_url": window.location.href,
212             "exception_type": 'js'
213         };
214         if (AJAX.scriptHandler._scripts.length > 0) {
215             report_data.scripts = AJAX.scriptHandler._scripts.map(
216                 function (script) {
217                     return script.name;
218                 }
219             );
220         }
221         return report_data;
222     },
223     /**
224      * Wraps all global functions that start with PMA_
225      *
226      * @return void
227      */
228     wrap_global_functions: function () {
229         for (var key in window) {
230             if (key.indexOf("PMA_") === 0) {
231                 var global = window[key];
232                 if (typeof(global) === "function") {
233                     window[key] = ErrorReport.wrap_function(global);
234                 }
235             }
236         }
237     },
238     /**
239      * Wraps given function in error reporting code and returns wrapped function
240      *
241      * @param func function to be wrapped
242      *
243      * @return function
244      */
245     wrap_function: function (func) {
246         if (!func.wrapped) {
247             var new_func = function () {
248                 try {
249                     return func.apply(this, arguments);
250                 } catch (x) {
251                     TraceKit.report(x);
252                 }
253             };
254             new_func.wrapped = true;
255             //Set guid of wrapped function same as original function, so it can be removed
256             //See bug#4146 (problem with jquery draggable and sortable)
257             new_func.guid = func.guid = func.guid || new_func.guid || jQuery.guid++;
258             return new_func;
259         } else {
260             return func;
261         }
262     },
263     /**
264      * Automatically wraps the callback in AJAX.registerOnload
265      *
266      * @return void
267      */
268     _wrap_ajax_onload_callback: function () {
269         var oldOnload = AJAX.registerOnload;
270         AJAX.registerOnload = function (file, func) {
271             func = ErrorReport.wrap_function(func);
272             oldOnload.call(this, file, func);
273         };
274     },
275     /**
276      * Automatically wraps the callback in $.fn.on
277      *
278      * @return void
279      */
280     _wrap_$_on_callback: function () {
281         var oldOn = $.fn.on;
282         $.fn.on = function () {
283             for (var i = 1; i <= 3; i++) {
284                 if (typeof(arguments[i]) === "function") {
285                     arguments[i] = ErrorReport.wrap_function(arguments[i]);
286                     break;
287                 }
288             }
289             return oldOn.apply(this, arguments);
290         };
291     },
292     /**
293      * Wraps all global functions that start with PMA_
294      * also automatically wraps the callback in AJAX.registerOnload
295      *
296      * @return void
297      */
298     set_up_error_reporting: function () {
299         ErrorReport.wrap_global_functions();
300         ErrorReport._wrap_ajax_onload_callback();
301         ErrorReport._wrap_$_on_callback();
302     }
306 TraceKit.report.subscribe(ErrorReport.error_handler);
307 ErrorReport.set_up_error_reporting();
308 $(function () {
309     ErrorReport.wrap_global_functions();