/**
 * Esta function cria o alert com as informações do erro.
 * O IF serve para que, se for FireFox(FF) ele entra no IF e usa as opções do Error Objetct mesmo, se não, usa a função getStackTrace().
 * Eduardo - 15/03/2007
 */
function setErros(erro){
    if(erro.stack){
        var funcao = arrumaNomeFuncao(erro.stack);
        var js = arrumaNomeJS(erro.fileName);
        var arquivo = arrumaNomeArquivoFF(erro.stack);
        
        alert("Erro: " + erro.message + "\n\nFunção: " + funcao + "\nLinha: " + erro.lineNumber + "\nArquivo da função: " + js +
        "\n\nPágina que gerou o erro: " + arquivo[1] + "\nLinha: " + arquivo[0]);
    }else{
        var nomeArquivo = arrumaNomeArquivoIE(this.document.location);
        alert("Erro: " + erro.message + "\n\nFunção:\n" + getStackTrace() + "\nArquivo que gerou o erro: " + nomeArquivo);
    }
}

/**
 * Esta function chama a função constructStackTrace, passando como parâmetro a função que chamou a getStackTrace(). Eduardo - 15/03/2007
 */
function getStackTrace(){
    return constructStackTrace(getStackTrace.caller);
}

/**
 * Esta function monta a árvore das funções que foram sendo chamadas até chegar no erro. Eduardo - 15/03/2007
 */
function constructStackTrace(funcao){
    if (!funcao)
        return "";
    var thisRecord = getFunctionName(funcao) + "(";
    for (var i = 0; i < funcao.arguments.length; i++){
        thisRecord += String(funcao.arguments[i]);
        if (i + 1 < funcao.arguments.length)
            thisRecord += ", ";
    }
    return thisRecord + ")\n" + constructStackTrace(funcao.caller);
}

/**
 * Esta function retorna o nome da função formatado. Eduardo - 15-03-2007
 */
function getFunctionName(funcao){
    if (/function (\w+)/.test(String(funcao)))
        return RegExp.$1;
    else
        return "";
}

/**
 * Esta function arruma o nome do arquivo que gerou o erro, para o IE. Eduardo - 15/03/2007
 */
function arrumaNomeArquivoIE(arquivo){
    var arquivoStr = arquivo.toString();
    var novoNome = "";
    for(var i = arquivoStr.length - 1; i > 0; i--){
        if(arquivoStr.charAt(i) == "/")
            return novoNome;
        novoNome = arquivoStr.charAt(i) + novoNome;
    }
}

/**
 * Esta function arruma o nome da função onde ocorreu o erro (FF). Eduardo - 15/03/2007
 */
function arrumaNomeFuncao(funcao){
    var novoNome = "";
    for(var i = 0; i < funcao.length; i++){
        if(funcao[i] == "(")
            return novoNome;
        novoNome += funcao[i];
    }
}

/**
 * Esta function arruma o nome do arquivo que contém a função que gerou o erro (FF). Eduardo - 15/03/2007
 */
function arrumaNomeJS(js){
    var novoNome = "";
    for(var i = js.length - 1; i > 0; i--){
        if(js[i] == "/")
            return novoNome;
        novoNome = js[i] + novoNome;
    }
}

/**
 * Esta function arruma o nome do arquivo que chamou a função que deu erro (FF). Eduardo - 15/03/2007
 */
function arrumaNomeArquivoFF(arquivo){
    var novoNome = new Array();
    novoNome[0] = "";
    novoNome[1] = "";
    var nrLinha = false;
    for(var i = arquivo.length - 1; i > 0; i--){
        if(!nrLinha){
            if(arquivo[i] == ":")
                nrLinha = true;
            if(!nrLinha)
                novoNome[0] = arquivo[i] + novoNome[0];
        }else{
            if(arquivo[i] == "/")
                break;
            novoNome[1] = arquivo[i] + novoNome[1];
        }
    }
    return novoNome;
}