"use strict";
var errInfo, ax, s;
// Inicialização.
go (function(){
var to = setTimeout(close_, 5000), x;
// Aceder aos dados da solicitação.
try {
// O IE8- não tem um window.postMessage() compatível, mas tem um sistema de
// partilha de dados entre janelas menos restritivo.
if ((x = top.opener) && (errInfo = x.__AJAX_REQUEST__)) {
clearTimeout(to);
return print_(errInfo)
}
} catch (e) {}
// Verificar se há suporte para window.postMessage().
if (!window.postMessage)
return alert(statusText + "\nCódigo: " + status + "\n\n(Não há suporte para postMessage())");
// Detectar a mensagem com os dados.
on(W, "message", receive_);
// Assinalar a prontidão.
fireSimpleEvent(W, "dblclick");
// Recebe a mensagem com os dados.
function receive_(ev) {
clearTimeout(to);
to = 0;
if (errInfo) return;
// Recolher dados.
var o = ev.data, i;
errInfo = {};
for (i in o)
errInfo[i] = o[i];
// Imprimir.
print_(errInfo)
}
// Imprime os dados.
function print_(errInfo) {
var params = errInfo.data, meth = errInfo.meth, eparams = "", meth, uri, i, p, x, s, a, j, o;
// Assegurar que o URI é absoluto.
if ((uri = errInfo.uri) && uri.charAt (0) !== "/" && uri.indexOf("://") < 0) {
x = W.opener.location.href;
if (x && x.slice(-1) !== "/") {
i = x.lastIndexOf("/");
if (i >= 0) x = x.slice(0, i + 1);
}
errInfo.uri = uri = x + uri
}
// Imprimir a solicitação.
p = $("metodo");
/// Estado.
p.appendChild(D.createTextNode(meth));
p = p.nextSibling;
/// Parâmetros.
p.appendChild(D.createTextNode(params || "(nenhum)"));
/// URI
if (uri) {
// Citar texto.
if (params && meth !== "POST" && meth !== "PUT" && meth !== "DELETE") {
s = uri.lastIndexOf("?") < 0 ? "?" : "&";
a = params.split("&");
for (i = a.length; i;) {
x = a[--i];
j = x.indexOf("=");
eparams = "&"
+ (j < 0
? encodeURIComponent (x)
: encodeURIComponent (x.slice(0, j)) + "=" + encodeURIComponent (x.slice(j + 1)))
+ eparams
}
}
else params = s = "";
// Criar o elemento.
x = D.createElement("a");
x.href = uri + s + eparams;
x.innerHTML = uri + s + params
}
else x = D.createTextNode("(nulo)");
p = p.nextSibling;
p.appendChild(x);
/// Content-type
p = p.nextSibling;
p.appendChild(D.createTextNode(errInfo.encoding));
/// Cabeçalhos.
o = errInfo.requestHeaders;
x = "";
if (s = implode_(errInfo.accept)) x = "Accept: " + s + "\n";
if (s = implode_(errInfo.acceptCharsets)) x += "Accept-Charset: " + s + "\n";
if (o) for (i in o) x += o[i] + "\n";
p = p.nextSibling.nextSibling;
p.innerHTML = "";
p.appendChild(D.createTextNode(x || "(Nenhuns)"));
// Imprimir a resposta.
putResInfo();
// Imprimir a pilha de chamadas.
if (x = errInfo.stackTrace) {
dbg.printStackTrace (x);
x = dbg.getLastLogEntry().parentNode;
p = x.parentNode;
p.parentNode.removeChild (p);
x.className = "";
p = $("pilha");
p.replaceChild (x, p.firstChild)
}
// Retorna os elementos de A concatenados numa "string".
function implode_(a) {
var res = "", i, v;
if (!a || !a.length) return "";
for (i in a) {
v = a[i];
if (v.call) continue; // As correcções para IE podem interferir...
res += ", " + dbg.htmlEncode(v);
}
return "[" + res.slice(2) + "]"
}
}
// Fecha a página.
function close_() { W.close() }
}, "Dbg", ":Dbg/stacktrace", "complex", "Ajaxer");
// Repete a operação que originou o erro.
function retry() {
if (!errInfo) return;
D.body.className = "em-proc";
var ax = new Ajaxer(errInfo.uri);
ax.method = errInfo.meth;
ax.onJSONData = _onData;
ax.onXMLData = _onData;
ax.onTextData = _onData;
ax.onError = _onError.bind (ax);
ax.onTimeout = _onTimeout;
ax.waitTime = errInfo.waitTime;
ax.showError = function () { dbg.assert(0) };
ax.onEnd = function () { D.body.className = "" }
ax.send(errInfo.data)
}
// Se tudo correu bem...
function _onData(o) {
var o = this._o;
errInfo.msg = "Não há erros";
errInfo.res = this._getResContent(o);
errInfo.status = o.status;
errInfo.responseHeaders = o.getAllResponseHeaders();
putResInfo (1)
}
// Se ocorreu um erro...
function _onError(msg, optStatus, optIMsg) {
var me = this, x = me._o, headers, status, statusText, res, s;
// Extrair cabeçalhos.
if (x) {
try { headers = x.getAllResponseHeaders ? x.getAllResponseHeaders() : "-" } catch (e) { headers = "(ERRO: " + e.message + ")" }
try { status = (s = x.status) === undefined ? "-" : s } catch (e) { status = e.message }
try { statusText = (s = x.statusText) === undefined ? "" : s } catch (e) { statusText = "???" }
try { res = me._getResContent(x) } catch (e) { res = e.message }
} else {
headers = status = "-";
statusText = res = ""
}
// Ler o resto da informação.
errInfo.msg = me._fmtMsg.apply (me, arguments);
errInfo.res = res;
errInfo.status = status;
errInfo.statusText = statusText;
errInfo.responseHeaders = headers;
putResInfo()
}
// Se o tempo esgotou-se...
function _onTimeout() {
errInfo.msg = "A operação demorou mais do que " + this.waitTime + " segundos";
errInfo.status = 0;
errInfo.res = errInfo.responseHeaders = "";
putResInfo()
}
// Coloca a informação do erro.
function putResInfo(optNoErrors) {
var elmsg = $("msg"), elCabResp = $("cabResp"), elstatus = $("estado"), el, s, x, a;
// Colocar a mensagem.
elmsg.className = optNoErrors ? "" : "err";
elmsg.innerHTML = errInfo.msg;
// Colocar o estado HTTP retornado.
if (el = elstatus.firstChild.nextSibling)
rm$(el);
el = document.createElement("span");
el.innerHTML = dbg.htmlEncode(errInfo.status) + " " + errInfo.statusText;
elstatus.appendChild(el);
// Colocar os cabeçalhos de resposta.
if (el = elCabResp.firstChild.nextSibling)
rm$(el);
if (s = errInfo.responseHeaders) {
if (s.charAt) {
a = s.trim().split(/\n+/g);
s = "";
for (x = a.length; x > 0;)
s = "
" + dbg.htmlEncode(a[--x].trim()) + s;
if (s) s = s.substr(6);
}
else s = "<" + typeof s + ">??";
}
el = document.createElement("span");
el.innerHTML = s || "(Nenhum)";
elCabResp.appendChild(el);
// Mostrar o resultado.
x = $("res");
if (s = errInfo.res)
x.innerHTML = dbg.htmlEncode(s.replace(/(?:
\s*)+/gm, "\n").trim()).replace(/\n/g, "
");
else
x.innerHTML = ""
}