/* ===----------------=== Gateway ===---------------===
             WebCollege 2.0 - Web Consult Ltda      ===
                                                    ===
         Copyright:      © 2004, Web Consult Ltda.  ===
          Coded by:   Luiz Antonio B. Silva [Labs]  ===
                                                    ===
              http:          www.webconsult.com.br  ===
              mail:    comercial@webconsult.com.br  ===
                                                    ===
   versão 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 _AFTER_CALLS_ = new Array();
var _PARAM_CALLS_ = new Array();
var _BUZZY_PARAMS = new Array();
var _CONTAINERS_  = new Array();
var _IS_BUZZY_    = false;
var _SCRIPT_;


// -----------------=== Identificação de browser
/* Verifica qual o browser está sendo utilizado pelo
   internauta.
                                                     by Labs - 06/2004 */
function getBrowser(){

    // Netscape:
    if (document.layers) 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 {
            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(){
    //_CONTAINERS_ = createContainer();
    //_SCRIPT_    = createContainer('WC_SCRIPTS');
}


// -----------------=== 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 : 'WC_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 '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';
                   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 = 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){

    // Cria container:
    /*if (_IS_BUZZY_){
        if (!_BUZZY_PARAMS[0]){
            _BUZZY_PARAMS[1] = params;
            _BUZZY_PARAMS[2] = afterCall;
            _BUZZY_PARAMS[3] = beforeCall;
            _BUZZY_PARAMS[4] = 0;
            _BUZZY_PARAMS[0] = window.setTimeout(call, 500);
            
        // Tolerância    
        } else if(_BUZZY_PARAMS[4] > 1){
            _IS_BUZZY_ = false;
            
        } else {
            _BUZZY_PARAMS[4] = _BUZZY_PARAMS[4] +1;
        }
        return;
    }
    if (_BUZZY_PARAMS[0]){
        window.clearTimeout(_BUZZY_PARAMS[0]);
        params     = _BUZZY_PARAMS[1];
        afterCall  = _BUZZY_PARAMS[2];
        beforeCall = _BUZZY_PARAMS[3];
        _BUZZY_PARAMS[0] = "";
        _BUZZY_PARAMS[4] = 0;
    }       */

    // Cria container:
    /*if (!_CONTAINERS_){
        _CONTAINERS_ = createContainer();
    } */


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

    // Armazena params para afterCalls:
    _CONTAINERS_[unique]  = container;
    _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);
    }

    // Acrescenta parâmetros:
    if (afterCall){
        params["afterCall"] = afterCall;
    }
    if (beforeCall){
        params["beforeCall"] = beforeCall;
    }
    if (params.files){
        var files = params.files;
        delete params.files;
    }
    var packet = serialize(params);

    // Monta documento:
    doc.open();
    doc.write('<html><head><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="WC_CALL" enctype="multipart/form-data" method="post" target="" action="' + SERVER + '" ACCEPTCHARSET="iso-8859-1">');
    doc.write('<input type="hidden" name="WC_PROTOCOLO" value="POST-WC">');
    doc.write('<input type="hidden" name="WC_UNIQUE"  value="' + unique + '">');
    doc.write('<textarea rows="8" cols="89" name="WC_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['WC_CALL'].insertAdjacentElement("afterBegin", (files[n]));
            parentFile.insertBefore(dupNode);
        }
    }

    // Envia:
    //_IS_BUZZY_ = true;
    doc.forms['WC_CALL'].submit();
}

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


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

    // Pega o result:
    var result = getSerial('WC_RESULT', unique);

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

    // 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);');
        }
    }
   /*            alert('pre - delete');
    for (var c in _CONTAINERS_){
        alert(_CONTAINERS_[c]);
    } */

    delete _CONTAINERS_[unique];
    var span = document.all("SPANWC_CONTAINER_" + unique);
    span.removeNode(true);
   /*            alert('pós - delete');
    for (var c in _CONTAINERS_){
        alert(_CONTAINERS_[c]);
    }       */

}

// -----------------=== 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, unique){
    var serial = getServerResult(from, unique);
    if (serial){
        var objSerial = toObject(serial);
        //showObject(objSerial);
    }
    return objSerial;
}


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

    // Pega o resultado:
    var result = "";
    switch(_BROWSER_) {
        case 'NS':  result = _CONTAINERS_[unique].document.forms['WC_RESPONSE'].elements[tipo].value;
                    break;
        case 'IE':  result = _CONTAINERS_[unique].document.forms['WC_RESPONSE'][tipo].value;
                    break;
        case 'MOZ': result = window.frames[_CONTAINERS_[unique].name].document.forms['WC_RESPONSE'][tipo].value;
                    break;
        case 'OPR': var textElement = window.frames[_CONTAINERS_[unique].name].document.getElementById(tipo);
                    result = textElement.value;
                    break;
        case 'KONQ':var textElement = window.frames[_CONTAINERS_[unique].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();
}
