/* ===-----------=== Komanche 2.0 ===-----------===

           Copyright:     © 2004, CBA Consult ltda.
            Coded by:  Luiz Antonio B. Silva [Labs]
                      Todos os direitos reservados.

                http:         www.cbaconsult.com.br
                mail:   comercial@cbaconsult.com.br

   Gateway de comunicações com o komanche.

   Esta versão(2.0) foi inspirada nas idéias do sistema
   jsrs de autoria de Brent Ashley [jsrs@megahuge.com]

-------------=== Vs. 2.0 - Junho/2004 | By Labs --=== */


// -----------------=== Variáveis globais
/* Globais do gateway.
                                                     by Labs - 06/2004 */
var _BROWSER_     = getBrowser();
var _EXEC_SCRIPT_ = true;
var _AFTER_CALLS_ = new Array();
var _PARAM_CALLS_ = new Array();
var _POOL_CALLS_  = new Array();
var _BUZZY_       = false;
var _LAST_PAGE_   = "";
var _LAST_LAYOUT_ = "";
var _CONTAINER_;
var _SCRIPT_;
var _uacct;
var himidia_estatisticas;

// -----------------=== Identificação de browser
/* Verifica qual o browser está sendo utilizado pelo
   internauta.
                                                     by Labs - 06/2004 */
function getBrowser(){
    var browser=navigator.appName;
    var version=navigator.appVersion;
    
    // Netscape:
    if (document.layers){
        _EXEC_SCRIPT_ = false;
        return "NS";
    }
    
    if (document.all) {
        var agt = navigator.userAgent.toLowerCase();

        // Opera:
        if (agt.indexOf("opera") != -1){
            return "OPR";

        // Konqueror:
        } else if (agt.indexOf("konqueror") != -1){
            return "KONQ";

            
        // IE:
        } else {
            if (version.indexOf("MSIE 5.") >= 0) {
                _EXEC_SCRIPT_ = false;
            } 
            return "IE";
        }
  }

  // Mozzila / DOM browsers:
  if (document.getElementById) return "MOZ";

  // Desconhecidos:

  return "OTHER";
}


// -----------------=== Criação do container
/* Cria o container que fará a comunicação com o servidor
   Komanche.
                                                     by Labs - 06/2004 */
function initGateway(){

    _CONTAINER_ = createContainer();
    //_SCRIPT_    = createContainer('KM_SCRIPTS');
    return false;
}


// -----------------=== Criação do container
/* Cria o container que fará a comunicação com o servidor
   Komanche.
                                                     by Labs - 06/2004 */
function createContainer(name){
    var container;
    var cName = (name ? name : 'KM_CONTAINER');

    switch(_BROWSER_) {
        case 'NS': container = new Layer(100);
                   container.name        = cName;
                   container.visibility  = 'hidden';
                   container.clip.width  = 100;
                   container.clip.height = 100;
                   break;
                   
        case 'IE5': ;
        case 'IE': document.body.insertAdjacentHTML("beforeEnd", '<span id="SPAN' + cName + '"></span>');
                   var span  = document.all("SPAN" + cName);
                   var html  = '<iframe align="center" width="750" name="' + cName + '" src=""></iframe>';
                   span.innerHTML     = html;
                   span.style.display = 'none';         //Linha para exibir erro no Komanche
                   container = window.frames[cName];
                   break;

       case 'MOZ': var span = document.createElement('SPAN');
                   span.id  = "SPAN" + cName;
                   document.body.appendChild(span);
                   var iframe  = document.createElement('IFRAME');
                   iframe.name = cName;
                   iframe.id   = cName;
                   span.appendChild(iframe);
                   container = iframe;
                   //iframe.height = 150;
                   //iframe.width  = 750;
                   iframe.height = 0;
                   iframe.width  = 0;
                   break;

       case 'OPR': var span = document.createElement('SPAN');
                   span.id = "SPAN" + cName;
                   document.body.appendChild(span);
                   var iframe  = document.createElement('IFRAME');
                   iframe.name = cName;
                   iframe.id   = cName;
                   span.appendChild(iframe);
                   container = iframe;
                   iframe.height = 0;
                   iframe.width  = 0;
                   break;

      case 'KONQ': var span = document.createElement('SPAN');
                   span.id = "SPAN" + cName;
                   document.body.appendChild(span);
                   var iframe  = document.createElement('IFRAME');
                   iframe.name = cName;
                   iframe.id   = cName;
                   span.appendChild(iframe);
                   container = iframe;

                   // Needs to be hidden for Konqueror, otherwise it'll appear on the page
                   span.style.display   = 'none';
                   iframe.style.display = 'none';
                   iframe.style.visibility = 'hidden';
                   iframe.height = 0;
                   iframe.width  = 0;
                   break;
                   
    }

    return container;
}


// -----------------=== call()
/* Responsável pela chamada e envio de dados ao servidor,
   bem como processar o recebimento.
                                                     by Labs - 06/2004 */
function call(params, afterCall, beforeCall){
    // Pool de chamadas:
    /*if (_BUZZY_){
        var l = _POOL_CALLS_.length;
        _POOL_CALLS_[l] = {p: params, a: afterCall, b: beforeCall};
    }
    _BUZZY_ = true;*/

    if (!_CONTAINER_){
        _CONTAINER_ = createContainer();
    }

    // Prepara:
    var d      = new Date();
    var unique = d.getTime() + '' + Math.floor(1000 * Math.random());
    var doc    = (_BROWSER_ == "IE" ) ? _CONTAINER_.document : _CONTAINER_.contentDocument;

    // Monta cache de estruturas:
    params["old_page"]   = _LAST_PAGE_;
    params["old_layout"] = _LAST_LAYOUT_;

    // Armazena params para afterCalls:
    _AFTER_CALLS_[unique] = afterCall;
    _PARAM_CALLS_[unique] = params;

    // Processa beforeCall.
    // Se receber _abort em params, aborta a chamada:
    if (beforeCall){
        params = eval(beforeCall + '(params)');
        if (params._abort){
            if (params._abort_msg) alert(params._abort_msg);
            return false;
        }
    }
    if (params.publisher == 'getPage'){
        clearTimers(params);
    }
    if (params.files){
        var files = params.files;
        delete params.files;
    }
    
    // Estatisticas do Google Analytics:
    if (_uacct && _uacct != 'undefined' && params.publisher == 'getPage'){
        /*alert(params.page + 
                (params.jnot_categoria ? ',categ_' + params.jnot_categoria : '') +
                (params.jnot_edicao ? ',edicao_' + params.jnot_edicao : '')
        );*/
        urchinTracker(params.page + 
            (params.jnot_categoria ? ',categ_' + params.jnot_categoria : '') +
            (params.jnot_edicao ? ',edicao_' + params.jnot_edicao : '')
        );
    }
    
    // Acrescenta parâmetros:
    var packet = serialize(params);

    // ===--- Suporte a uploads no formulário:
    var enctype = (files ? 'enctype="multipart/form-data"' : "");

    // Monta documento:
    doc.open();
    doc.write('<html>');
    doc.write('<head>');
    doc.write('<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">');
    doc.write('</head><body leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">');
    doc.write('<form name="KM_CALL" ' + enctype + ' method="post" target="" action="' + SERVER + '" ACCEPTCHARSET="iso-8859-1">');
    doc.write('<input type="hidden" name="KM_PROTOCOLO" value="POST-KM">');
    doc.write('<input type="hidden" name="KM_UNIQUE"  value="' + unique + '">');
    doc.write('<textarea rows="8" cols="89" name="KM_PACKET">' + packet + '</textarea>');
    doc.write('</form></body></html>');
    doc.close();

    // ===--- Acrescenta input-files no formulário:
    if (files){
        for (var n in files){
            var dupNode = files[n].cloneNode();
            var parentFile = files[n].parentNode;
            doc.forms['KM_CALL'].insertAdjacentElement("afterBegin", (files[n]));
            parentFile.insertBefore(dupNode);
        }
    }

    // Envia:
    doc.forms['KM_CALL'].submit();
    
    return false;


}


// -----------------=== callback()
/* Responsável pelo recebimento e processamento dos dados
   retornados do servidor.
                                                     by Labs - 06/2004 */
function callback(unique){
    _BUZZY_ = false;

    // Pega o result:
    var result = getSerial('KM_RESULT');
    

    // Recupera parametros da chamada:
    afterCall = _AFTER_CALLS_[unique];
    params    = _PARAM_CALLS_[unique];

    // Monta cache de estruturas:
    _LAST_PAGE_   = (params.page   ? params.page   : "");
    _LAST_LAYOUT_ = (result.layout ? result.layout : "");

    // Executa método pós chamada:
    if (afterCall){

        // Multi-execução:
        if (typeof(afterCall) == 'object'){
            for (var f in afterCall){
                eval('var af_res = ' + afterCall[f] + '(params, result);');
            }

        // Execução simples:
        } else {
            eval('var af_res = ' + afterCall + '(params, result);');
        }

        // Pool:
        /*var len = _POOL_CALLS_.length;
        if (len > 0){
            len = len-1;
            var objCall = _POOL_CALLS_[len];
            _POOL_CALLS_.length = len;
            call(objCall.p, objCall.a, objCall.b);
        }*/
        
    }
    return false;

}


// -----------------=== alterOnclickForHref()
/* Acerta os onclicks dos hrefs.
                                                     by Fontes - 03/2006 */
function alterOnclickForHref(){

    //Obtém os links do menu
    var menu=document.getElementById("menu")
    var links=menu.getElementsByTagName("a")

    //Atribui o evento
    for(var i=0;i<links.length;i++)
        links[i].onclick=links[i].onclick + ";return false;";
}

// -----------------=== getSerial()
/* Recebe um serial do servidor e retorna objeto.
                                                     by Labs - 06/2004 */
function insertScript(script, html){
    var doc = (_BROWSER_ == "IE" ) ? _SCRIPT_.document : _SCRIPT_.contentDocument;

    // Monta documento:
    doc.open();
    doc.write('<html>');
    doc.write('<head>');
    doc.write('<script>');
    doc.write('var p = document.layers ? parentLayer : window.parent;');
    doc.write(script);
    doc.write('</script>');
    doc.write('</head><body><pre><code>' + script + '</code></pre>');
    doc.write('<br><hr><textarea rows="8" cols="80">' + html + '</textarea></body></html>');
    doc.close();
}

// -----------------=== getSerial()
/* Recebe um serial do servidor e retorna objeto.
                                                     by Labs - 06/2004 */
function getSerial(from){
    var serial = getServerResult(from);
    if (serial){
        var objSerial = toObject(serial);
        //showObject(objSerial);
    }

    return objSerial;
}


// -----------------=== getServerResult()
/* Recupera valores vindos do servidor.
                                                     by Labs - 06/2004 */
function getServerResult(tipo){

    // Pega o resultado:
    var result = "";
    switch(_BROWSER_) {
        case 'NS':  result = _CONTAINER_.document.forms['KM_RESPONSE'].elements[tipo].value;
                    break;
        case 'IE':  result = _CONTAINER_.document.forms['KM_RESPONSE'][tipo].value;
                    break;
        case 'MOZ': result = window.frames[_CONTAINER_.name].document.forms['KM_RESPONSE'][tipo].value;
                    break;
        case 'OPR': var textElement = window.frames[_CONTAINER_.name].document.getElementById(tipo);
                    result = textElement.value;
                    break;
        case 'KONQ':var textElement = window.frames[_CONTAINER_.name].document.getElementById(tipo);
                    result = textElement.value;
                    break;
    }
    return result;
}



// -----------------=== Funções de coockie:
/* Faz a validação de usuário nas chamadas rpc.
                                                     by Labs - 03/2004 */
function setCookie(name, value){
    document.cookie = name + "=" + value + ";";
}

function getCookieVal(offset) {
    var endstr = document.cookie.indexOf (";", offset);
    if (endstr == -1)
        endstr = document.cookie.length;
    return unescape(document.cookie.substring(offset, endstr));
}

function getCookie(name) {
    if (!name) return null;

    var arg = name + "=";
    var alen = arg.length;
    var clen = document.cookie.length;
    var i = 0;
    while (i < clen) {
        var j = i + alen;
        if (document.cookie.substring(i, j) == arg)
            return getCookieVal (j);
        i = document.cookie.indexOf(" ", i) + 1;
        if (i == 0) break;
    }
    return null;
}

function refreshPage(){
    window.location.reload();
}
