<!--
/*
 * @@hash=1534047094
 */

/**
 * Abre uma url em outra janela<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Url que será aberta.<br/>
 * 2. Nome da janela (Caso nulo, ou não exista a janela, será criada uma nova janela).<br/>
 * 3. Propriedade para a abertura da janela. (Opcional)<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observações:<br/>
 * - As propriedades devem ser definidas em pares separados por vírgula. Ex: scrollbars=yes,resizable=yes<br/>
 * - As propriedades válidas e os possíveis valores são:<br/>
 *     - toolbar = yes | no<br/>
 *     - location = yes | no<br/>
 *     - status = yes | no<br/>
 *     - menubar = yes | no<br/>
 *     - scrollbars = yes | no<br/>
 *     - resizable = yes | no<br/>
 *     - width = yes | no<br/>
 *     - height = Número inteiro<br/>
 *     - left = Número inteiro<br/>
 *     - top = Número inteiro<br/>
 * <br/>
 * Para colocar um caracter & que esteja entre os dados do valor de um parâmetro de uma URL utilize a combinação: %26 + &
 */
function OpenURLOnNewWindow(pURL, pWindowName, pWindowProperties) {
  MM_openBrWindow(pURL, pWindowName, pWindowProperties);
}

/**
 * Atualiza um componente na tela chamadora.<br/>
 * <br/>
 * Parâmetros:<br/>
 * <br/>
 * 1. Formulário do Componente a ser atualizado<br/>
 * 2. Componente a ser atualizado<br/>
 * 3. Procurar Componente em qualquer tela chamadora?<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function cmsOpenerWindowRefreshComponent(form, componentName, allWindows) {
  var first = true;
  var current = top;
  while (((caller = getOpenerWindow(current)) != null) && (allWindows === true || first)) {
    first = false;

    if (!caller.$mainform) {
      return;
    }
     
    var mainform = caller.$mainform();
    if (mainform) {
      var component = mainform.$c(componentName, form);
      if (component && component.refresh) {
        component.refresh();
        return;
      }
    }
     
    current = caller;
  }
}

/**
 * Adiciona um filho ao elemento passado por parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Árvore <br/>
 * 2. Elemento pai<br/>
 * 3. Descrição do filho que será adicionado<br/>
 * <br/>
 * Retorno: <br/>
 * Elemento que foi adicionado como filho. (Variante)<br/>
 * <br/>
 * Exemplos: <br/>
 * 1- Para adicionar um filho com a descrição "Módulo" ao elemento cuja referência está armazenada na variável "Elemento" e assumindo que esse elemento pertence à árvore que está na variável "Árvore", os parâmetros seriam "Árvore", "Elemento", "Módulo". Armazenar o retorno na variável "Filho".
 */
function ebfAddChild(tree,parentElement, description){	
  return tree.addChild(parentElement,description);	
}

/**
 * Exibe uma mensagem de alerta junto com um botão "Ok"  e o fluxo só continua a ser executado após o usuário clicar<br/>
 * neste botão.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Mensagem que será exibida.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Exemplo: 1º Assumindo como parâmetro a mensagem "Maker ALL", junto com este aparecerá um botão de OK.<br/>
 * O fluxo só continuará sendo executado quando o usuário clicar no botão.
 */
function ebfAlertMessage(msg) {
  alert(msg);
}

/**
 * Junta vários itens de texto em apenas um item.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Valor que terá outros valores adicionados<br/>
 * 2. Valor que será concatenado junto ao texto do primeiro parâmetro.<br/>
 * ...<br/>
 * N. Valor n a ser adicionado.<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna o valor concatenado.<br/>
 * <br/>
 * Observação:<br/>
 * Esta função tem um melhor desempenho em relação a função "Concatenação".
 */
function ebfAppend() {
  var value = "";

  if (existArgs(arguments)) {
    for (var i = 0; i < arguments.length; i++) {
      if(arguments[i] == null) arguments[i] = '';
      var temp = arguments[i].toString();
      value += temp;
    }
  }

  return value;
}

/**
 * Função que abre um Applet numa moldura.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. URL do pacote que contém o Applet (Ex.: arquivo .jar);<br/>
 * 2. Nome do Applet;<br/>
 * 3. Formulário que contém o componente do tipo Moldura; <br/>
 * 4. Componente do tipo Moldura;<br/>
 * <br/>
 * Ex.:<br/>
 * Para Abrir um Applet a partir de um jar adicionado no maker, (Maiores informações no tópico do HELP : Como adicionar componentes/bibliotecas de terceiros no maker) utiliza-se a seguinte chamada da função: <br/>
 *    ebfAppletNew("MeusApps/makertest.jar", "src.WireframeViewer.class", 'formulario', "MakerBevel1");<br/>
 * Obs.: É importante notar que o caminho para o .class do applet deve ser colocado por completo, com toda a hierarquia de pacotes.<br/>
 * De forma similar pode-se abrir applets em servidores remotos:<br/>
 *     ebfAppletNew("http://www.softwell.com.br/maker/makertest.jar", "src.WireframeViewer.class", 'formulario', "MakerBevel1");
 */
function ebfAppletNew(path, code, form, com){ 
  var moldura = $c(com);
  molduraObj = document.getElementById("HTMLGroupBox"+moldura.code);
  var applet = document.createElement("applet");
  applet.setAttribute("height", moldura.getHeight());
  applet.setAttribute("width", moldura.getWidth());
  applet.setAttribute("archive", path);
  applet.setAttribute("code", code);
  molduraObj.appendChild(applet);
}

/**
 * Essa função é utilizada para fazer o arredondamento de valores por casas decimais.<br/>
 * O número será arredondado para cima ou para baixo a depender do valor das casas decimais.<br/>
 * Caso o valor das casas decimais seja maior ou igual a 0,5 o número será arredondado para baixo, caso contrário, para cima.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Número a ser arredondado.<br/>
 * 2. Quantidade de casas decimais, para a qual o número será arredondado.<br/>
 * <br/>
 * Retorno:<br/>
 * Retorna o número fracionado passado por parâmetro com as casas decimais arredondadas.<br/>
 * <br/>
 * Exemplo:<br/>
 * 1. Assumindo o Parâmetro 1 como: 9,5782, e o Parâmetro 2 como: 2 (Inteiro), o retorno seria: 9,58.<br/>
 * 2. Assumindo o Parâmetro 1 como: 9,5566, e o Parâmetro 2 como: 2 (Inteiro), o retorno seria: 9,56.<br/>
 * <br/>
 * Observações:<br/>
 * 1. Para garantir a integridade das operações matemáticas, utilize conversão para o tipo de dado nos parâmetros.
 */
function ebfArredondaDecimal(value, decimalQtt) {
  value = parseNumeric(value); 
  var factor = Math.pow(10, parseNumeric(decimalQtt));
  // Multiplica pelo fator
  value *= factor;
  // Arredonda o valor
  value = Math.round(value);
  // Divide pelo fator
  value /= factor;
  return value;
}

/**
 * Converte um Texto Normal para um Texto Binário.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Texto normal em letras. <br/>
 * <br/>
 * Retorno:<br/>
 * Texto Binário.<br/>
 * <br/>
 * Exemplo:<br/>
 * Assumindo como parâmetro o texto ALL, o retorno será o texto binário "010000010100110001001100".
 */
function ebfAsciiToBinary(astring) {
  var binary = "";
  if (astring.length > 0) {
    for (var i = 0; i < astring.length; i++) {
      var value = astring.charCodeAt(i);
      for (var j = 7; j >= 0; j--) {
        binary += ((value >> j) & 1);
      }
    }
  }
  return binary;
}

/**
 * Associa uma regra ao clicar no elemento passado por parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Árvore <br/>
 * 2. Elemento<br/>
 * 3. Nome da regra que será associada<br/>
 * 4. Lista de parâmetros que serão enviados para a regra.<br/>
 * <br/>
 * Observações:<br/>
 * Os parâmetros deverão ser passados por uma lista de valores.<br/>
 * Essa função só pode chamar regras cliente.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1-Supondo que a regra "Imprimir"  mostra na tela a soma dos números passados por parâmetro e assumindo os <br/>
 * parâmetros como Árvore, Elemento, "Imprimir", [5,6], será mostrado na tela o valor 11.
 */
function ebfAssociateRuletoElement(tree, element, ruleName, ruleParams){
  tree.associateRuleToElement(element, ruleName, ruleParams);	
}

/**
 * Função que cria um novo componente Botão dinâmicamente.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Aba (Caso não seja definida, a aba será criada).<br/>
 * 2. Posição X.<br/>
 * 3. Posição Y.<br/>
 * 4. Largura do Componente.<br/>
 * 5. Altura do Componente.<br/>
 * 6. Descrição do Componente<br/>
 * 7. Imagem (A mesma deve estar no local Skins\Default)<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function ebfButtonNew(aba,posX,posY,width,height,description,img){
  var code = getCodComponent();
  var component = new HTMLButton(ebfGetSystemID(),ebfGetFormID(), code, posX, posY, width, height, description, img);
  component.id = description;
  component.loadComponentTime = 0;
  var container = $mainform().d.t.getTabByName(aba);
  if(!container){
     d.t.add(aba);
     container = $mainform().d.t.getTabByName(aba);
  } 
  component.design(container.div, true);
  document['c_' + code] = component;
}

/**
 * Cria uma referência para o "Objeto Área de Desenho" e a retorna.<br/>
 * Este objeto é necessário para que seja utilizada as demais funções da categoria Desenho.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Moldura que será utilizada como referência para a criação dos desenhos.<br/>
 * <br/>
 * Retorno:<br/>
 * Retorna a referência do objeto. (Variante)
 */
function ebfCanvasCreate(bevel) {
  var bevelComp = $c(bevel);
  if (bevelComp) {
    var canvas = new HTMLShape(ebfGetSystemID(), ebfGetFormID(), getCodComponent(), bevelComp.posX, bevelComp.posY, bevelComp.width, bevelComp.height, 'RECT');
    canvas.bgColor = '';
    canvas.stroke = 0;
    canvas.design($mainform().d.t.getSelectedTab().div);
    return canvas;
  }
}

/**
 * Desenha um arco na área de desenho passada como parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Área de Desenho<br/>
 * 2. Coordenada X inicial.<br/>
 * 3. Coordenada Y inicial.<br/>
 * 4. Raio.<br/>
 * 5. Valor do ângulo inicial em graus.<br/>
 * 6. Valor do ângulo final em graus.<br/>
 * 7. Valor lógico que informa se o arco será preenchido.<br/>
 * 8. Cor de preenchimento.<br/>
 * 9. Valor lógico que informa se o arco será delineado.<br/>
 * 10. Cor da borda.<br/>
 * 11. Espessura da borda.<br/>
 * 12. Valor lógico que informa se o arco será desenhado no sentido anti-horário.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function ebfCanvasDrawArc(canvas, x, y, radio, startAngleDegrees, endAngleDegrees, fill, fillColor, line, lineColor, lineWidth, anticlockwise) {
  if(canvas) {
    canvas.drawArc(x, y, radio, startAngleDegrees, endAngleDegrees, fill, fillColor, line, lineColor, lineWidth, anticlockwise);
  }
}

/**
 * Desenha uma curva de Bezier na área de desenho passada como parâmetro.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Área de Desenho.<br/>
 * 2. Coordenada X inicial.<br/>
 * 3. Coordenada Y inicial.<br/>
 * 4. Coordenada X do ponto de deformação.<br/>
 * 5. Coordenada Y do ponto de deformação.<br/>
 * 6. Coordenada X final.<br/>
 * 7. Coordenada Y final.<br/>
 * 8. Valor lógico que informa se a área será preenchida.<br/>
 * 9. Cor de preenchimento.<br/>
 * 10. Valor lógico que informa se a área será delineada.<br/>
 * 11. Cor da borda.<br/>
 * 12. Espessura da borda.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
/*function ebfCanvasDrawBezierCurve(canvas, x1, y1, x2, y2, x3, y3, fill, fillColor, line, lineColor, lineWidth) {
  if(canvas) {
    canvas.drawBezierCurve(x1, y1, x2, y2, x3, y3, fill, fillColor, line, lineColor, lineWidth);
  }
}*/

/**
 * Desenha um círculo na área de desenho passada como parâmetro.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Área de Desenho (Variante)<br/>
 * 2. Coordenada da posição X.<br/>
 * 3. Coordenada da posição Y.<br/>
 * 4. Raio<br/>
 * 5. Valor lógico que informa se o círculo será preenchido<br/>
 * 6. Cor de preechimento<br/>
 * 7. Valor lógico que informa se o círculo será delineado<br/>
 * 8. Cor da Borda.<br/>
 * 9. Espessura da Borda<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function ebfCanvasDrawCircle(canvas, x, y, radio, fill, fillColor, line, lineColor, lineWidth) {
  if(canvas) {
    var aShape = canvas.surface.createEllipse({cx: x, cy: y, rx: radio, ry: radio});
    if (line) {   
      aShape.setStroke({color: lineColor, width: lineWidth});
    }              
    if (fill) {          
      aShape.setFill(fillColor);
    }
  }
}

/**
 * Desenha uma elipse na área de desenho passada como parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Área de Desenho (Variante)<br/>
 * 2. Coordenada X inicial.<br/>
 * 3. Coordenada Y inicial.<br/>
 * 4. Valor de A<br/>
 * 5. Valor de B<br/>
 * 6. Valor lógico que informa se a elipse será preenchida.<br/>
 * 7. Cor de preenchimento.<br/>
 * 8. Valor lógico que informa se a elipse será delineada.<br/>
 * 9. Cor da Borda.<br/>
 * 10. Espessura da borda.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function ebfCanvasDrawEllipse(canvas, x, y, a, b, fill, fillColor, line, lineColor, lineWidth) {
  if(canvas) {
    var aShape = canvas.surface.createEllipse({cx: x, cy: y, rx: a, ry: b});
    if (line) {
      aShape.setStroke({color: lineColor, width: lineWidth});
    }
    if (fill) {
      aShape.setFill(fillColor);
    }
  }
}

/**
 * Desenha uma linha na área de desenho passada como parâmetro.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Objeto Área de Desenho;<br/>
 * 2. Coordenada X inicial;<br/>
 * 3. Coordenada Y inicial;<br/>
 * 4. Coordenada X final;<br/>
 * 5. Coordenada Y final;<br/>
 * 6. Cor da linha;<br/>
 * 7. Espessura da linha.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function ebfCanvasDrawLine(canvas, x1, y1, x2, y2, color, lineWidth){
  if(canvas) {
    var aShape = canvas.surface.createLine({x1: x1, y1: y1, x2: x2, y2: y2});
    aShape.setStroke({color: color, width: lineWidth});
  }
}

/**
 * Desenha curva quadrática na área de desenho passada como parâmetro.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Área de Desenho.<br/>
 * 2. Coordenada X inicial.<br/>
 * 3. Coordenada Y inicial.<br/>
 * 4. Coordenada X do ponto máximo ou mínimo.<br/>
 * 5. Coordenada Y do ponto máximo ou mínimo.<br/>
 * 6. Coordenada X final.<br/>
 * 7. Coordenada Y final.<br/>
 * 8. Valor lógico que informa se a área será preenchida.<br/>
 * 9. Cor de preenchimento.<br/>
 * 10. Valor lógico que informa se a área será delineada.<br/>
 * 11. Cor da borda.<br/>
 * 12. Espessura da borda.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function ebfCanvasDrawQuadraticCurve(canvas, x1, y1, x2, y2, x3, y3, fill, fillColor, line, lineColor, lineWidth) {
  if(canvas) {
    canvas.drawQuadraticCurve(x1, y1, x2, y2, x3, y3, fill, fillColor, line, lineColor, lineWidth);
  }
}

/**
 * Desenha um retângulo na área de desenho passada como parâmetro.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Área de Desenho (Variante)<br/>
 * 2. Coordenada X inicial.<br/>
 * 3. Coordenada Y inicial.<br/>
 * 4. Largura<br/>
 * 5. Altura<br/>
 * 6. Valor lógico que informa se o retângulo será preenchido.<br/>
 * 7. Cor de preenchimento.<br/>
 * 8. Valor lógico que informa se o retângulo será delineado<br/>
 * 9. Cor da borda.<br/>
 * 10. Espessura da borda<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function ebfCanvasDrawRect(canvas, x, y, width, height, fill, fillColor, line, lineColor, lineWidth) {
  if(canvas) {            
    var aShape = canvas.surface.createRect({x: x, y: y, width: width, height: height});
    if (line) {                      
      aShape.setStroke({color: lineColor, width: lineWidth});
    }                    
    if (fill) {                    
      aShape.setFill(fillColor);
    }
  }
}

/**
 * Desenha um losango na área de desenho passada como parâmetro.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Área de Desenho;<br/>
 * 2. Coordenada X inicial;<br/>
 * 3. Coordenada Y inicial;<br/>
 * 4. Dimensão da diagonal 1;<br/>
 * 5. Dimensão da diagonal 2;<br/>
 * 6. Valor lógico que informa se o losango será preenchido;<br/>
 * 7. Cor de preenchimento;<br/>
 * 8. Valor lógico que informa se o losango será delineado;<br/>
 * 9. Cor da borda;<br/>
 * 10. Espessura da borda.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function ebfCanvasDrawRhombus(canvas, x1, y1, d1, d2, fill, fillColor, line, lineColor, lineWidth) {
  if(canvas) {
    var aShape = canvas.surface.createPolyline([
      {x: x1 + parseInt(d1 / 2), y: y1},
      {x: x1 + d1, y: y1 + parseInt(d2 / 2)},
      {x: x1 + parseInt(d1 / 2), y: y1 + d2},
      {x: x1, y: y1 + parseInt(d2 / 2)},
      {x: x1 + parseInt(d1 / 2), y: y1}
    ]);
    if (line) {
      aShape.setStroke({color: lineColor, width: lineWidth});
    }
    if (fill) {
      aShape.setFill(fillColor);
    }
  }
}

/**
 * Altera o valor de um componente que esteja em outro formulário que não o corrente.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário<br/>
 * 2. Componente<br/>
 * 3. Novo Valor<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observação: <br/>
 * 1. Está função não altera o valor do componente Lista Dinâmica. Para isso utilize a função: Alterar Valor da Lista Dinâmica.
 */
function searchFormByGUIDChangeComponentValueOtherForm(currentForm,GUID){
  if (currentForm && currentForm.formGUID == GUID){
    return currentForm;
  }

  if (currentForm && currentForm.mainform && currentForm.mainform.formGUID == GUID){
    return currentForm.mainform;
  }
  if (currentForm.children){
    for (var i=0;i<currentForm.children.length;i++){
      try {
        if (currentForm.children[i].mainform){
          if (currentForm.children[i].mainform.formGUID == GUID){
            return currentForm.children[i].mainform;
          }
          var returnForm = searchFormByGUIDChangeComponentValueOtherForm(currentForm.children[i],GUID);
          if (returnForm){
            return returnForm;
          }
        }
      }catch(e){}
    }
  }
}

function ebfChangeComponentValueOtherForm(form, com, value){
  if (isNull(form)) {
    throw 'Defina um formulário para alterar o valor de um componente!';
  }
  var mainWindow = $mainform();

  while(getOpenerWindow(mainWindow) != null){
    mainWindow = getOpenerWindow(mainWindow);

  }//encontra a janela principal do Sistema

  //procura o formulário usando o GUID passado
  var myForm = searchFormByGUIDChangeComponentValueOtherForm(mainWindow,form);

  //verifica se o formulário foi encontrado
  if(myForm){
    // obtem o componente
    var component = myForm.controller.getElementById(com);
    if (!isNull(component)){
      component.setValue(value, true, false);
    }else{
      component = myForm.controller.getElementById(com, form);
      if (isNull(component)) {
        throw 'Componente não encontrado para o formulário escolhido!';
      }
      component.setValue(value, true, false);
    }
  }else{
    throw 'O Formulário cujo componente se deseja alterar não está aberto!';
  }
}

/**
 * Muda a descrição do componente escolhido no primeiro parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Componente<br/>
 * 2. Nova Descrição.<br/>
 * <br/>
 * Retorno<br/>
 * Não possui.
 */
function ebfChangeDescription(c, d) {
  $c(c).setDescription(d);  
}

/**
 * Altera o conteúdo da barra de status<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Conteúdo para a barra de status<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observações:<br/>
 * 1. No Browser Firefox é preciso marcar a opção "MODIFICAR TEXTO NA BARRA DE <br/>
 * STATUS" no caminho abaixo:<br/>
 *   I.   FERRAMENTAS<br/>
 *   II.  OPÇÕES<br/>
 *   III. CONTEÚDO<br/>
 *   IV.  BOTÃO AVANÇADO<br/>
 * <br/>
 * 2. No Browser Internet Explorer verifique se está habilitado o recurso de atualizações da barra de status.<br/>
 * Caminho:<br/>
 *   I. FERRAMENTAS<br/>
 *   II. OPÇÕES<br/>
 *   III.  ABA SEGURANÇA<br/>
 *   IV.  NÍVEL PERSONALIZADO<br/>
 *   V.  "PERMITIR ATUALIZAÇÕES DA BARRA DE STATUS VIA SCRIPT"
 */
function ebfChangeWindowStatusBar(text){
  // Caso o texto passado como parâmetro seja nulo, a barra de status não é modificada
  if (text == null){
    return;
  } else {
    $mainframe().sbtext = text;
  }
}

/**
 * Esta função localiza, dentro do primeiro parâmetro, o conteúdo que está na posição passada no 2º parâmetro e o retorna.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Texto onde será feita a pesquisa<br/>
 * 2.  Posição da letra.<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna qual a letra que está na posição que foi passado por parâmetro.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1-Assumindo os parâmetros como "Maker Flow" (Letras) e 4 (Inteiro) , o retorno seria "e".<br/>
 * 2. Assumindo os parâmetros como "Hoje é Segunda-Feira" (Letras) e "8" (Inteiro) , o retorno seria "S" .
 */
function ebfCharAt() {
  var retorno = "";
  if (existArgs(arguments)) {
    var value = arguments[0].toString();
    var length = value.length;
    var indice = parseInt(arguments[1]) - 1;
    if (indice < 0) {
      indice = 0;
    } else if (indice >= length) {
      indice = length - 1;
    }
    try {
      retorno = value.charAt(indice);
    } catch (ex) {
    }
  }
  return retorno;
}

/**
 * Função que cria um novo objeto CheckBox dinâmicamente.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Aba (caso não seja definida, a aba será criada).<br/>
 * 2. Posição X.<br/>
 * 3. Posição Y.<br/>
 * 4. Largura do Componente.<br/>
 * 5. Altura do Componente.<br/>
 * 6. Descrição do Componente.<br/>
 * 7. Valor do Componente<br/>
 * 8. Valor Marcado<br/>
 * 9. Valor Desmarcado<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function ebfCheckBoxNew(aba, x,y,width,height,description,value,valueChecked,valueUnchecked){
  var code = getCodComponent();
  var component = new HTMLCheckbox(ebfGetSystemID(),ebfGetFormID(),code, x, y, width, height, description, value, valueChecked, valueUnchecked);
  component.id = description;
  component.zindex = 3;
  component.loadComponentTime = 0;
  var container = $mainform().d.t.getTabByName(aba);
  if(!container){
     d.t.add(aba);
     container = $mainform().d.t.getTabByName(aba);
  } 
  component.design(container.div, true);
  document['c_' + code] = component;
}

/**
 * Converte o caractere passado por parâmetro para código ASCII.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Caractere do qual se deseja obter o código ASCII.<br/>
 * <br/>
 * Retorno:<br/>
 * Código ASCII do caractere passado por parâmetro.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1-Assumindo o parâmetro como "d" o retorno será  100.<br/>
 * <br/>
 * Observação:<br/>
 * A Tabela ASCII (American Standard Code for Information Interchange) é usada pela maior parte das industrias de computadores para a troca de informações. Cada caractere é representado por um código de 8 bits(um byte).
 */
function ebfChrToAscii(achar){
  if (isNullable(achar)) {
    return null;
  } else {
    return (achar.charCodeAt(0));
  }
}

/**
 * Essa função é utilizada para fechar o formulário que chama o fluxo.<br/>
 * <br/>
 * Parâmetros: <br/>
 * Não Possui.<br/>
 * <br/>
 * Retorno: <br/>
 * Não Possui.<br/>
 * <br/>
 * Exemplos:<br/>
 * Quando essa função for chamada em um formulário, o mesmo será fechado.<br/>
 * <br/>
 * Observação: <br/>
 * Não é necessário passar o nome do formulário. O formulário sempre vai ser o que chama o fluxo.
 */
function ebfCloseForm() {
    $mainform().d.n.actExit();
}

/**
 * Fecha todos os fomulários que foram utilizados para abrir o formulário atual.<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não possui.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observações:<br/>
 * 1. Não fecha o formulário principal.
 */
function ebfCloseMasterForm() {
  try {
    if ($mainform().getOpenerWindow(top)) {
      $mainform().getOpenerWindow(top).close();
    }
    $mainform().d.n.actExit();
  } catch (ex) {}
}

/**
 * Fecha a Janela que abriu a janela corrente. (Formulário pai)<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não possui.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function ebfCloseOpenerWindow() {

  var openerWindow = $mainform().getOpenerWindow(top);
  
  if (openerWindow) {
    openerWindow.closeParents = function() {}
  
    if (openerWindow.top) {
      openerWindow.top.closeParents = function() {}
      openerWindow.top.close();
    }
  }
}

/**
 * Cria um novo componente Lista de forma dinâmica.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Aba (Caso não seja definida, a aba será criada).<br/>
 * 2. Posição X no formulário.<br/>
 * 3. Posição Y no formulário.<br/>
 * 4. Largura do componente.<br/>
 * 5. Altura do componente.<br/>
 * 6. Descrição do Componente.<br/>
 * 7. Lista de valores. (Campo Chave)<br/>
 * 8. Lista de descrição a ser exibido. (Campo Lista)<br/>
 * <br/>
 * Retorno:<br/>
 * Não Possui.<br/>
 * <br/>
 * Observações:<br/>
 * As listas podem conter um ou mais elementos, e irão se referenciar uma com a outra de acordo com a posição delas na lista.
 */
function ebfComboBoxNew(aba, x, y, width, height, description, keys, values){
  var code = getCodComponent();
  var component = new HTMLComboBox(ebfGetSystemID(),ebfGetFormID(),code, x, y, width, height, description);
  if (!isNullable(keys) && !isNullable(values)) {
    if (keys instanceof Array && values instanceof Array) {
      component.values = values;
      component.keys = keys;
    } else {
      component.values = [values];
      component.keys = [keys];
    }
  } else {
    component.values = [];
    component.keys = [];
  }  
  component.id = description;
  component.zindex = 3;
  component.loadComponentTime = 0;
  var container = $mainform().d.t.getTabByName(aba);
  if(!container){
     d.t.add(aba);
     container = $mainform().d.t.getTabByName(aba);
  } 
  component.design(container.div, true);
  document['c_' + code] = component;
}

/**
 * Essa função remove todos os elementos do componente Lista. Passando como parâmetro a componente Lista.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome do componente Lista<br/>
 * <br/>
 * Retorno: <br/>
 * O retorno será os elementos da Lista apagadas.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo o 1º parâmetro: Carros(Lista) contendo os elementos 1 - Usado e 2 - Novo, sendo 1 e 2 o valor chave e <br/>
 * "Usado e Novo" o valor que representam o valor chave. O retorno será a lista Carros com os elementos removidos.
 */
function ebfComboClean(obj) {
  obj = controller.verifyComponent(obj);
  if (obj && obj.clean) {
    obj.clean();
  }
}

/**
 * Essa função Insere um elemento no componente Lista. Passando como parâmetro o componente Lista, o valor chave <br/>
 * (que será o valor à ser salvo no banco) e o valor que representará o valor chave.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome do componente Lista<br/>
 * 2. Valor Chave<br/>
 * 3. Valor que representará a chave<br/>
 * <br/>
 * Retorno: <br/>
 * O retorno será o valor inserido no componente Lista<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo o 1º parâmetro: Carros(Lista) contendo os elementos 1 - Usado e 2 - Novo, sendo 1 e 2 o valor chave e <br/>
 * "Usado e Novo" o valor que representam o valor chave. O 2º parâmetro sendo 3 e o 3º parâmetro sendo "Quebrado".<br/>
 * O retorno será a lista Carros contendo os elementos 1 - Usado, 2 - Novo e 3 - Quebrado.
 */
function ebfComboPut(obj, key, value) {
  obj = controller.verifyComponent(obj);
  if (obj && obj.add) {
    obj.add(key, value);
  }
}

/**
 * Esta função associa um evento no padrão W3C ( DOM Events Specification ) ao componente.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Componente cujo evento será associado.<br/>
 * 2. Descrição do evento.<br/>
 * 3. Fluxo que será executado quando o evento ocorrer.<br/>
 * 4. Lista com os parâmetros a serem passados para o fluxo.<br/>
 * <br/>
 * Retorno: <br/>
 * Esta função não possui retorno<br/>
 * <br/>
 * Observações:<br/>
 * 1. Caso o componente passado no primeiro parâmetro seja nulo, o evento é associado ao formulário.<br/>
 * 2. O fluxo que será associado ao comonente deve obrigatoriamente ser do tipo cliente.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Caso um fluxo de nome "Observador de eventos" precise ser chamado sempre que o usuário passar o mouse sobre um componente Texto chamado "MakerLabel1", a função ficaria:<br/>
 *    1º PARÂMETRO: MakerLabel1 (Componente);<br/>
 *    2º PARÂMETRO: onmouseover (Letras);<br/>
 *    3º PARÂMETRO: Observador de eventos (Letras);<br/>
 *    4º PARÂMETRO: nulo;
 */
var DOMEvent = new Array();

function ebfComponentEventAssociate(componente,evento,rule, ruleParams) {
     
     // Testa se o objeto é nulo e associa o evento ao formulário
     componente = controller.verifyComponent(componente);
          
     if(componente == null) { 
       componenteStr = $mainform().d;
     } else {
       componenteStr = componente.div;
     }
     
     // Testa se o parâmetro do fluxo a ser executado é nulo
     if (typeof(ruleParams) == 'undefined' || ruleParams == null) {
            ruleParams = '';
     }
     
     // Remove o 'on' do evento
     var startsWithOn = /^on(.+)/;
     var found = evento.match(startsWithOn);
     if (found != null && found != -1)
       evento = RegExp.$1;
       
     // Formata o nome do fluxo e define algumas variáveis
     var _ruleName = rule;
     var _params = ruleParams;
     var _sys = sysCode;
     var _formID = idForm;
     
     var func = function() {
       executeJSRuleNoField(_sys, _formID, _ruleName, _params);
     }
     
     DOMEvent[evento] = func;
     
     // Associa ao objeto
     addEvent(componenteStr,evento,func,true);
     componente.onclick = function() {};
     componente.setEnabled(true);
}

/**
 * Esta função remove um evento no padrão W3C ( DOM Events Specification ) associado ao componente através da <br/>
 * função Associar Evento ao componente.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Componente cujo evento foi associado (nulo caso o evento seja o formulário).<br/>
 * 2. Descrição do evento.<br/>
 * 3. Fluxo que é executado quando o evento ocorre.<br/>
 * 4. Lista com os parâmetros que são passados ao fluxo.<br/>
 * <br/>
 * Retorno: <br/>
 * Esta função não possui retorno
 */
function ebfComponentEventRemove(componente,evento,rule, ruleParams) {
     
     // Testa se o objeto é nulo e associa o evento ao formulário
     componente = controller.verifyComponent(componente);
     
     if(componente == null) { 
       componente = $mainform().d;
     } else {
       componente = componente.div;
     }
     
     // Remove o 'on' do evento
     var startsWithOn = /^on(.+)/;
     var found = evento.match(startsWithOn);
     if (found != null && found != -1)
       evento = RegExp.$1;
     
     // Remove o objeto
     removeEvent(componente,evento,DOMEvent[evento],true);
}

/**
 * Altera a máscara de um componente.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário que contém o componente<br/>
 * 2. Nome do componente<br/>
 * 3. Nova máscara<br/>
 * 4. Tipo da máscara (Letras, Número ou Data)<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function repeatValueUntilSize(s, size) {
  var r = "";
  for (var i = 1; i <= size; i++) {
    r += s;
  }
  return r;
}
function convertToJsMask(m, type) {
  var r = "";
  if (type != "Data" && m != null && m.length > 0) {
    r = m;
    if (type == "Número") {
      r = r.replace(/\\\\/g, "");
      r = r.replace(/;0/g, "");
      r = r.replace(/;1/g, "");
      r = r.replace(/\\!/g, "");
      r = trim(r);
      var li = r.lastIndexOf(".");
      var nm = "#,###";
      if (m.indexOf(",") == -1) {
        nm = "#";
      }
      if (li != -1) {
        nm += ".";
        nm += repeatValueUntilSize("0", r.substring(li + 1, r.length).length);
      }
      r = nm;
    } else {
      r = r.replace(/\\\\0/g, "Z");
      r = r.replace(/\\\\9/g, "N");
      r = r.replace(/\\\\/g, "");
      r = r.replace(/\\/g, "");
      r = r.replace(/;0/g, "");
      r = r.replace(/;1/g, "");
      r = r.replace(/!/g, "");
      r = r.replace(/0/g, "#");
      r = r.replace(/9/g, "#");
      r = r.replace(/Z/g, "0");
      r = r.replace(/N/g, "9");
      r = trim(r);
    }
  }
  return r;
}
function ebfComponentSetMask(formGUID, componentName, mask, type) {
  var component = $c(componentName, formGUID);
  if (component) {
    if (type == 'Data') {
      component.dateMask = convertToJsMask(mask, "date");
    } else if (type == 'Número') {
      component.numberMask = convertToJsMask(mask, "number");
    } else {
      component.textMask = convertToJsMask(mask, "string");
    }
    if (component.maskSuport) {
      component.designMask();
      component.attachEvent(component.input, 'keypress', component.keypressAction);
      component.attachEvent(component.input, 'keyup', component.keyupAction);
      if (component.getValue().length > 0) {
        component.mask.allowPartial = true;
        component.setValue(component.mask.format(component.getValue()));
        component.mask.allowPartial = false;
      }
    }  
  }
}

/**
 * Junta vários itens de texto em apenas um item.<br/>
 * <br/>
 * Parâmetros:<br/>
 * n. Valor a ser concatenado.<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna os valores concatenados (Letras).<br/>
 * <br/>
 * Exemplos: <br/>
 * 1.Assumindo os parâmetros como 'Maker'(Letras) e 'Flow'(Letras), o retorno seria 'Maker Flow'.<br/>
 * 2.Assumindo os parâmetros como 'Maker'(Letras) e 3(inteiro), o retorno seria 'Maker3'.
 */
function ebfConcat() {
  var value = "";
  if (existArgs(arguments)) {
    for (var i = 0; i < arguments.length; i++) {
      if(arguments[i] == null) arguments[i] = '';
      var temp = arguments[i].toString();
      value += temp;
    }
  }
  return value;
}

/**
 * É passado um parâmetro que será um texto, onde esse será confirmado ou negado conforme a escolha do usuário.<br/>
 * Essa função abre uma caixa com opções "Ok" ou "Cancel".<br/>
 * Ao clicar em "Ok" usuário confirmará uma operação retornando verdadeiro,  ou cancelará a mesma retornando falso.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Texto que servirá para interagir com o usuário.<br/>
 * <br/>
 * Retorno:<br/>
 * Se o usuário clicar em "OK" retorna verdadeiro (Lógico), se clicar em "Cancel", retorna falso.<br/>
 * <br/>
 * Exemplos:<br/>
 * 1. Passando como parâmetro "Confirmar operação?", o resultado será uma caixa de diálogo com os botões "OK" e "Cancel". Se o usuário clicar "Ok" o retorno será verdadeiro, caso contrário, será falso.
 */
function ebfConfirm (src) {
  return window.confirm(src);
}

/**
 * Recebe um componente memo e transforma em texto rico.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário onde está localizado o componente Memo.<br/>
 * 2. Componente memo.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function ebfConvertRichText(form, componentName) {
  var c = $c(componentName, form);

  if (c) {
    window.tinyMCE_GZ = {loaded: true};

    webrun.include("components/tiny_mce/tiny_mce_src.js");
    
    tinymce.documentBaseURL = window.location.href.replace(/[\?#].*$/,  '').replace(/[\/\\][^\/]+$/, '');

    if (!/[\/\\]$/.test(tinymce.documentBaseURL))
      tinymce.documentBaseURL += '/';

    tinymce.documentBaseURL += 'components/tiny_mce/' ; 
    tinymce.baseURL = new   tinymce.util.URI(tinymce.documentBaseURL).toAbsolute(tinymce.documentBaseURL);
    tinymce.EditorManager.baseURI = new   tinymce.util.URI(tinymce.baseURL);
    tinymce.EditorManager.baseURI = new   tinymce.util.URI(tinymce.baseURL);
    tinymce.dom.Event.domLoaded = true;
    
    tinyMCE.init({ mode : "none", theme : "advanced",
      theme_advanced_buttons1_add : ",|,bullist,numlist", 
      theme_advanced_buttons2_add : ",|,preview,hr,removeformat,visualaid,|,sub,sup,|,charmap",
      theme_advanced_buttons3 : "",
      theme_advanced_toolbar_location : "top", theme_advanced_disable : "help"
    });
    
    c.input.id = c.input.name;
  
    var name = c.input.name;

    var oldSetValue = c.setValue;

    c.setValue = function() {

      tinyMCE.get(name).setContent(arguments[0]);
      oldSetValue.apply(this, arguments);

    }  

    c.getValue = function() {
      return tinyMCE.get(name).getContent();
    }        
  
    tinyMCE.execCommand('mceAddControl', true, c.input.name);
    
    
  }
  
 }

/**
 * Essa função converte um Componente "Caixa de Texto" para um componente "Caixa de Texto" do tipo Arquivo.<br/>
 * Através dela você poderá selecionar um arquivo do sistema.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Componente do tipo texto que será convertido em um do tipo arquivo.<br/>
 * 2. Quantidade de caracteres (aproximados) que aparecerão. O Firefox 3 necessita dessa propriedade para alterar a largura.<br/>
 * <br/>
 * Exemplos: <br/>
 * Assumindo que um Componente do tipo Texto no formulário. O uso desta converterá o Componente em um do tipo arquivo.<br/>
 * <br/>
 * Observações:<br/>
 * 1. O componente não pode estar relacionado a um campo do banco de dados.<br/>
 * 2. O navegador Mozilla FireFox, por questões de segurânça, não permite que todo o caminho do arquivo seja retornado,<br/>
 * apenas o nome do arquivo e a extensão.<br/>
 * 3. O navegdaor Chrome não permite a alteração para o tipo arquivo.
 */
function ebfConverterInputTextInFile(field, size) {
  var componente = $c(field);                 
  if (componente) {
    try {
      componente.input.type = 'file';
      if (size) {
        componente.input.setAttribute("size", size);
      }
    } catch (Exception) {
      var inputNovo = document.createElement('input');
      inputNovo.type = 'file';
      inputNovo.className = componente.input.className;
      if (size) {
        inputNovo.setAttribute("size", size);
      } else {
        inputNovo.style.width = componente.input.style.width;
        inputNovo.style.height = componente.input.style.height;
      }
      inputNovo.name = componente.input.name;
      inputNovo.id = componente.input.id;
      componente.context.removeChild(componente.input);   
      componente.context.appendChild(inputNovo);
      componente.input = inputNovo;
    }
  }
}

/**
 * Cria uma data a partir da passagem do ano, mês, dia, hora, minuto e segundo.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Ano<br/>
 * 2. Mês<br/>
 * 3. Dia<br/>
 * 4. Hora (De 0 a 23)<br/>
 * 5. Minuto (De 0 a 59)<br/>
 * 6. Segundo (De 0 a 59)<br/>
 * <br/>
 * Retorno:<br/>
 * Retorna a data criada.<br/>
 * <br/>
 * Exemplos:<br/>
 * 1. Criar Data(2007,5,11,11,5,20)<br/>
 *     Retorno "11/05/2007 11:05:20"
 */
function ebfCreateDate(year,month,day,hour,minute,second){
  // Cria uma nova data
  var date = new Date();
  // Altera os valores da data
  date.setYear(year);
  date.setMonth(month - 1);
  date.setDate(day);
  date.setHours(hour);
  date.setMinutes(minute);
  date.setSeconds(second);
  // Retorna a data
  return date;
}

/**
 * Cria uma árvore na aba passada por parâmetro, na posição e tamanho especificados.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome da Árvore.<br/>
 * 2. Nome da aba do formulário onde será adicionada a árvore.<br/>
 * 3. Posição x.<br/>
 * 4. Posição y<br/>
 * 5. Tamanho<br/>
 * 6. Altura<br/>
 * <br/>
 * Retorno: <br/>
 * Árvore Criada. (Variante)<br/>
 * <br/>
 * Exemplos: <br/>
 * 1.Assumindo os parâmetros como "Projetos" (Letras), "Visualização" (Letras) , 100(Inteiro), 100(Inteiro), 250(Inteiro) e 250(Inteiro), será criada uma árvore de nome "projetos", na aba "Visualização" do formulário, na posição x=100 e y=100, com 250 de tamanho e de altura.<br/>
 * Observação: É obrigatorio a existência de pelo menos um componente no formulário no qual será criada a árvore.
 */
function getCodComponent (){
  var components = $mainform().controller.getTabElements(parent.mainform.d.t);
  var max_cod = 0;
  for(var i = 0; i < components.length; i++) { 
    max_cod = Math.max(max_cod, components[i].getCode());
  }
  return max_cod + 1;
}
function ebfCreateTreeView(value, tab, posx, posy, width, height){	
  var code = getCodComponent();
  tree = new HTMLTreeview(sysCode,idForm,code,posx,posy,width,height,value);
  tree.design(mainform.d.t.getDiv(tab), true);
  tree.show();	
  return tree;	
}

/**
 * Obtém o idioma que está sendo utilizado no momento.<br/>
 * <br/>
 * Retorno:<br/>
 * Retorna o idioma da aplicação.<br/>
 * <br/>
 * Exemplos:<br/>
 * Caso o idioma corrente que esteja sendo utilizado for o inglês, então a função retornará o valor: "en_US"
 */
function ebfCurrentLanguage() {
  return resources_locale;
}

/**
 * Essa função retira as horas da data, retornando apenas a Data com as horas zeradas.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Data com Hora<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna a data com as horas zeradas.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo que o 1º parâmetro seja 23/09/2008 23: 30: 00. O retorno será 23/09/2008 00:00:00.<br/>
 * 2. Assumindo que o 1º parâmetro seja 10/12/1998 11: 52: 25. O retorno será 10/12/1998 00:00:00.
 */
function ebfDateDate() {
  var data = null;
  if (existArgs(arguments)) {
    var temp = toDate(arguments[0]);
    temp.setHours(0);
    temp.setMinutes(0);
    temp.setSeconds(0);
    temp.setMilliseconds(0);
    data = temp;
  }
  return data;
}

/**
 * Essa função obtém o dia da data passada como parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Data de onde será obtido o dia<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna o dia a partir de uma data.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo que o 1º parâmetro seja 23/09/2008. O retorno será 23.<br/>
 * 2. Assumindo que o 1º parâmetro seja 10/12/1998. O retorno será 10.<br/>
 * 3. Assumindo que o 1º parâmetro seja o retorno da função "hoje", o retorno será o dia atual
 */
function ebfDateDay() {
  var value = 0;
  if (existArgs(arguments)) {
    var data = toDate(arguments[0]);
    if (data) {
      value = data.getDate();
    }
  }
  return value;
}

/**
 * Essa função calcula a diferença de dias (levando em consideração as horas) entre as datas passadas por parâmetros.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Primeira Data<br/>
 * 2. Segunda Data<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna a diferença de dias da data do 1º parâmetro com a data do 2º parâmetro.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo que o 1º parâmetro seja 09/02/2005 00:00:00 e o 2º parâmetro 11/03/2005 00:00:00. O retorno será -30.<br/>
 * 2. Assumindo que o 1º parâmetro seja 11/03/2004 00:00:00 e o 2º parâmetro 09/02/2004  00:00:00. O retorno será 30.
 */
function ebfDateDayDifference() {
  var result = 0;
  if (existArgs(arguments)) {
    var data1 = toDate(arguments[0]);
    var data2 = toDate(arguments[1]);
    if (data1 != null && data2 != null) {
      var diff = data1.getTime() - data2.getTime();
      /**
       * 86400000 ms = 1 dia em ms
       */
      result = diff / 86400000;
    }
  }
  return result;
}

/**
 * Essa função obtém as horas a partir da data.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Data que deseja extrair as horas<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna a hora extraída da data. O retorno pode ser atribuído a uma variável do tipo Inteiro.<br/>
 * <br/>
 * Observações: <br/>
 * Se no primeiro parâmetro for passada uma data sem as horas, a função retornará o valor 0(zero).<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo que o 1º parâmetro seja 22/08/2008 18: 30: 02. O retorno será 18.
 */
function ebfDateHour() {
  var hora = -1;
  if (existArgs(arguments)) {
    var data = toDate(arguments[0]);
    if (data) {
      hora = data.getHours();
    }
  }
  return hora;
}

/**
 * Essa função incrementa o dia de uma data passada por parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Data que deseja incrementar o dia<br/>
 * 2. Valor a ser incrementado no dia<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna a data com o dia incrementado.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo que o 1º parâmetro seja 22/09/2008 e o 2º parâmetro seja 2 . O retorno será 24/09/2008.
 */
function ebfDateIncDay() {
  var data = null;
  if (existArgs(arguments)) {
    data = toDate(arguments[0]);
    var value = arguments[1];
    if (data) {
      data.incDay(value ? value : 0);
    }
  }
  return data;
}

/**
 * Essa função incrementa o mês de uma data passada por parâmetro.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Data que deseja incrementar o mês<br/>
 * 2. Valor a ser incrementado no mês<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna a data com o mês incrementado. O retorno pode ser atribuído a uma variável do tipo data.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo que o 1º parâmetro seja 05/08/2005 e o 2º parâmetro seja 2 . O retorno será 05/10/2005.
 */
function ebfDateIncMonth() {
  var data = null;
  if (existArgs(arguments)) {
    data = toDate(arguments[0]);
    var value = arguments[1];
    if (data) {
      data.incMonth(value ? value : 0);
    }
  }
  return data;
}

/**
 * Essa função incrementa o ano de uma data passada por parâmetro.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Data que deseja incrementar o ano<br/>
 * 2. Valor a ser incrementado no ano<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna a data com o ano incrementado. O retorno pode ser atribuído a uma variável do tipo data.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo que o 1º parâmetro seja 22/08/2008 e o 2º parâmetro seja 2 . O retorno será 22/08/2010.
 */
function ebfDateIncYear() {
  var data = null;
  if (existArgs(arguments)) {
    data = toDate(arguments[0]);
    var value = arguments[1];
    if (data) {
      data.incYear(value ? value : 0);
    }
  }
  return data;
}

/**
 * Essa função obtém os minutos de uma data passada por parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Data que será extraído os minutos<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna os minutos da data passada por parâmetro. O retorno pode ser atribuído a uma variável do tipo inteiro.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo que o 1º parâmetro seja 02/11/2010 12: 53: 26. O retorno será 53.<br/>
 * <br/>
 * Observações: <br/>
 * Se no primeiro parâmetro for passada uma data sem os minutos, a função retornará o valor 0(zero).
 */
function ebfDateMinute() {
  var minute = -1;
  if (existArgs(arguments)) {
    var data = toDate(arguments[0]);
    if (data != null) {
      minute = data.getMinutes();
    }
  }
  return minute;
}

/**
 * Essa função obtém o mês de uma data passada por parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Data que deseja extrair o mês<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna o mês da data. O retorno pode ser atribuído a uma variável do tipo inteiro.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo que o 1º parâmetro seja 22/09/2008. O retorno será 9.<br/>
 * 2  Assumindo que o 1º parâmetro seja o retorno da função "hoje", o retorno será o mês atual
 */
function ebfDateMonth() {
  var value = 0;
  if (existArgs(arguments)) {
    var data = toDate(arguments[0]);
    if (data) {
      value = data.getMonth() + 1;
    }
  }
  return value;
}

/**
 * Essa função calcula a diferença de meses entre as datas passadas por parâmetros.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Primeira Data<br/>
 * 2. Segunda Data<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna a diferença de meses da data do 1º parâmetro com a data do 2º parâmetro. O retorno pode ser atribuído a uma variável do tipo inteiro.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo que o 1º parâmetro seja 09/02/2005 e o 2º parâmetro 11/03/2005. O retorno será -1.<br/>
 * 2. Assumindo que o 1º parâmetro seja 11/03/2004 e o 2º parâmetro 09/02/2004. O retorno será 30.
 */
function ebfDateMonthDifference() {
  var monthDiff = 0;
  if (existArgs(arguments)) {
    var data1 = toDate(arguments[0]);
    var data2 = toDate(arguments[1]);
    if (data1 != null && data2 != null) {
      var yearDiff = data1.getFullYear() - data2.getFullYear();
      monthDiff = (yearDiff * 12) + data1.getMonth() - data2.getMonth();        
      if (data2.compareTo(data1) == -1) {
        if (data1.getDate() < data2.getDate()) {
      	  monthDiff--;      	
        }
      } else {
        if (data1.getDate() > data2.getDate()) {
          monthDiff++;
        }
      }
    }
  }
  return monthDiff;
}

/**
 * Essa função obtém os segundos de uma data passada por parâmetro.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Data que será extraído os segundos<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna os segundos da data passada por parâmetro. O retorno pode ser atribuído a uma variável do tipo inteiro.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo que o 1º parâmetro seja 02/11/2010 11: 58: 26. O retorno será 26.<br/>
 * <br/>
 * Observações: <br/>
 * Se no primeiro parâmetro for passada uma data sem os segundos, a função retornará o valor 0(zero).
 */
function ebfDateSecond() {
  var second = -1;
  if (existArgs(arguments)) {
    var data = toDate(arguments[0]);
    if (data != null) {
      second = data.getSeconds();
    }
  }
  return second;
}

/**
 * Incrementa a hora, minuto ou segundo de um tipo Hora.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Hora que será incrementada. (Hora)<br/>
 * 2. Quantidade a ser incrementada.<br/>
 * 3. Qual parte da hora deve ser incrementada. Use H para hora, M para minuto e S para segundo.<br/>
 * <br/>
 * Retorno: <br/>
 * Hora incrementada.
 */
function ebfDateSumHour(date, value, type) {
	  if(date.getHours) {
	    var time = new Time();
	    date = time.fromDate(date);
	  }
	  
	  switch (type) {
	    case 'H': {
	      date.incHour(value);
	      break;
	    }
	    
	    case 'M': {
	      date.incMinute(value);
	      break;
	    }
	    
	    case 'S': {
	      date.incSecond(value);
	      break;
	    }
	  }
	  
	  return date.getDate();
}

/**
 * Essa função obtém a data atual e retorna.<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não possui.<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna a data atual com as horas.<br/>
 * <br/>
 * Observações:<br/>
 * 1. Ao utilizar a função em um fluxo na camada Servidor, a hora retornada será a definida no relógio do servidor de aplicações (Webrun).<br/>
 * 2. Ao utilizar a função em um fluxo na camada Cliente, a hora retornada será a definida no relógio do cliente (não confiável).<br/>
 * 3. Ao utilizar a função em um fluxo na camada Banco de Dados, a hora retornada será a definida no relógio do servidor de banco de dados.
 */
function ebfDateToday() {
  return new Date();
}

/**
 * Essa função obtém o ano a partir de uma data passada por parâmetro.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Data de onde será obtido o ano.<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna o ano da data passada por parâmetro.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo que o 1º parâmetro seja 05/08/2008. O retorno será 2008.<br/>
 * 2. Assumindo que o 1º parâmetro seja 29/12/2004. O retorno será 2004.<br/>
 * 3. Assumindo que o 1º parâmetro seja o retorno da função "hoje", o retorno será o ano atual
 */
function ebfDateYear() {
  var value = 0;
  if (existArgs(arguments)) {
    var data = toDate(arguments[0]);
    if (data) {
      value = data.getFullYear();
    }
  }
  return value;
}

/**
 * Essa função calcula a diferença de anos entre as datas passadas por parâmetros.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Primeira Data<br/>
 * 2. Segunda Data<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna a diferença de anos da data do 1º parâmetro com a data do 2º parâmetro.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo que o 1º parâmetro seja 23/12/2009 e o 2º parâmetro 02/02/2007. O retorno será 2, pois (2009 - 2007 = 2).<br/>
 * 2. Assumindo que o 1º parâmetro seja 18/05/2004 e o 2º parâmetro 28/01/2007. O retorno será -3, pois (2004 - 2007 = -3).
 */
function ebfDateYearDifference() {
  var diff = 0;
  if (existArgs(arguments)) {
    var data1 = toDate(arguments[0]);
    var data2 = toDate(arguments[1]);
    if (data1 != null && data2 != null) {
      diff = data1.getFullYear() - data2.getFullYear();    
      if (data2.compareTo(data1) == -1) {
        if (data2.getMonth() > data1.getMonth()){
          diff--;
        } else if(data2.getMonth() == data1.getMonth){
          if(data2.getDate() > data1.getDate()){
            diff--;
          }	
        }
      } else {
        if(data2.getMonth() < data1.getMonth()){
          diff++;
        } else if(data2.getMonth() == data1.getMonth()){
          if (data2.getDate() < data1.getDate()) {
      	    diff++;
      	  }
        }
      }
    }
  }
  return diff;
}

/**
 * Converte a cor para o formato RGB.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Cor, exemplo clBlue. <br/>
 * <br/>
 * Retorno:<br/>
 * Cor em RGB.<br/>
 * <br/>
 * Observações:<br/>
 * O formato RGB é uma forma utilizada para se reproduzir diversas cores através das cores básicas iniciais:<br/>
 * vermelho (Red), verde (Green) e azul (Blue). Em computação utiliza-se muito esse padrão para se definir uma cor<br/>
 * a ser mostrada na tela, se representa a cor RGB em números tendo cada cor, vermelho (R), verde (G) e azul (B) 256 combinações possíveis de 0 a 255 sendo 0 a ausência de dessa cor e 255 a sua plenitude. <br/>
 * Sendo Representado da seguinte forma:<br/>
 *       - Branco como é o conjunto de todas as cores sendo representado como 255 255 255.<br/>
 *       - Preto como sendo a ausência de cores sendo representado com  0 0 0.<br/>
 *       - Vermelho, representado como 255 0 0.<br/>
 *       - Verde,  representado como 0 255 0.<br/>
 *       - Azul representado como  0 0 255.<br/>
 * <br/>
 * Exemplos:<br/>
 * 1.Assumindo como parâmetro "clGreen", o retorno será #008000.<br/>
 * 2.Assumindo como parâmetro "clPurple", o retorno será "#800080".
 */
function ebfDelphiColorToRGB(value) 
{
    if (value == "clNone") return "";
    if (value == "clAqua") return "#33FFFF";
    if (value == "clBlack") return "#000000";
    if (value == "clBlue") return "#0000FF";
    if (value == "clCream") return "#FFFBF0";
    if (value == "clFuchsia") return "#FF00FF";
    if (value == "clGray") return "#808080";
    if (value == "clGreen") return "#008000";
    if (value == "clLime") return "#00FF00";
    if (value == "clMaroon") return "#800000";
    if (value == "clMedGray") return "#A0A0A4";
    if (value == "clMoneyGreen") return "#C0DCC0";
    if (value == "clNavy") return "#000080";
    if (value == "clOlive") return "#808000";
    if (value == "clPurple") return "#800080";
    if (value == "clRed") return "#FF0000";
    if (value == "clSilver") return "#C0C0C0";
    if (value == "clSkyBlue") return "#A6CAF0";
    if (value == "clTeal") return "#008080";
    if (value == "clWhite") return "#FFFFFF";
    if (value == "clYellow") return "#FFFF00";
    value = parseInt(value);
    if (value < 0) 
    { 
      value += 33554426;
    }
    var r = "#";
    r += ebfIntToHex(0x00FF & value, 2);      //R
    r += ebfIntToHex(0x00FF & value >>  8, 2); //G
    r += ebfIntToHex(0x00FF & value >> 16, 2);//B
    return r;
}

/**
 * Retorna o valor do texto no formato Java, a partir de um texto no formato Delphi mudando os caracteres especiais que são usados nas linguagens.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Texto Delphi.<br/>
 * <br/>
 * Retorno:<br/>
 * Texto JAVA.<br/>
 * <br/>
 * Exemplo: <br/>
 * Assumindo como parâmetro o texto binário barra invertida + aspas simples, o retorno será .
 */
function ebfDelphiStringToJavaString(delphiString) {
  return delphiStringToJavaString(delphiString);
}

/**
 * Essa função destrói o componente retirando o mesmo da memória.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Nome do Componente<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observação:<br/>
 * 1. O componente destruído não mais poderá ser referenciado.
 */
function ebfDestroyComponent(componente) {

  var component = $c(componente);
   
      component.free();

}

/**
 * Utilizada para fazer o download de um arquivo passando o endereço do mesmo.<br/>
 * <br/>
 * O caminho deve ser relativo ao diretório do deploy webrun, e deve começar por "tmp/" ou "download/" ou "upload/" ou "downloads/" ou "uploads<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. URL do arquivo que será baixado.<br/>
 * 2. Indica se deve ser exibido uma mensagem informativa, com o link do arquivo.<br/>
 *     Se for verdadeiro aparecerá uma mensagem informando o endereço do arquivo, e iniciará o download.<br/>
 *     Se for falso apenas iniciará o download do arquivo.
 */
function ebfDonwloadStart(url, showWarning) {
  var execWin = top;
  if (!IE && d && d.n && d.n.isModal === true) {
    execWin = $mainframe();
  }
  execWin.IframeTransporter('download?download_file=' + URLEncode(url));
  if (showWarning) {
    interactionInfo("Se o download não iniciar automaticamente clique no link abaixo: \n<a href=\"" + url + "\" target=\"_NEW\">" + url + "</a>");
  }
}

/**
 * Função que cria um novo componente Texto dinâmicamente.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Aba (Caso não seja definida, a aba será criada).<br/>
 * 2. Posição X.<br/>
 * 3. Posição Y.<br/>
 * 4. Largura do Componente.<br/>
 * 5. Altura do Componente.<br/>
 * 6. Descrição do Componente.<br/>
 * 7. Valor.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function ebfEditNew(aba,posX,posY,width,height,description,value){
  var code = getCodComponent();
  var component = new HTMLEdit(ebfGetSystemID(),ebfGetFormID(), code, posX, posY, width, height, description, value);
  component.id = description;
  component.zindex = 3;
  component.loadComponentTime = 0;
  var container = $mainform().d.t.getTabByName(aba);
  if(!container){
     d.t.add(aba);
     container = $mainform().d.t.getTabByName(aba);
  } 
  component.design(container.div, true);
  document['c_' + code] = component;
}

/**
 * Habilitar Botão de Exclusão<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Lógico (Verdadeiro para Habilitar, Falso para Desabilitar)<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function ebfEnableDeleteButton(value) {
  var button = d.n.btDelete;
  if (!button.flag) {
    var func = button.setEnabled;
    button.setEnabled = function(value, exec) {
      if (exec) {
        button.timeout(func, 0, [value]);
      }
    }
    button.flag = true;
  }
  button.setEnabled(value, true);
}

/**
 * Habilitar Botão de Alteração<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Lógico (Verdadeiro para Habilitar, Falso para Desabilitar)<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function ebfEnableEditButton() {

var navigation = $mainform().d.n;

if (navigation) {
   navigation.btEdit.setEnabled(arguments[0]);
 
}

}

/**
 * Habilitar Botão de Inserção<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Lógico (Verdadeiro para Habilitar, Falso para Desabilitar)<br/>
 * <br/>
 * Retorno:<br/>
 * Não Possui.
 */
function ebfEnableIncludeButton() {

var navigation = $mainform().d.n;

if (navigation) {
   navigation.btInclude.setEnabled(arguments[0]);
 
}

}

/**
 * Executa um comando Javascript passado como parâmetro (JavaScript é uma linguagem de hiper-texto.É uma nova linguagem para <br/>
 * criação de Home-Pages.Funções escritas em JavaScript podem ser embutidas dentro de seu  documento HTML.)<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Comando JavaScript<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna o resultado do comando executado <br/>
 * <br/>
 * Exemplos: <br/>
 * 1° Parâmetro: alert("Messagem a ser Enviada");<br/>
 * <br/>
 * Observações: <br/>
 * Essa função é usada para a necessidade de executar um comando JavaScript.
 */
function ebfExecuteJS(js, context) {
  return executeJS.call(this, js, context);
}

/**
 * Executa o fluxo de ação definido no segundo parâmetro desta função, observando a referência do formulário retornado<br/>
 * pelas funções utilizadas no primeiro parâmetro da função.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Deve ser utilizada a função "Obter Formulário Chamador" (quando o formulário for aberto através de outro formulário por<br/>
 * um botão, dentre outras formas) ou "Obter Formulário Pai" (quando o formulário for aberto em uma moldura no mesmo<br/>
 * formulário);<br/>
 * 2. Nome do fluxo de ação que será executado (o nome do fluxo de ação deve ser digitado). O fluxo de ação será<br/>
 * executado a partir do formulário (referência do formulário) que foi retornado a partir da função utilizada no primeiro<br/>
 * parâmetro desta função. Só poderá ser utilizado fluxo de ação que tenha como destino a camada Cliente.<br/>
 * 3. Deve ser criada uma lista de parâmetros para servirem de parâmetros de entrada para o fluxo de ação que foi<br/>
 * informado no segundo parâmetro desta função. Normalmente é utilizada a função "Criar Lista a Partir dos Elementos"<br/>
 * para este parâmetro.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function ebfExecuteRuleOnForm(form,ruleName,ruleParams) {
	var _ruleName = (ruleName);
    var _params = ruleParams;
    var _sys = sysCode;
    var _formID = idForm;
    
    if(_params == null)
      _params = new Array();
    
    form.executeJSRuleNoField(_sys, _formID, _ruleName, _params);
    
}

/**
 * Exporta os dados do formulário passado no primeiro parâmetro de acordo com o tipo de exportação escolhida.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário cujos dados serão exportados<br/>
 * 2. Tipo de exportação<br/>
 *       LST     - Exportar como uma lista;<br/>
 *       HTML  - Exportar como tabelas HTML;<br/>
 *       XML     - Exportar como árvore XML;<br/>
 *      TXT      - Exportar como arquivo de texto;<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function ebfExportFormData(formGuid,type) {
window.open("export.jsp?sys=" + sysCode + "&formID=" + formGuid + "&type=" + type, "ExportFormData", "fullscreen");
}

/**
 * Executa o fluxo determinado pelo parâmetro 1. Pode-se passar uma lista de parâmetros para o fluxo através do parâmetro 2.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome do fluxo que se deseja executar. Deve-se passar o nome exato ao cadastrado.<br/>
 * 2. Lista de parâmetros que o fluxo necessita (Caso não haja, deixar Nulo).<br/>
 * <br/>
 * Retorno: <br/>
 * Retorno do fluxo. Caso seja um fluxo Servidor executando um Cliente, o retorno será Nulo. <br/>
 * Visto que, por não haver sincronia nesse tipo de execução, não é possível obter o retorno do fluxo Cliente.
 */
function ebfFlowExecute(ruleName, params) {
  var reducedName = (ruleName);
  var sysCode = d.WFRForm.sys.value;
  var formCode = d.WFRForm.formID.value;
  var isJava = false;
  var ruleFunction;
  try {
    ruleFunction = window.eval(reducedName);
  } catch (ex) {
    isJava = true;
  }
  var value = null;
  if (isJava) {
    if (params && params instanceof Array && params.length > 0) {
      value = executeSyncJavaRule(sysCode, formCode, ruleName, params);
    } else {
      value = executeSyncJavaRule(sysCode, formCode, ruleName);
    }
  } else {
    var ruleInstance = new ruleFunction(null, sysCode, formCode);
    if (ruleInstance && ruleInstance.run) { // é JS
      value = executeJSRule(sysCode, formCode, reducedName, params, true);
    }
  } 
  return value;
}

/**
 * Efetua o produtório dentro de um intervalo definido.<br/>
 * Para cada valor definido no intervalo (a partir do incremento), a regra definida será executada e retornará um valor.<br/>
 * Todos esses valores serão multiplicados num total, o qual será o retorno da função.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome da regra<br/>
 * 2. Valor inicial, padrão 1<br/>
 * 3. Valor final<br/>
 * 4. Incremento, padrão 1<br/>
 * <br/>
 * Retorno: <br/>
 * Produtório, no intervalo definido, da execução das funções.<br/>
 * <br/>
 * Exemplos:<br/>
 * 1. Assumindo o Parâmetro 1 como um fluxo "XYZ" que recebe um parâmetro e eleva o mesmo ao quadrado,<br/>
 * o Parâmetro 2 como 1, o Parâmetro 3 como 2, e o Parâmetro 4 como 1, o retorno da função seria 4 (1² * 2²).<br/>
 * <br/>
 * Observações:<br/>
 * 1. Para garantir a integridade das operações matemáticas, utilize conversão para o tipo de dado nos parâmetros.
 */
function ebfFlowMultiply(ruleName, indexIni, indexEnd, increment) {
  ruleName = trim(ruleName);
  var reducedName = (ruleName);
  var sysCode = $mainform().d.WFRForm.sys.value;
  var formCode = $mainform().d.WFRForm.formID.value;
  var isJava = false;
  var ruleFunction;
  try {
    ruleFunction = window.eval(reducedName);
  } catch (ex) {
    isJava = true;
  }
  var multiply = 1.0;
  var ini = isNullable(indexIni) ? 1.0 : parseNumeric(indexIni);
  var end = parseNumeric(indexEnd);
  var inc = 1;
  if (parseNumeric(increment) != 0.0) {
    inc = parseNumeric(increment);
  }
  while (ini != end) {
    if (isJava) {
      multiply *= parseNumeric(executeSyncJavaRule(sysCode, formCode, ruleName, [ini]));
    } else {
      var ruleInstance = new ruleFunction(this, sysCode, formCode);
      if (ruleInstance && ruleInstance.run) {
        multiply *= parseNumeric(ruleInstance.run(ini));
      }
    }
    ini += inc;
  }
  // Execução para quando o valor inicial é igual ao final. Este caso não entra no laço acima.
  if (isJava) {
    multiply *= parseNumeric(executeSyncJavaRule(sysCode, formCode, ruleName, [ini]));
  } else {
    var ruleInstance = new ruleFunction(this, sysCode, formCode);
    if (ruleInstance && ruleInstance.run) {
      multiply *= parseNumeric(ruleInstance.run(ini));
    }
  }
  return multiply;
}

/**
 * Efetua o somatório dentro de um intervalo definido.<br/>
 * Para cada valor definido no intervalo (a partir do incremento), a regra definida será executada e retornará um valor.<br/>
 * Todos esses valores serão somados num total, o qual será o retorno da função.<br/>
 * <br/>
 * Parâmetro<br/>
 *  1. Nome da regra<br/>
 *  2. Valor inicial, padrão 0<br/>
 *  3. Valor final<br/>
 *  4. incremento, padrão 1<br/>
 * <br/>
 * Retorno: <br/>
 * Somatório, no intervalo definido, da execução das funções.<br/>
 * <br/>
 * Exemplos:<br/>
 * 1. Assumindo o Parâmetro 1 como um fluxo "XYZ" que recebe um parâmetro e eleva o mesmo ao quadrado,<br/>
 * o Parâmetro 2 como 1, o Parâmetro 3 como 2, e o Parâmetro 4 como 1, o retorno da função seria 5 (1² + 2²).<br/>
 * <br/>
 * Observações:<br/>
 * 1. Para garantir a integridade das operações matemáticas, utilize conversão para o tipo de dado nos parâmetros.
 */
function ebfFlowSum(ruleName, indexIni, indexEnd, increment) {
  ruleName = trim(ruleName);
  var reducedName = (ruleName);
  var sysCode = $mainform().d.WFRForm.sys.value;
  var formCode = $mainform().d.WFRForm.formID.value;
  var isJava = false;
  var ruleFunction;
  try {
    ruleFunction = window.eval(reducedName);
  } catch (ex) {
    isJava = true;
  }
  var sum = 0.0;
  var ini = parseNumeric(indexIni);
  var end = parseNumeric(indexEnd);
  var inc = 1;
  if (parseNumeric(increment) != 0.0) {
    inc = parseNumeric(increment);
  }
  while (ini != end) {
    if (isJava) {
      sum += parseNumeric(executeSyncJavaRule(sysCode, formCode, ruleName, [ini]));
    } else {
      var ruleInstance = new ruleFunction(this, sysCode, formCode);
      if (ruleInstance && ruleInstance.run) {
        sum += parseNumeric(ruleInstance.run(ini));
      }
    }
    ini += inc;
  }
  // Execução para quando o valor inicial é igual ao final. Este caso não entra no laço acima.
  if (isJava) {
    sum += parseNumeric(executeSyncJavaRule(sysCode, formCode, ruleName, [ini]));
  } else {
    var ruleInstance = new ruleFunction(this, sysCode, formCode);
    if (ruleInstance && ruleInstance.run) {
      sum += parseNumeric(ruleInstance.run(ini));
    }
  }
  return sum;
}

/**
 * A função altera o conteúdo do componente que está no formulário passado como parâmetro pelo conteúdo passado no<br/>
 * 3º parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário onde está o componente.<br/>
 * 2. Componente que será alterado.<br/>
 * 3. Novo valor do componente.<br/>
 * <br/>
 * Retorno: <br/>
 * Não Possui.<br/>
 * <br/>
 * Exemplo:<br/>
 * 1. Assumindo como parâmetros "Cadastro" (Constante do tipo Formulário), MakerEdit1(Constante do tipo Componente) e <br/>
 * "Salvador" (Letras), ao fluxo ser executado, o componente "MakerEdit1" passaria a ter o conteúdo "Salvador".<br/>
 * 2. Esta função altera valores somente de componentes do formulário da qual ela foi chamada. Para alterar valor do componente<br/>
 * em outro formulário, deve-se utilizar a função "Alterar Valor do Componente em Outro Formulário".
 */
function ebfFormChangeComponentValue(form, com, value) {
  $c(com, form).setValue(value, true);
}

/**
 * Fecha a árvore de formulários a partir do definido por parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário de onde deve-se partir para fechar todos seus formulários filhos.<br/>
 * 2. Define-se se o formulário, definido no Parâmetro 1, deve ser recarregado.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function ebfFormCloseChildren(formGUID, reloadParent) {
  var currentWin = window;
  var parentWin = getOpenerWindow(currentWin);
  var allWindows = new Array();

  allWindows.push(currentWin);
  while (parentWin && parentWin != currentWin) {
    allWindows.push(parentWin);
    var tempParentWin = getOpenerWindow(parentWin);
    if (tempParentWin != parentWin)
      parentWin = tempParentWin;
    else
      parentWin = null;
  }

  var first = null;
  for (var i = 0; i < allWindows.length ; i++) {
  	if (allWindows[i].$mainform && allWindows[i].$mainform().formGUID) {
	    if (allWindows[i].$mainform().formGUID == formGUID) {
	      if (reloadParent) {
	        first = allWindows[i];
	      }
	    
	      for (var j = i - 1; j >= 0; j--) {
	        try { allWindows[j].top.close(); } catch(e) {}
	      }
	      
	      break;
	    }
  	}
  }
  
  if (first != null) {
    if (IE) {
      first.focus();
      first.top.location.reload(first.top.location.href);
    } else {
      first.top.location.reload();
    }
  }
}

/**
 * Obtém o  componente passado como parâmetro (Objeto).<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Função do tipo letras.<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna a referência do componente.<br/>
 * <br/>
 * Observações:<br/>
 * 1. Se o formulário não for o principal (o que chama o fluxo), essa função não vai funcionar em regras do tipo cliente;<br/>
 * 2. Se não for o formulário principal (que chama o fluxo) e o mesmo estiver aberto, o retorno será o conteúdo do campo <br/>
 * passado naquele registro. Caso o formulário passado não esteja sendo utilizado, o retorno será o primeiro registro no banco.<br/>
 * <br/>
 * Exemplo:<br/>
 * Assumindo como componente "MakerEdit2", o retorno será o objeto deste componente.
 */
function ebfFormComponentByName() {
  if (existArgs(arguments)) {
    var component = controller.getElementById(arguments[0]);
    if (component) {
      return component;
    }
  }
  return null;
}

/**
 * Cria uma Animação em Flash em uma Moldura.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Aba.<br/>
 * 2. Nome da moldura (usada no formulário para exibir a animação).<br/>
 * 3. Endereço na internet onde está armazenada a animação. Nome da URL (Localizador Uniforme de Recursos). <br/>
 * <br/>
 * Retorno: <br/>
 * Variante.<br/>
 * <br/>
 * Exemplo: <br/>
 * Passando como primeiro parâmetro o valor: "Cadastro", o segundo parâmetro<br/>
 * o valor "Moldura" e o terceiro parâmetro o endereço "http://www.softwell.com.br/downloads/Baner.swf" (Sem aspas).<br/>
 * Deve ser criada a animação em flash na moldura.
 */
function ebfFormCreateFlash (aba, nomeMoldura, url) {
  var moldura = controller.getElementById(nomeMoldura);
  var div;  
  if(aba) {
    div = getDiv("flash", 0, 0, moldura.getWidth(), moldura.getHeight(), 1000010, true);
  } else {
    div = getDiv("flash", findPosX(moldura.div), findPosY(moldura.div), moldura.getWidth(), moldura.getHeight(), 1000010, true);
  }
  var flash = document.createElement("embed");
  flash.frameBorder = 0;
  flash.style.width = moldura.getWidth();
  flash.style.height = moldura.getHeight();
  flash.style.left = 0;
  flash.style.top = 0;
  flash.style.autostart = "false";
  div.appendChild(flash);
 
  if(aba) {
    moldura.div.appendChild(div);
  } else {
    document.body.appendChild(div);
  }
 
  flash.src = url;
  return div;
}

/**
 * Cria uma imagem estática em um componente moldura.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome da moldura (usada no formulário para exibir a imagem).<br/>
 * 2. Endereço onde está armazenada a imagem na Internet.<br/>
 * <br/>
 * Retorno: <br/>
 * Variante.<br/>
 * <br/>
 * Exemplo: <br/>
 * Nome da URL (Localizador Uniforme de Recursos)<br/>
 * http://www.softwell.com.br/downloads/Foto.jpg
 */
function ebfFormCreateImage(nomeMoldura,url) {
  var moldura = controller.getElementById(nomeMoldura);  
  var div =  getDiv("imagem", 0, 0, moldura.getWidth(), moldura.getHeight(), 1000010, true);  
  var img = new Image(moldura.getWidth(),moldura.getHeight());
  div.appendChild(img);
  moldura.div.innerHTML= '';
  moldura.div.appendChild(div);
  img.src = url;
  if ($c(nomeMoldura).onclick) {   
    img.onclick = $c(nomeMoldura).onclick;
    img.style.cursor = "pointer";
    $c(nomeMoldura).div.onclick = null; 
  }
  return div;  
}

/**
 * Esta função permite adicionar vídeos a formulários.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome da moldura (usada no formulário para exibir o vídeo).<br/>
 * 2. Endereço na Internet onde está armazenado o vídeo.<br/>
 * <br/>
 * Retorno:<br/>
 * Variante.<br/>
 * <br/>
 * Exemplo: <br/>
 * Nome da URL (Localizador Uniforme de Recursos) <br/>
 * http://www.softwell.com.br/downloads/Creed.mpg
 */
function ebfFormCreateVideo(nomeMoldura, url) { 
  var moldura = $c(nomeMoldura);  
  var div = getDiv("Video", 0, 0, moldura.getWidth(), moldura.getHeight(), 1000010, true);
  var video = document.createElement("embed");  
  video.src = url;
  video.frameBorder = 0;
  video.style.left = 0;
  video.style.top = 0;
  video.style.width = moldura.getWidth();
  video.style.height = moldura.getHeight();
  video.setAttribute("autostart", "true");
  div.appendChild(video);
  div.style.position = "absolute";
  moldura.div.appendChild(div);     
  return div;
}

/**
 * Esta função muda o modo do formulário para o modo de alteração.<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não Possui.<br/>
 * <br/>
 * Retorno: <br/>
 * Não Possui.<br/>
 * <br/>
 * Exemplo:<br/>
 * 1. Caso um formulário esteja em modo de inserção, após a função ser chamada, o formulário passará para o modo de alteração.<br/>
 * <br/>
 * Observação: <br/>
 * 1. O formulário que vai entrar em modo de alteração será o mesmo que chama o fluxo.
 */
function ebfFormEditMode()  {
  d.n.actEdit();
}

/**
 * Obtém o conteúdo do componente passado no segundo parâmetro e o retorna.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome do Formulário.<br/>
 * 2. Nome do Componente.<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna o conteúdo do componente passado como parâmetro (Letras).<br/>
 * <br/>
 * Exemplo:<br/>
 * Desejando obter o valor de um componente "CID_COD", estando este em um formulário "Cidade", passaria como parâmetros:<br/>
 * 1° Parâmetro: Formulário "Cidade"<br/>
 * 2° Parâmetro: Componente "CID_COD"<br/>
 * Retorno: Conteúdo do componente "CID_COD".<br/>
 * <br/>
 * Observações:<br/>
 * 1. Para obter o valor de um componente que se encontra em um Sub Form, deve ser passado o formulário do Sub Form<br/>
 * como parâmetro.<br/>
 * 2. Para obter o valor de um componente que se encontra em outro formulário, utilize a função "Obter Valor do Componente do Formulário".<br/>
 * 3. Para obter o valor de um componente que se encontra em uma moldura, deve ser utilizada a função "Executar Fluxo no Formulário"<br/>
 * e apontar para um fluxo que chama esta função.
 */
function ebfFormGetComponentValue(form, com) {
  return $c(com, form).getValue();
}

/**
 * Obtém a altura (em pixels) do componente passado como parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome do Componente.<br/>
 * <br/>
 * Retorno:<br/>
 * Altura do componente. (Inteiro)
 */
function ebfFormGetHeight() {
  if (existArgs(arguments)) {
    var component = $c(arguments[0]);
    if (component) {
      return component.getHeight();
    }
  }
}

/**
 * Função que obtém o valor exibido na lista dinâmica.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário onde se encontra o componente do tipo Lista Dinâmica.<br/>
 * 2. Componente Lista Dinâmica<br/>
 * <br/>
 * Retorno:<br/>
 * Retorna o valor que estiver no componente. (Letras)
 */
function ebfFormGetLookupName(form, com){
  try{
    var lk = $c(com);
    var idx = lk.value;
    return lk.showValue;
  }catch(e){
    throw "Não foi possível obter o valor do componente.";
  }
}

/**
 * A função retorna true (Verdadeiro) caso o componente passado esteja visível, ou false (falso) caso contrário.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Componente que deseja obter o valor (Se está visível ou não).<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna true (Verdadeiro) caso o componente esteja visível e false (falso) caso contrário.<br/>
 * <br/>
 * Observações:<br/>
 * 1.Para selecionar o componente é necessário indicar o nome do formulário no de trabalho no "Inicio" do fluxo   .<br/>
 * 2.Caso não queira selecionar o formulário de trabalho, digite o nome do componente mudando a constante do tipo<br/>
 * "formulário" para uma constante do tipo "Letras".
 */
function ebfFormGetVisible() {
  var value = false;
  if (existArgs(arguments)) {
    var component = $c(arguments[0]);
    if (component) {
      value = component.getVisible();
    }
  }
  return value;
}

/**
 * Obtém a largura (em pixels) do componente passado como parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome do Componente.<br/>
 * <br/>
 * Retorno:<br/>
 * Largura do Componente (Inteiro.
 */
function ebfFormGetWidth() {
  if (existArgs(arguments)) {
    var component = $c(arguments[0]);
    if (component) {
      return component.getWidth();
    }
  }
}

/**
 * Esta função muda o modo do formulário para o modo de inserção.<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não Possui.<br/>
 * <br/>
 * Retorno: <br/>
 * Não Possui.<br/>
 * <br/>
 * Exemplo:<br/>
 * 1. Caso um formulário esteja em modo de inserção, após a função ser chamada, o formulário passará para o modo de inserção.<br/>
 * <br/>
 * Observação: <br/>
 * 1. O formulário que vai entrar em modo de alteração será o mesmo que chama o fluxo.
 */
function ebfFormInsertMode()  {
  d.n.actInclude();
}

/**
 * A função obtém o estado do formulário no momento que o fluxo é chamado retornando true(verdadeiro) caso esteja em <br/>
 * modo de alteração ou false(falso) caso contrário.<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não Possui.<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna true(verdadeiro) caso o formulário esteja em modo de alteração ou false (falso) caso contrário.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1.Assumindo que um formulário está em modo de alteração no momento que o fluxo é chamado. Neste caso, o retorno seria<br/>
 * "True".<br/>
 * <br/>
 * Observação: <br/>
 * Não é necessário passar o nome do formulário. O formulário sempre vai ser o que chama o fluxo.
 */
function ebfFormIsInEditMode()  {
  return $mainform().edit;
}

/**
 * A função obtém o estado do formulário no momento que o fluxo é chamado, retornando true(verdadeiro) caso esteja em <br/>
 * modo de inserção ou false(falso) caso contrário.<br/>
 * <br/>
 * Parâmetros<br/>
 * Não Possui.<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna true (verdadeiro) caso o formulário esteja em modo de inserção ou false (falso) caso contrário.<br/>
 * <br/>
 * Observação: <br/>
 * Não é necessário passar o nome do formulário. O formulário sempre vai ser o que chama o fluxo.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1.Assumindo que um formulário está em modo de inserção no momento que o fluxo é chamado. Neste caso, o retorno seria <br/>
 * "True".
 */
function ebfFormIsInInsertMode()  {
  return $mainform().insert;
}

/**
 * Vai para a guia seguinte à corrente.<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não possui.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observação:<br/>
 * 1. O uso dessa função tem uma melhor performance quando usada em regras clientes.
 */
function ebfFormNextTab() {
  var tabController = $mainform().d.t;
  if (tabController) {  
    tabController.openNextTab();
  }
}

/**
 * Abre o formulário passado como parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário a ser aberto.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function ebfFormOpenForm(formGuid) {
  var content = getContent("wfrcore?action=ruleopenform&sys=" + sysCode + "&guid=" + formGuid);
  eval(content);
}

/**
 * Esta função permite ativar e focar a aba descrita no primeiro parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome da Aba a ser ativada.<br/>
 * <br/>
 * Retorno: <br/>
 * A aba selecionada para regras cliente. Para regras servidor retorna Nulo.<br/>
 * <br/>
 * Exemplo:<br/>
 * Assumindo como parâmetro a aba "Endereço"(Letras), quando o fluxo for executado a aba "Endereço" será habilitada.
 */
function ebfFormOpenTab(tabName) {
  var tabController = $mainform().d.t;
  tabController.openTab(tabName);
  return tabController.tabsByName[tabName];
}

/**
 * Permuta entre a aba corrente para a anterior.<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não possui.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observação:<br/>
 * 1. O uso dessa função tem uma melhor performance quando usada em regras clientes.
 */
function ebfFormPreviousTab() {
  var tabController = $mainform().d.t;
  if (tabController) {  
    tabController.openPreviousTab();
  }
}

/**
 * Atualiza o conteúdo do componente passado por parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Componente que será atualizado.<br/>
 * <br/>
 * Retorno: <br/>
 * Não Possui.<br/>
 * <br/>
 * Observações:<br/>
 * 1.Para selecionar o campo é necessário indicar o nome do formulário no de trabalho no "Inicio" do fluxo . <br/>
 * 2.Caso não queira selecionar o formulário de trabalho no início do fluxo, digite o nome do componente no lugar do<br/>
 * parâmetro (ao invés de seleciona-lo).
 */
function ebfFormRefreshComponent(component) {
  if (component)
    $c(component).refresh();
}

/**
 * Esta função altera a cor de fundo do componente.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Componente cujo fundo mudará de cor.<br/>
 * 2. Nova cor de fundo do componente.<br/>
 * <br/>
 * Retorno: <br/>
 * Não Possui.<br/>
 * <br/>
 * Observações:<br/>
 * 1.Para selecionar o componente é necessário indicar o nome do formulário de trabalho no "Inicio" do fluxo   .<br/>
 * 2.Caso não queira selecionar o formulário de trabalho, digite o nome do componente mudando a constante do tipo "formulário" <br/>
 * para uma constante do tipo "Letras".<br/>
 * <br/>
 * Exemplo:<br/>
 * 1.Assumindo como parâmetros o componente "Cidade"  (MakerEdit1), e a cor Azul, quando o fluxo for executado o fundo do <br/>
 * componente "MakerEdit1" passará a ser  azul.
 */
function ebfFormSetBGColor() {
  if (existArgs(arguments)) {
    var component = $c(arguments[0]);
    if (component) {
      component.setBGColor(arguments[1]);
    }
  }
}

/**
 * Esta função altera a cor do conteúdo do componente.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Componente cujo conteúdo mudará de cor.<br/>
 * 2. Nova cor do conteúdo do componente.<br/>
 * <br/>
 * Retorno: <br/>
 * Não Possui.<br/>
 * <br/>
 * Observações:<br/>
 * 1.Para selecionar o componente é necessário indicar o nome do formulário de trabalho no "Inicio" do fluxo   .<br/>
 * 2.Caso não queira selecionar o formulário de trabalho, digite o nome do componente mudando a constante do tipo "formulário" <br/>
 * para uma constante do tipo "Letras".<br/>
 * <br/>
 * Exemplo:<br/>
 * 1.Assumindo como parâmetros o componente "Cidade"  (MakerEdit1), e a cor Azul, quando o fluxo for executado o conteúdo <br/>
 * do componente "MakerEdit1" passará a ser  azul.
 */
function ebfFormSetColor() {
  if (existArgs(arguments)) {
    var component = $c(arguments[0]);
    if (component) {
      component.setColor(arguments[1]);
    }
  }
}

/**
 * Esta função habilita o componente se a condição passada no segundo parâmetro for verdadeira, ou desabilita caso a condição <br/>
 * seja falsa. Se o componente estiver desabilitado, não será possível modificar seu conteúdo.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Componente que será habilitado ou desabilitado.<br/>
 * 2. Condição para habilitar o componente<br/>
 * <br/>
 * Retorno: <br/>
 * Não Possui.<br/>
 * <br/>
 * Exemplos:<br/>
 * 1.Assumindo como parâmetros o componente "Cidade"  (MakerEdit1),  e uma condição lógica "Ano Atual= 2000", quando a <br/>
 * função for executada, caso o Ano atual seja 2000 o componente "MakerEdit1" será habilitado, Caso seja diferente de 2000 o <br/>
 * campo será desabilitado.<br/>
 * 2. Assumindo como parâmetros o componente "Cidade"  (MakerEdit1),  e uma condição lógica  true, quando a função for <br/>
 * executada o componente sempre vai ser habilitado.<br/>
 * <br/>
 * Observações:<br/>
 * 1.Para selecionar o componente é necessário indicar o nome do formulário no de trabalho no "Inicio" do fluxo   .<br/>
 * 2.Caso não queira selecionar o formulário de trabalho, digite o nome do componente mudando a constante do tipo "formulário" <br/>
 * para uma constante do tipo "Letras".
 */
function ebfFormSetEnabled() {
  if (existArgs(arguments)) {
    var component = $c(arguments[0]);
    if (component) {
      if(controller.activeElement == component)            
        component.blur();      
    }
    component.setEnabled(arguments[1]);
  }
}

/**
 * Essa função é utilizada para focar um determinado componente  passado como parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Componente que vai ter o foco.<br/>
 * <br/>
 * Retorno: <br/>
 * Não Possui.<br/>
 * <br/>
 * Observação:<br/>
 * 1.Para selecionar o componente é necessário indicar o nome do formulário no de trabalho no "Inicio" do fluxo   .<br/>
 * 2.Caso não queira selecionar o formulário de trabalho, digite o nome do componente mudando a constante do tipo "formulário" <br/>
 * para uma constante do tipo "Letras"<br/>
 * <br/>
 * Exemplo:<br/>
 * 1.Assumindo como parâmetro o componente "Cidade"  (MakerEdit1), após essa função ser executada, o foco do cursor estará <br/>
 * neste componente passado como parâmetro.
 */
function ebfFormSetFocus() {
  if (existArgs(arguments)) {
    var component = $c(arguments[0]);
    if (component) {
      timeout(function() {
            component.focus();
        }, 100);
    }
  }
}

/**
 * Esta função altera a altura do componente do formulário.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Componente que mudará de tamanho.<br/>
 * 2. Nova altura do componente.<br/>
 * <br/>
 * Retorno: <br/>
 * Não Possui.<br/>
 * <br/>
 * Exemplo:<br/>
 * 1.Assumindo como parâmetros o componente "Cidade"  (MakerEdit1), e o valor 100 (inteiro), quando o fluxo for executado a<br/>
 * altura do componente passará a ser 100.<br/>
 * <br/>
 * Observações:<br/>
 * 1.Para selecionar o componente é necessário indicar o nome do formulário de trabalho no "Inicio" do fluxo   .<br/>
 * 2.Caso não queira selecionar o formulário de trabalho, digite o nome do componente mudando a constante do tipo "formulário" <br/>
 * para uma constante do tipo "Letras".
 */
function ebfFormSetHeight() {
  if (existArgs(arguments)) {
    var component = $c(arguments[0]);
    if (component) {
      component.setHeight(arguments[1]);
    }
  }
}

/**
 * Função que altera o valor exibido na lista dinâmica.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário onde se encontra o componente do tipo Lookup.<br/>
 * 2. Componente Lista Dinâmica.<br/>
 * 3. Valor que será exibido na lista dinâmica.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function ebfFormSetLookupName(form, com, newValue){
  try{
    var lk = $c(com);
        lk.setShowValue(newValue);
  }catch(e){
    throw "Não foi possível Alterar o valor do lookup";
  }
}

/**
 * Esta função altera a posição do componente passado como parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Componente que mudará de posição.<br/>
 * 2. Nova posição X (Horizontal) do componente.<br/>
 * 3. Nova posição Y (Vertical) do componente.<br/>
 * <br/>
 * Retorno: <br/>
 * Não Possui.<br/>
 * <br/>
 * Exemplo:<br/>
 * 1.Assumindo como parâmetros o componente "Cidade"  (MakerEdit1), o valor 150 (Inteiro) e o valor 250 (Inteiro), quando o <br/>
 * fluxo for executado a  posição X do componente será 150 e a Y será 250.<br/>
 * <br/>
 * Observações:<br/>
 * 1.Para selecionar o componente é necessário indicar o nome do formulário de trabalho no "Inicio" do fluxo   .<br/>
 * 2.Caso não queira selecionar o formulário de trabalho, digite o nome do componente mudando a constante do tipo "formulário" <br/>
 * para uma constante do tipo "Letras"
 */
function ebfFormSetPosition() {
  if (existArgs(arguments)) {
    var component = $c(arguments[0]);
    if (component) {
      component.setX(arguments[1]);
      component.setY(arguments[2]);
    }
  }
}

/**
 * Esta função define um campo do formulário como Apenas Leitura. Caso o parâmetro seja Verdadeiro, define Apenas Leitura.<br/>
 * Caso contrário retira esta definição.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. O Componente que se deseja definir como Apenas Leitura.<br/>
 * 2. Deseja que o campo se torne Apenas Leitura?<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observações:<br/>
 * 1. Esta função permite apenas alterar o campo para apenas leitura. O inverso não é possível.
 */
function ebfFormSetReadonly(field, readonly) {
  var component = $c(field);
  if (component) {
    component.setReadOnly(readonly);
  }
}

/**
 * Esta função define se um ou mais componentes são obrigatórios ou não.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Componente ou lista de componentes.<br/>
 * 2. Obrigatório?<br/>
 * <br/>
 * Retorno: <br/>
 * Não Possui.
 */
function ebfFormSetRequired() {
  if (existArgs(arguments)) {
    var components = arguments[0];

    if (components.constructor.toString().indexOf('Array') == -1)
      components = [arguments[0]];
      
    for(var i=0;i<components.length;i++) {
      var component = $c(components[i]);
      if (component) {
        component.required = arguments[1];
        if (component.label) {
          component.label.innerHTML = component.decorateRequired(component.description.replace(/\s/g, '&nbsp;'), component.required);
        }

      }
    }
  }
}

/**
 * Esta função mostra o componente se a condição passada no segundo parâmetro for verdadeira, ou oculta caso a condição <br/>
 * seja falsa. <br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Componente que ficará visível ou oculto.<br/>
 * 2. Condição para mostrar o componente<br/>
 * <br/>
 * Retorno: <br/>
 * Não Possui.<br/>
 * <br/>
 * Observações:<br/>
 * 1.Para selecionar o componente é necessário indicar o nome do formulário de trabalho no "Inicio" do fluxo   .<br/>
 * 2.Caso não queira selecionar o formulário de trabalho, digite o nome do componente mudando a constante do tipo "Componente" <br/>
 * para uma constante do tipo "Letras".<br/>
 * <br/>
 * Exemplos:<br/>
 * 1.Assumindo como parâmetros o componente "Cidade"  (MakerEdit1),  e uma condição lógica "Ano Atual= 2000", quando a <br/>
 * função for executada, caso o Ano atual seja 2000 o componente "MakerEdit1" ficará visível, Caso seja diferente de 2000 o <br/>
 * campo ficará oculto.<br/>
 * 2. Assumindo como parâmetros o componente "Cidade"  (MakerEdit1),  e uma condição lógica  false, quando a função for <br/>
 * executada o componente ficará oculto.
 */
function ebfFormSetVisible() {
  if (existArgs(arguments)) {
    var component = $c(arguments[0]);
    if (component) {
      component.setVisible(arguments[1]);
    }
  }
}

/**
 * Esta função altera a largura do componente do formulário.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Componente que mudará de tamanho.<br/>
 * 2. Nova largura do componente.<br/>
 * <br/>
 * Retorno: <br/>
 * Não Possui.<br/>
 * <br/>
 * Exemplo:<br/>
 * 1.Assumindo como parâmetros o componente "Cidade"  (MakerEdit1), e o valor 350 (inteiro), quando o fluxo for executado a<br/>
 * largura do componente passará a ser 350.<br/>
 * <br/>
 * Observações:<br/>
 * 1.Para selecionar o componente é necessário indicar o nome do formulário de trabalho no "Inicio" do fluxo   .<br/>
 * 2.Caso não queira selecionar o formulário de trabalho, digite o nome do componente mudando a constante do tipo "formulário" <br/>
 * para uma constante do tipo "Letras".
 */
function ebfFormSetWidth() {
  if (existArgs(arguments)) {
    var component = $c(arguments[0]);
    if (component) {
      component.setWidth(arguments[1]);
    }
  }
}

/**
 * Esta função mostra ou oculta a aba a depender da condição lógica passada. Caso a condição seja verdadeira, mostra a <br/>
 * aba, caso seja falsa, oculta.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Aba que vai ficar visível ou oculta.<br/>
 * 2. Condição Lógica para mostrar ou não a aba.<br/>
 * <br/>
 * Observação:<br/>
 * 1.A aba passada como parâmetro deve estar no formulário que chama o fluxo.<br/>
 * <br/>
 * Exemplo:<br/>
 * 1.Caso um formulário esteja em modo de inserção, após a função ser chamada, o formulário passará para o modo de alteração.
 */
function ebfFormShowTab() {
  if (existArgs(arguments)) {
    mainform.d.t.setVisible(arguments[0], arguments[1]);
  }
}

/**
 * Essa função modifica a formatação da data passada no primeiro parâmetro para a formatação passada no segundo<br/>
 * parâmetro. <br/>
 * <br/>
 * Tipos de formatos:<br/>
 * yyyy - ano<br/>
 * MM - mês<br/>
 * w - semana do ano (soma das semanas (Somente camada servidor)).<br/>
 * W - semana do mês (soma das semanas (Somente camada servidor)).<br/>
 * D - dia do ano (soma dos dias)<br/>
 * dd - dia do mês (Somente camada servidor).<br/>
 * F - dia da semana (soma dos dias (Somente camada servidor)).<br/>
 * a - am/pm<br/>
 * H - hora (0 a 23h)<br/>
 * k - hora (1 a 24h)<br/>
 * K - hora (0 a 11h am/pm)<br/>
 * h - hora (1 a 12 am/pm)<br/>
 * mm - minutos da hora<br/>
 * ss - segundos hora<br/>
 * SSS - milisegundos da hora (Somente camada servidor).<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Data que deseja formatar<br/>
 * 2. Formatação da data<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna a data com a nova formatação.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo que o 1º parâmetro seja 01/04/2007 20: 32: 16, o 2º Parâmetro sendo dd/MM/yyyy K a, o retorno será 01/04/2007 8 PM.<br/>
 * 2. Assumindo que o 1º parâmetro seja 01/04/2007 20: 32:16, o 2º Parâmetro sendo dd/MM k:mm, o retorno será 01/04/2007 20:32
 */
function ebfFormatDateTime(date, format) {
  if (isNullable(date) || !(date instanceof Date)) {
    return null;
  }
  
  if (isNullable(format)) {
    format = "dd/MM/yyyy"; 
  }
  
  return date.format(format);
}

/**
 * Fecha um formulário aberto através da função "Abrir formulário numa moldura".<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Formulário onde se encontra o componente moldura.<br/>
 * 2. Nome do componente<br/>
 * <br/>
 * Retorno: <br/>
 * Esta função não possui retorno.
 */
function ebfFrameCloseForm(formName,componentName) {
  var component = controller.getElementById(componentName, formName);
  if((component) && (component instanceof HTMLGroupBox)){
    var oldIframe = component.div.getElementsByTagName("DIV")[0].getElementsByTagName("iframe")[0];
    
    if((oldIframe.src) && !(oldIframe.src.length > 0))
      throw "Erro ao fechar o formulário";
      
      get('closeform.do?sys='+ sysCode +'&action=closeform&formID=' + eval(oldIframe.id).formGUID);
      
      component.div.getElementsByTagName("DIV")[0].parentNode.removeChild(component.div.getElementsByTagName("DIV")[0]);
      
    }else{
      throw "O Componente não é do tipo moldura"; 
    }
}

/**
 * Função que abre um formulário numa moldura filtrado.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário onde se encontra o componente do tipo moldura;<br/>
 * 2. Componente do tipo moldura;<br/>
 * 3. Formulário que será aberto na moldura;<br/>
 * 4. Valor lógico que indica se a barra de rolagem deverá aparecer.<br/>
 * 5. Filtro. Formato: <Tabela 1>.<Campo 1>=<Valor 1>[;<Tabela 2>.<Campo 2>=<Valor 2>[;<Tabela N>.<Campo N>=<Valor N>]]<br/>
 *                        Ex: TAB_PESSOAS.CODIGO=100;TAB_PESSOAS.NOME=José<br/>
 * <br/>
 * Observações:<br/>
 * 1. Esta função não deve ser utilizada para abrir numa moldura o mesmo Formulário que a contém.<br/>
 * 2. Pode-se tipar o valor passando o formato <Valor>@<Tipo>, onde tipo pode ser: long, double, timestamp, date e boolean.<br/>
 *     Ex: TAB_PESSOAS.CODIGO=100@long<br/>
 *           TAB_PESSOAS.NASCIMENTO=10/11/1980@date<br/>
 * 3. As modificações feitas no formulário que será aberto na moldura, apenas serão visualizadas quando o sistema é reiniciado.
 */
function ebfFrameOpenFilteredForm(formName, componentName, formTarget, scrollbar, filter){

  var component = controller.getElementById(componentName, formName);
  if((component) && (component instanceof HTMLGroupBox)){
    var oldIframe = component.div.getElementsByTagName("iframe");
    
    var scrolling;
      if(scrollbar){
        scrolling = 'yes'; 
      } else{
        scrolling = 'no';
      }
      
    if(oldIframe.length > 0){
      if(oldIframe.formOnUnLoadAction)
        oldIframe.formOnUnLoadAction();
      var url = 'form.jsp?sys='+sysCode+'&action=openform&formID='+formTarget+'&align=0&mode=-1&goto=-1&filter='+(filter?filter:'')+'&scrolling='+scrolling; 
      if (oldIframe[0].src.substr(oldIframe[0].src.length-url.length) != url) {
        oldIframe[0].src = url
        oldIframe[0].style.scrollbars = scrollbar;
      }  
    } else{
      ebfFrameOpenURL(formName, componentName,'form.jsp?sys='+sysCode+'&action=openform&formID='+formTarget+'&align=0&mode=-1&goto=-1&filter='+(filter?filter:'')+'&scrolling='+scrolling, scrollbar);
    }
  }else{
    throw "O Componente não é do tipo moldura"; 
  }
}

/**
 * Função que abre um formulário numa moldura.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário onde se encontra o componente do tipo moldura;<br/>
 * 2. Componente do tipo moldura;<br/>
 * 3. Formulário que será aberto na moldura;<br/>
 * 4. Valor lógico que indica se a barra de rolagem deverá aparecer.<br/>
 * <br/>
 * Observações:<br/>
 * 1. Esta função não deve ser utilizada para abrir numa moldura o mesmo Formulário que a contém.<br/>
 * 2. As modificações feitas no formulário que está em uma moldura, apenas serão visualizadas quando o sistema é reiniciado,<br/>
 * ou quando o formulário é atualizado manualmente.
 */
function ebfFrameOpenForm(formName, componentName, formTarget, scrollbar){
  var component = controller.getElementById(componentName, formName);
  if((component) && (component instanceof HTMLGroupBox)){
    var oldIframe = component.div.getElementsByTagName("iframe");
    var scrolling;
      if(scrollbar){
        scrolling = 'yes'; 
      } else{
        scrolling = 'no';
      }
    if(oldIframe.length > 0){
      oldIframe[0].src = 'form.jsp?sys='+sysCode+'&action=openform&formID='+formTarget+'&align=0&mode=-1&goto=-1&filter=&scrolling='+scrolling;
      oldIframe[0].style.scrollbars = scrollbar;
    } else{
      ebfFrameOpenURL(formName, componentName,'form.jsp?sys='+sysCode+'&action=openform&formID='+formTarget+'&align=0&mode=-1&goto=-1&filter=&scrolling='+scrolling, scrollbar);
    }
  }else{
    throw "O Componente não é do tipo moldura"; 
  }
}

/**
 * Abre uma url numa moldura.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário da moldura<br/>
 * 2. Nome do componente (moldura)<br/>
 * 3. URL<br/>
 * 4. Moldura com barra de rolagem?<br/>
 * <br/>
 * Observações: <br/>
 * 1. Não é suportada a utilização de variáveis de sessão no formulário referenciado no 2º parâmetro desta função.<br/>
 * 2. Para colocar um caracter & que esteja entre os dados do valor de um parâmetro de uma URL utilize a combinação: %26 + &
 */
function ebfFrameOpenURL(formName, componentName, url, scrollbar) {
  var component = controller.getElementById(componentName, formName);
  if (component) {
    var id = 'URLFrame' + parseInt((Math.random() * 9999999));
    var div =  getDiv(id, 0, 0, component.getWidth(), component.getHeight(), 1000010, true);
    var iframe;
    if (IE) {
      iframe = document.createElement("<iframe name='" + id + "' id='" + id + "'>");
    } else {
      iframe = document.createElement("iframe");
    }
    iframe.frameBorder = 0;
    iframe.setAttribute("frameborder", "no");
    iframe.setAttribute("border", 0);
    iframe.setAttribute("marginwidth", 0);
    iframe.setAttribute("marginheight", 0);
    iframe.style.left = 0;
    iframe.style.top = 0;
    iframe.style.width = component.getWidth();
    iframe.style.height = component.getHeight();
    iframe.style.scrollbars = false;
    iframe.style.backgroundColor = "#FFFFFF";
    iframe.src = url;
    iframe.id = id;
    iframe.name = id;
    div.appendChild(iframe);
    component.div.appendChild(div);
    return div;
  }
  return null;
}

/**
 * Atualiza um formulário aberto através da função "Abrir formulário numa moldura".<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Formulário onde se encontra o componente moldura.<br/>
 * 2. Nome do componente (Moldura).<br/>
 * <br/>
 * Retorno: <br/>
 * Esta função não possui retorno.
 */
function ebfFrameRefreshForm(formName,componentName) {	
  var component = controller.getElementById(componentName, formName);
  if((component) && (component instanceof HTMLGroupBox)){
    var oldIframe = component.div.getElementsByTagName("DIV")[0].getElementsByTagName("iframe")[0];	  
    eval(oldIframe.id).mainform.d.n.execAjaxEval("refresh");
  }else{
    throw "O Componente não é do tipo moldura"; 
  }
}

/**
 * Obtém o Caminho Absoluto da Aplicação<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não possui.<br/>
 * <br/>
 * Retorno:<br/>
 * Retorna o caminho. (Letras)
 */
function ebfGetAbsolutContextPath(){
    return getAbsolutContextPath();
}

/**
 * Obtém o elemento da árvore que está ativo no momento.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Árvore <br/>
 * <br/>
 * Retorno:  <br/>
 * Elemento da árvore que está ativo. (Variante)
 */
function ebfGetActiveElement(tree){	
  return tree.getActiveElement();	
}

/**
 * Obtém a referência do formulário no qual foi associado (ao evento do formulário) o fluxo de ação que contém esta função.<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não Possui.<br/>
 * <br/>
 * Retorno:<br/>
 * Referência do Formulário. (Variante).
 */
function ebfGetActualForm() {
  return $mainform();
}

/**
 * Obtém um objeto applet e passa para um fluxo.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Caminho do arquivo .jar<br/>
 * 2. Caminho do arquivo .class dentro do .jar<br/>
 * 3. Nome da regra que será chamada pela função<br/>
 * <br/>
 * Observações:<br/>
 * 1. A regra que será chamada tem que ser cliente.<br/>
 * 2. A regra que será chamada tem que ter um parâmetro e do tipo Variante que receberá o objeto applet.<br/>
 * 3. Para chamar um método do applet utilizar a função "invocar método".<br/>
 * <br/>
 * Exemplos:<br/>
 * 1.              <br/>
 *       1ºParâmetro: "apps/STextPrinter.jar".<br/>
 *       2ºParâmetro: "wfr.sys.HTMLInterface.HTMLTextPrinterApplet.class".<br/>
 *       3ºParâmetro: "Teste Applet".<br/>
 *    -Se o objeto applet for iniciado a regra "Teste Applet" vai ser chamada recebendo o objeto applet como parâmetro.<br/>
 * Este exemplo está no aqruivo frz "http://suporte.softwell.com.br/maker/exemplos/Applet/Obter%20Objeto%20Applet.FRZ"
 */
function ebfGetAppletObject(jar, clazz, rule) {
  var callback = "callback";
  var id = jar+clazz;
  if (!$mainframe._loadedApplets) 
    $mainframe._loadedApplets = new Map();
  var _rule = (rule);
  window.applet_callback = function(applet) {
    $mainframe._loadedApplets.add(id, applet);
    var func = window.eval(_rule);
    var ruleInstance = new func(null, sysCode, idForm);
    ruleInstance.run.call(ruleInstance, applet);
  }
  var currentApplet = $mainframe._loadedApplets.get(id);
  if (currentApplet){
    applet_callback(currentApplet);
  }else{
    IframeTransporter('loadapplet.jsp?archive='+jar+'&code='+clazz+'&callback=applet_callback');
  }
}

/**
 * Função que obtém o valor do componente desejado em qualquer formulário aberto.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário onde se encontar o componente;<br/>
 * 2. Componente desejado;<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observações:<br/>
 * 1. Para obter o valor de um componente que se encontra em um Sub Form, deve ser passado o formulário do Sub Form<br/>
 * como parâmetro.<br/>
 * 2. Quando o formulário se encontra dentro de um componente moldura, deve-se utilizar a função "Executar Fluxo no Formulário"<br/>
 * apontando para um fluxo que obtem o valor do componente.
 */
function searchFormByGUIDGetComponentValueFromOtherForm(currentForm,GUID){
  if (currentForm && currentForm.formGUID == GUID){
    return currentForm;
  }

  if (currentForm && currentForm.mainform && currentForm.mainform.formGUID == GUID){
    return currentForm.mainform;
  }
  if (currentForm.children){
    for (var i=0;i<currentForm.children.length;i++){
      try {
        if (currentForm.children[i].mainform){
          if (currentForm.children[i].mainform.formGUID == GUID){
            return currentForm.children[i].mainform;
          }
          var returnForm = searchFormByGUIDGetComponentValueFromOtherForm(currentForm.children[i],GUID);
          if (returnForm){
            return returnForm;
          }
        }
      }catch(e){}
    }
  }
}

function ebfGetComponentValueFromOtherForm(form, com, value){
  if (isNull(form)) {
    throw 'Defina um formulário para obter o valor de um componente!';
  }
  var mainWindow = $mainform();

  while(getOpenerWindow(mainWindow) != null){
    mainWindow = getOpenerWindow(mainWindow);

  }//encontra a janela principal do Sistema

  //procura o formulário usando o GUID passado
  var myForm = searchFormByGUIDGetComponentValueFromOtherForm(mainWindow,form);

  //verifica se o formulário foi encontrado
  if(myForm){
    // obtem o componente
    var component = myForm.controller.getElementById(com);
    if (!isNull(component)){
      return component.getValue();
    }else{
      component = myForm.controller.getElementById(com, form);
      if (isNull(component)) {
        throw 'Componente não encontrado para o formulário escolhido!';
      }
      return component.getValue();
    }
  }else{
    throw 'O Formulário cujo componente se deseja obter não está aberto!';
  }
}

/**
 * Obtém e retorna a posição horizontal (X) do componente passado como parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Componente que se deseja obter a posição horizontal(X).<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna a posição horizontal(Inteiro) do componente passado como parâmetro.<br/>
 * <br/>
 * Exemplo:<br/>
 * 1.Em um formulário com um componente "Cidade" cuja posição horizontal é 150,, assumindo como parâmetros <br/>
 * este componente ("Cidade") ,o retorno seria 150(Inteiro).<br/>
 * <br/>
 * Observações:<br/>
 * 1.Para selecionar o componente é necessário indicar o nome do formulário de trabalho no "Inicio" do fluxo   .<br/>
 * 2.Caso não queira selecionar o formulário de trabalho, digite o nome do componente  mudando a constante do tipo<br/>
 * "formulário" para uma constante do tipo "Letras".
 */
function ebfGetComponenteXPosition(componente) {
  var comp = controller.getElementById(componente);
  if (comp) {
    return comp.getX();
  }
}

/**
 * Obtém e retorna a posição vertical (Y) do componente passado como parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Componente que se deseja obter a posição vertical(Y).<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna a posição vertical (Inteiro) do componente passado como parâmetro.<br/>
 * <br/>
 * Exemplo:<br/>
 * 1.Em um formulário com um componente "Cidade" cuja posição vertical é 250, assumindo como parâmetros este componente<br/>
 * ("Cidade") ,o retorno seria 250(Inteiro).<br/>
 * <br/>
 * Observações:<br/>
 * 1.Para selecionar o componente é necessário indicar o nome do formulário de trabalho no "Inicio" do fluxo   .<br/>
 * 2.Caso não queira selecionar o formulário de trabalho, digite o nome do componente  mudando a constante do tipo "formulário"<br/>
 * para uma constante do tipo "Letras".
 */
function ebfGetComponenteYPosition(componente) {
  var comp = controller.getElementById(componente);
  if (comp)
    return comp.getY();
}

/**
 * Obtém o valor de um Cookie.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome do cookie definido<br/>
 * <br/>
 * Retorno:<br/>
 * Valor do Cookie<br/>
 * <br/>
 * Observações:<br/>
 * 1. Existe uma função "Definir Cookie" que permite criar e atribuir um valor a um cookie.
 */
function ebfGetCookie(name) { 
  var dc = document.cookie;
  var prefix = name + "=";
  var begin = dc.indexOf("; " + prefix);
  if (begin == -1) {
    begin = dc.indexOf(prefix);
    if (begin != 0)
      return null;
  }else
    begin += 2;
  var end = document.cookie.indexOf(";", begin);
  if (end == -1)
    end = dc.length;
  return unescape(dc.substring(begin + prefix.length, end));
}

/**
 * Obtém a posição horizontal (relativa ao formulário atual) do cursor.<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não possui.<br/>
 * <br/>
 * Retorno:<br/>
 * Posição X do Cursor (Inteiro)
 */
function ebfGetCursorX() {
return $mainform().mX;
}

/**
 * Obtém a posição vertical (relativa ao formulário atual) do cursor.<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não possui.<br/>
 * <br/>
 * Retorno:<br/>
 * Posição Y do Cursor (Inteiro).
 */
function ebfGetCursorY() {
return $mainform().mY;
}

/**
 * Retorna uma lista com a descrição dos itens da lista principal do componente lista dupla<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Componente do tipo Lista Dupla<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna uma Lista que deve ser atribuída a uma variável do tipo variante.
 */
function ebfGetDualListLeftText(component) {	
	var selectIN = $c(component).leftSelect;
	if(selectIN) {
		var arrElements = new Array();

		if (selectIN.options.length > 0) {
			for (var i = 0; i < selectIN.options.length; i++) {
				var text = selectIN.options[i].text;
				
				arrElements.push(text);
			}
		}
		
	} else
		throw "O componente não é Lista Dupla";
	
	
	return arrElements;
}

/**
 * Retorna uma lista com os valores dos campos chaves dos itens da lista principal do componente lista dupla<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Componente do tipo Lista Dupla<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna uma Lista que deve ser atribuída a uma variável do tipo variante.
 */
function ebfGetDualListLeftValue(component) {
	var selectIN = $c(component).leftSelect;
	if(selectIN) {
		var arrElements = new Array();

		if (selectIN.options.length > 0) {
			for (var i = 0; i < selectIN.options.length; i++) {
				var text = selectIN.options[i].value;
				
				arrElements.push(text);
			}
		}
		
	} else
		throw "O componente não é Lista Dupla";
	
	
	return arrElements;
}

/**
 * Retorna uma lista com a descrição dos itens da lista de selecionados do componente lista dupla<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Componente do tipo Lista Dupla<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna uma Lista que deve ser atribuída a uma variável do tipo variante.
 */
function ebfGetDualListRightText(component) {
	var selectIN = $c(component).rightSelect;
	if(selectIN) {
		var arrElements = new Array();

		if (selectIN.options.length > 0) {
			for (var i = 0; i < selectIN.options.length; i++) {
				var text = selectIN.options[i].text;
				
				arrElements.push(text);
			}
		}
		
	} else
		throw "O componente não é Lista Dupla";
	
	
	return arrElements;
}

/**
 * Retorna uma lista com os valores dos campos chaves dos itens da lista de selecionados do componente lista dupla<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Componente do tipo Lista Dupla<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna uma Lista que deve ser atribuída a uma variável do tipo variante.
 */
function ebfGetDualListRightValue(component) {
	var selectIN = $c(component).rightSelect;
	if(selectIN) {
		var arrElements = new Array();

		if (selectIN.options.length > 0) {
			for (var i = 0; i < selectIN.options.length; i++) {
				var text = selectIN.options[i].value;
				
				arrElements.push(text);
			}
		}
		
	} else
		throw "O componente não é Lista Dupla";
	
	
	return arrElements;
}

/**
 * Essa função busca e retorna o elemento, que deseja obter, a partir da sua posição na lista. <br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Objeto Lista<br/>
 * 2. Posição do elemento na lista que deseja obter<br/>
 * <br/>
 * Retorno:<br/>
 * Elemento correspondente à posição, passada no 2º parâmetro, na lista. O retorno da função pode ser armazenado numa variável do tipo variante.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo que o 1º parâmetro seja uma lista com os seguintes valores: {a, b, c, d, e, f, g, h}, o 2º parâmetro seja 3. <br/>
 *     O retorno será "c", pois o elemento que está na posição 3 da lista é o "c".<br/>
 * 2. Assumindo que o 1º parâmetro seja uma lista com os seguintes valores: {2, 5, 8, 9}, o 2º parâmetro seja 1. O retorno será "2", pois o elemento que está na posição 1 da lista é o "2".
 */
function ebfGetElementFromList() {
  var value = null;
  if (existArgs(arguments)) {
    var position = parseInt(arguments[1]) - 1;
    position = Math.max(0, position);
    position = Math.min(position, (arguments[0].length - 1));
    value = arguments[0][position];
  }
  return value;
}

/**
 * Função que obtém o Nome do componente em foco.<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não possui.<br/>
 * <br/>
 * Retorno:<br/>
 * Nome do Componente em Foco.
 */
function ebfGetFocusedComponent(){
   if(controller && controller.activeElement)
     return controller.activeElement.id;
}

/**
 * Obtém a janela (instância) do formulário definido no parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Tipo: Formulário (Selecionar na lista) ou Letras (GUID do Formulário)<br/>
 * <br/>
 * Retorno:<br/>
 * Referência do Formulário. (Variante).
 */
function searchFormByGUIDGetFormByGuid(currentForm,GUID){
  if (currentForm && currentForm.formGUID == GUID){
    return currentForm;
  }

  if (currentForm && currentForm.mainform && currentForm.mainform.formGUID == GUID){
    return currentForm.mainform;
  }
  if (currentForm.children){
    for (var i=0;i<currentForm.children.length;i++){
      try {
        if (currentForm.children[i].mainform){
          if (currentForm.children[i].mainform.formGUID == GUID){
            return currentForm.children[i].mainform;
          }
          var returnForm = searchFormByGUIDGetFormByGuid(currentForm.children[i],GUID);
          if (returnForm){
            return returnForm;
          }
        }
      }catch(e){}
    }
  }
}

function ebfGetFormByGuid(formGUID) {
  var mainWindow = $mainform();
  while(getOpenerWindow(mainWindow) != null) {
    mainWindow = getOpenerWindow(mainWindow);
  }
  return searchFormByGUIDGetFormByGuid(mainWindow, formGUID);
}

/**
 * A função retorna o código do formulário chamado no fluxo.<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não Possui.<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna o código do formulário que chama o fluxo (Letras ou Inteiro).<br/>
 * <br/>
 * Exemplo:<br/>
 * 1. Assumindo que o formulário "Cadastro"  chama o fluxo, o retorno seria 9 (inteiro - Código do formulário "Cadastro").
 */
function ebfGetFormID() {
  if ((d != undefined) && (d.WFRForm != undefined)) {
    return d.WFRForm.formID.value;
  } else {
    return undefined;
  }
}

/**
 * Obtém o ID do formulário.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Deve ser utilizada a função Obter Formulário Atual ou Obter Janela do Formulário, pois este parâmetro espera a referência<br/>
 * do formulário.<br/>
 * <br/>
 * Retorno:<br/>
 * ID do Formulário
 */
function ebfGetIdForm(formActual) {

    return formActual.idForm;
	
}

/**
 * Obtém a referência do formulário a partir do qual um outro formulário foi aberto; normalmente abertos através de botões, dentre outros.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Utilize a função Obter Formulário Atual<br/>
 * <br/>
 * Retorno:<br/>
 * Referência do Formulário a partir do qual um formulário foi aberto.
 */
function ebfGetOpenerForm(formActual) {
  return formActual.top.opener.$mainform();	
}

/**
 * Obtém a referência do formulário a partir do qual um outro formulário foi aberto; normalmente aberto na moldura de um<br/>
 * formulário.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Utilize a função Obter Formulário Atual<br/>
 * <br/>
 * Retorno:<br/>
 * Referência do Formulário a partir do qual outro formulário foi aberto. (Variante)
 */
function ebfGetParentForm(formActual) {
  return formActual.top.parent.$mainform();	
}

/**
 * Obtém o elemento raiz da árvore passada por parâmetro.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Árvore<br/>
 * <br/>
 * Retorno:  <br/>
 * Raiz da árvore (Variante).<br/>
 * <br/>
 * Observação:<br/>
 * A árvore pode ser obtida através da função "Obter Componente" da categoria Formulário.
 */
function ebfGetRoot(tree){	
  return tree.getRoot();	
}

/**
 * Obtém o nome do fluxo em que a função se encontra.<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não possui.<br/>
 * <br/>
 * Retorno: <br/>
 * Nome do fluxo (Letras)
 */
function ebfGetRuleName() {
  return this.getRuleName();
}

/**
 * Obtém o conteúdo da variável criada pela função "Definir variável de sessão" passando no 1º parâmetro o nome da<br/>
 * variável e no 2ºparâmetro o valor lógico verdadeiro ou falso, indicando se é ou não uma variável global. Para variáveis<br/>
 * globais usa-se verdadeiro, para não globais usa-se falso.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome da Variável<br/>
 * 2. Valor Lógico.<br/>
 * <br/>
 * Retorno:<br/>
 * Retorna o conteúdo da variável passada no primeiro parâmetro caso ela já exista. Caso ela ainda não tenha sido definida,<br/>
 * retorna Nulo.<br/>
 * <br/>
 * Observação: <br/>
 * Para obter uma variável de sessão é necessário antes definir essa variável utilizando a função "Definir variável de sessão" <br/>
 * da categoria &#147;Utilitários&#148;.<br/>
 * <br/>
 * Exemplos: <br/>
 * Assumindo como parâmetros "Contador" (Letras) e verdadeiro (Lógico). Se existir uma variável global com o nome <br/>
 * "Contador" o retorno seria o conteúdo dessa variável. Caso não exista, o retorno seria nulo.
 */
function ebfGetSessionAttribute(name, global){
  var content = getContent("sessionManager.do?sys=" + sysCode + "&nome=" + name + "&global=" + global + "&acao=get");
  var ajaxReturn = eval(content);
  if (ajaxReturn) {
    return ajaxReturn;
  } else {
    return "";
  }
}

/**
 * A função retorna o Código (ou sigla) do sistema atual em que o fluxo está sendo desenvolvido (3 letras).<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não Possui.<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna o código (ou sigla) do sistema  utilizado.<br/>
 * <br/>
 * Exemplo:<br/>
 * 1. Se o fluxo estivesse sendo desenvolvido no Sistema de Contabilidade Pública o código do Sistema seria "CTP" (Letras).
 */
function ebfGetSystemID() {
  if ((d != undefined) && (d.WFRForm != undefined)) {
    return d.WFRForm.sys.value.toString().substring(0, 3);
  } else {
    return sysCode.toString().substring(0, 3);
  }
}

/**
 * Recebe uma data como parâmetro e obtém os milisegundos da data desde 1970.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Data<br/>
 * <br/>
 * Retorno:<br/>
 * Milisegundos.
 */
function ebfGetTimeFromDataSince70(dateVar){
  var date;
  if (dateVar == null || dateVar == '')
    return null;
  if (dateVar instanceof Date){
    date = dateVar;
  }else{
    date = new Date(dateVar);
  }  

  return date.getTime();
}

/**
 * Essa função calcula a quantidade de milisegundos do ano de 1970 até o dia atual.<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não possui.<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna a quantidade de milisegundos. O retorno pode ser atribuído a uma variável do tipo variante.
 */
function ebfGetTimeSince70() {
  var date = new Date();
  return date.getTime();
}

/**
 * Calcula a média de valores contidos em uma coluna. Os parâmetros passados <br/>
 * correspondem ao nome do formulário, o nome da grade e o campo que terá seus valores comparados.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome do Formulário<br/>
 * 2. Nome da Grade<br/>
 * 3. Nome do Campo<br/>
 * <br/>
 * Retorno:<br/>
 * Média entre os valores referente ao campo informado (Numero)<br/>
 * <br/>
 * Ex.<br/>
 * GRADE:   USUARIO<br/>
 * Campos: CODIGO,NOME,IDADE<br/>
 * No campo IDADE existe os valores: ( 18;25;14;32;30;29 )<br/>
 * Os parâmetros passados para a função serão:<br/>
 * - Nome do Formulário<br/>
 * - Nome da grade (USUARIO)<br/>
 * - Nome do campo (IDADE)<br/>
 * <br/>
 * O valor retornado será: (24,6)<br/>
 * <br/>
 * Observações:<br/>
 * 1. RESULTADOS DA FUNÇÃO<br/>
 *  A função, quando usada no 'fluxo cliente', retorna a média entre os valores apenas dos dados visualizados na grade, se estiver sendo usada<br/>
 * a "paginação" na grade, os valores das páginas omitidas não serão verificados.<br/>
 * Já os fluxos do modo Servidor, a verificação dos valores é feita em todos os registros da grid (podendo estes estarem <br/>
 * como paginados ou não). <br/>
 * <br/>
 * 2. MODO INSERÇÃO OU ALTERAÇÃO<br/>
 * 2) Caso a função venha a ser usada com o formulario estando no modo de inserção ou alteração, deverá ser usado um<br/>
 * fluxo do modo cliente para que se obtenha o resultado.
 */
function ebfGridAVGColumn(form, grid, column) {
  var sum = 0;
  var total = 0;
  var avg = 0;
  var grid = $c(grid);
  
    
  if (!grid) throw "Componente " + grid + " não encontrado";  
  var qtdLinhas = grid.data.length;
  for (var i =0; i<=qtdLinhas ;i++){    
    if(i<qtdLinhas){ 
      sum = parseNumeric(grid.data[i][grid.findColumn(column)]);
      total = total + sum;  
    }  
    else
      avg = total / i;  
  }
  return avg;                           

     
}

/**
 * Essa função adiciona uma coluna na Grade, informando o nome da grade e o nome da coluna que será adicionada.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome da Grade<br/>
 * 2. Nome da Coluna a ser adicionada<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo o 1º parâmetro sendo Grade Nomes e o 2 º parâmetro sendo Sobrenome. Passando esses parâmetros, <br/>
 * será adicionado à Grade Nomes uma coluna com o nome Sobrenome.
 */
function ebfGridAddColumn(grid, column) {
  var grid = $c(grid);
  if (!grid)
    throw "Componente "+grid+" não encontrado"; 
  grid.addColumn(column);
}

/**
 * Função que altera a posição da barra de rolagem Horizontal em relação à extremidade esquerda da grade.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário onde se encontra a grade;<br/>
 * 2. Nome do componente do tipo grade;<br/>
 * 3. Novo valor da distância da barra horizontal.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function ebfGridChangeScrollLeftValue(form, com, value){
  if(com){
    var grid = $c(com);
    if(grid.scrollLeft){
      grid.scrollLeft(value);
    } 
  }
}

/**
 * Função que altera a posição da barra de rolagem Vertical em relação ao topo da grade.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário onde se encontra a grade;<br/>
 * 2. Nome do componente do tipo grade;<br/>
 * 3. Novo valor da distância da barra vertical.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function ebfGridChangeScrollTopValue(form, com, value){
  if(com){
    var grid = $c(com);
    if(grid.scrollTop){
      grid.scrollTop(value);
    } 
  }
}

/**
 * Essa função retorna o código da coluna. Informando a Grade e o nome da coluna que deseja saber o código.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome da Grade<br/>
 * 2. Nome da Coluna<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna o código da coluna. <br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo o 1º parâmetro sendo "Venda" e o 2º parâmetro "Produto". Passando esse parâmetro, o retorno será o código da coluna "Produto".
 */
function ebfGridColumnCode(grid, column) {
  var grid = $c(grid);
  if (!grid)
    throw "Componente "+grid+" não encontrado"; 
  return grid.getColumnCode(column);
}

/**
 * Cria relação de dependência entre duas grids.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Grade Pai (Mestre)<br/>
 * 2. Grade Filha<br/>
 * 3. Filtro de ligação no formato: <Tabela da Grid Filha>.<Campo 1 da Grid Filha>=<Campo da Grid Master>[;<Tabela da Grid Filha>.<Campo 2 da Grid Filha>=<Campo da Grid Master>[;<Tabela da Grid Filha>.<Campo N da Grid Filha>=<Campo da Grid Master>]]. <br/>
 * Ex: 1) TB_FILHA.CAMPO_FILHA=CAMPO_MASTER<br/>
 *       2) TB_CIDADE.COD_PAIS=COD_PAIS<br/>
 *       3) TB_CIDADE.COD_PAIS=COD_PAIS;TB_CIDADE.COD_CIDADE=COD_CIDADE
 */
function ebfGridCreateDependence(grid1, grid2, filter) {
  $c(grid1).addDependentGrid(grid2, filter);
}

/**
 * Volta ao modo de navegação da grade editável se ela estiver em modo de inserção ou em modo de edição.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome da grade <br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observações:<br/>
 * 1. A grade precisa ser editável
 */
function ebfGridEditableCancel(grid) {
  var grid = $c(grid);
  if (!grid)
    throw "Componente "+grid+" não encontrado"; 
  grid.cancel();
}

/**
 * Exclui o registro selecionado da grade editável passada como parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 *  1. Nome da grade<br/>
 * <br/>
 * Observações:<br/>
 *  1. A grade precisa ser editável
 */
function ebfGridEditableDeleteRow(grid) {
  var grid = $c(grid);
  if (!grid)
    throw "Componente "+grid+" não encontrado"; 
  if (!(grid.editing || grid.inserting)){
    grid.deleteRow();
  }               
}

/**
 * Entra em modo de edição com a grade.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome da grade<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observações:<br/>
 *  1. Só funciona se a grade não estiver em modo de inserção<br/>
 *  2. A grade precisa estar com uma linha selecionada, caso contrario, entrará em modo de edição com a primeira linha.
 */
function ebfGridEditableEdit(grid) {
  var grid = $c(grid);
  if (!grid)
    throw "Componente "+grid+" não encontrado"; 
  if (grid.editable){  
    if (!(grid.editing || grid.inserting)){
      if (!grid.nav) grid.nav = {};  
      if (!grid.nav.btEdit) grid.nav.btEdit = {};
      grid.timeout(grid.edit, 0);
    }      
  }else{
    if (grid.callForm){
      if (!grid.enabled || grid.readOnly || !grid.parentHasData) return;
      var gridrn = grid.grid.getProperty("selection/index");
      if (gridrn > grid.data.length-1) gridrn = -2;
      var gridini = grid.gridini;
      var left = (screen.width - grid.formWidth) / 2;
      var top = (screen.height - grid.formHeight) / 2;
      var gt = 1 + parseInt(gridrn) + parseInt(grid.gridini);
      if (gt > 0)
        MM_openBrWindow('form.jsp?sys='+grid.sys+'&action=openform&formID='+grid.formCode+'&align=1&mode=2&goto='+gt+'&filter=&onClose=opener.d.c_'+grid.code+'.refreshPage()',grid.formCode,'toolbar=no,location=no,status=yes,menubar=no,scrollbars=no,resizable=no,width='+grid.formWidth+',height='+grid.formHeight+',left='+left+',top='+top);
    }
  }      
}

/**
 * Entra em modo de inserção com a grade.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome da grade<br/>
 * <br/>
 * Observações:<br/>
 * 1. Ela não pode estar em modo de edição
 */
function ebfGridEditableInclude(grid) {
  var grid = $c(grid);
  if (!grid)
    throw "Componente "+grid+" não encontrado";
  if (grid.editable){  
    if (!grid.nav) grid.nav = {};  
    if (!grid.nav.btInclude) grid.nav.btInclude = {};     
    grid.timeout(grid.include, 0);        
  }else{
    if (grid.callForm){
      if (!grid.enabled || grid.readOnly || !grid.parentHasData) return;
      var gridrn = grid.grid.getProperty("selection/index");
      if (gridrn > grid.data.length-1) gridrn = -2;
      var gridini = grid.gridini;
      var left = (screen.width - grid.formWidth) / 2;
      var top = (screen.height - grid.formHeight) / 2;
      var gt = 1 + parseInt(gridrn) + parseInt(grid.gridini);
      MM_openBrWindow('form.jsp?sys='+grid.sys+'&action=openform&formID='+grid.formCode+'&align=1&mode=1&goto='+gt+'&filter=&onClose=opener.d.c_'+grid.code+'.refreshPage()',grid.formCode,'toolbar=no,location=no,status=yes,menubar=no,scrollbars=no,resizable=no,width='+grid.formWidth+',height='+grid.formHeight+',left='+left+',top='+top);
    }
  }
}

/**
 * Grava o registro que estiver sendo inserido ou alterado.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome da grade<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observações:<br/>
 * 1. A grade precisa ser editável e estar no modo de inserção ou edição no momento em que a função for chamada.
 */
function ebfGridEditablePost(grid) {
  var grid = $c(grid);
  if (!grid)
    throw "Componente "+grid+" não encontrado"; 
  grid.post();
}

/**
 * Filtra um componente grade de acordo com a condição passada.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Grid a ser filtrada<br/>
 * 2. Filtro de ligação no formato: <Tabela da Grid>.<Campo 1 da Grid>=<Valor>[;<Tabela da Grid>.<Campo 2 da Grid >=<valor>[;<Tabela da Grid>.<Campo N da Grid>=<valor>]]. <br/>
 * <br/>
 * Ex: 1) TB_FILHA.CAMPO_FILHA=Teste<br/>
 *       2) TB_CIDADE.COD_PAIS=55<br/>
 *       3) TB_CIDADE.COD_PAIS=55;TB_CIDADE.COD_CIDADE=856<br/>
 * <br/>
 * Observações: <br/>
 * 1. O único operador que pode ser utilizado como filtro é o operador "=" (igual).<br/>
 * 2. Para utilizar tipos específicos de dados como data, o valor deve ser concatenado com algumas constantes.<br/>
 * Os tipos possíveis são: long, double, boolean, date, timestamp.<br/>
 * <br/>
 * Exemplo de uso:<br/>
 * TABELA.CAMPO = 05/12/2009@date
 */
function ebfGridFilter(grid, filter) {
  $c(grid).filter(filter);
}

/**
 * Essa função encontra a posição da coluna na grade.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome da Grade<br/>
 * 2. Número da Coluna<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna a posição da coluna. Se a coluna for a primeira da Grade retorna o valor 0, se for a segunda retorna 1 e assim sucessivamente. <br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo o 1º parâmetro sendo "Grade Produtos"e o 2 º parâmetro sendo "Informática". Passando esses parâmetros, será  verificado em que posição a coluna "Informática"  está na Grade "Grade Produtos".<br/>
 * <br/>
 * Observações: <br/>
 * A numeração das colunas começam de 0 à N.
 */
function ebfGridFindColumn(grid, column) {
  var grid = $c(grid);
  if (!grid)
    throw "Componente "+grid+" não encontrado";
  try {   
    return grid.findColumn(column);
  } catch(e) {
    return -1;
  }  
}

/**
 * Essa função retorna um valor inteiro que identifica o estado do componente CheckBox na Grade, a partir da informação <br/>
 * da linha e a coluna que deseja obter o valor.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome da Grade<br/>
 * 2. Número da Linha<br/>
 * 3. Nome da Coluna que se encontra o componente CheckBox<br/>
 * <br/>
 * Retorno: <br/>
 * Número referente ao valor do check (inteiro)<br/>
 * 0 - Desmarcado<br/>
 * 1 - Marcado<br/>
 * 2 - Neutro
 */
function ebfGridGetCheckValue(grid, row, column) {
  var grid = $c(grid);
    if (!grid)
      throw "Componente "+grid+" não encontrado"; 
      var check = grid.getDataByColumn(row, column);

       if (check != null){
         if(check.indexOf("uncheck") != -1) {
 	   return 0;
         }
         if(check.indexOf("unknowcheck") != -1) {
 	   return 2;
         }
          if(check.indexOf("check") != -1) {
 	   return 1;
         }  
     }
}

/**
 * Função que retorna qual é o primeiro elemento real da grade, já que a mesma pode ter paginada e não estar mais na<br/>
 * página inicial.<br/>
 * <br/>
 * Parametros:<br/>
 * 1. Componente Grade<br/>
 * <br/>
 * Retorno:<br/>
 * Retorna o primeiro elemento real da grade (inteiro)
 */
function ebfGridGetOffset(grid) {
  var grid = $c(grid);
  if (!grid)
    throw "Componente "+grid+" não encontrado"; 
  return grid.gridini;
}

/**
 * Função que retorna a distância em pixels da barra de rolagem no sentido horizontal.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário onde se encontra a grade.<br/>
 * 2. Nome do componente do tipo grade cuja distância da barra de rolagem do topo se deseja obter.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function ebfGridGetScrollLeftValue(form, com){
  if(com){
    var grid = $c(com);
    if(grid.scroll && grid.scroll.element)
      return grid.scroll.element().scrollLeft;
  }
  return null;
}

/**
 * Função que retorna a distância em pixels da barra de rolagem no sentido vertical<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário onde se encontra a grade<br/>
 * 2. Nome do componente do tipo grade<br/>
 * <br/>
 * Retorno:<br/>
 * Distância em pixels da barra de rolagem no sentido vertical.
 */
function ebfGridGetScrollTopValue(form, com){
  if(com){
    var grid = $c(com);
    if(grid.scroll && grid.scroll.element)
      return grid.scroll.element().scrollTop;
  }
  return null;
}

/**
 * Essa função retorna o número da linha selecionada na grade. Informando apenas a Grade<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome da Grade<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna o numero da linha selecionada. <br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo o 1º parâmetro sendo "Sistemas". Passando esse parâmetro, ao selecionar alguma linha da Grade <br/>
 * "Sistemas", o retorno será o número da linha selecionada.
 */
function ebfGridGetSelectedRow(grid) {
  var grid = $c(grid);
  if (!grid)
    throw "Componente "+grid+" não encontrado"; 
  return grid.getSelectedRow();
}

/**
 * Função que retorna estado da grade.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário onde o componente do tipo grade se encontra;<br/>
 * 2. Componente do tipo grade.<br/>
 * <br/>
 * Retorno:<br/>
 *    "edição" - se a grade estiver em modo de edição.<br/>
 *    "inserção" - se a grade estiver em modo de inserção.<br/>
 *    "normal" - se estiver em modo normal.
 */
function ebfGridGetStatus(form, com){

  var grid = $c(com);
  if(!grid){
    throw "O componente passado é nulo!"
  }
  if(!(grid instanceof HTMLGrid)){
    throw "O componente passado por parâmetro não é uma grade!"
  }
  
  if(grid.inserting){
    return "inserção";
  }

  if(grid.editing){
    return "edição";
  }
  
  return "normal";
}

/**
 * Essa função retorna o valor que está na Grade, a partir da informação da linha (a primeira linha da Grade é <br/>
 * a linha "0" (zero)) e a coluna que deseja obter o valor.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Componente Grade<br/>
 * 2. Número da Linha (N-1)<br/>
 * 3. Nome da Coluna<br/>
 * <br/>
 * Retorno:<br/>
 * Valor obtido. (Letras)<br/>
 * <br/>
 * Observação: O primeiro parâmetro desta função também pode ser modificado para a "Constante" do tipo <br/>
 * "Letras", sendo informado manualmente o nome do componente "Grade".<br/>
 * <br/>
 * Exemplos: <br/>
 * 1.  Assumindo o 1º parâmetro sendo "Registros", o 2º sendo 2 e o 3º parâmetro sendo "Nome". Passando esse parâmetro, o retorno será o valor que está na linha 3 da coluna "Nome" da Grade "Registros".
 */
function ebfGridGetValue(grid, row, column) {
	  var grid = $c(grid);
	  if (!grid)
	    throw "Componente "+grid+" não encontrado"; 
	  if ((grid.getDataByColumn(row, column)=='&nbsp;')||(grid.getDataByColumn(row, column)==null))
		  return ""; 
	  return grid.getDataByColumn(row, column);
	}

/**
 * Função que oculta a coluna de uma grade.<br/>
 * <br/>
 * Parametros:<br/>
 * 1. Formulário;<br/>
 * 2. Componente Grade;<br/>
 * 3. Nome da coluna<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui
 */
function ebfGridHideColumn(form, grid, column){
  if(!grid){
    throw "A grid não foi encontrada";
  }
  var grid = $c(grid);
  var code = grid.code;
  var idx = grid.findColumn(column);
  d.getElementById('grid'+code+'.top.item:'+idx+'/box').style.color = '#EBEADB';

  var linhas = d.getElementById('grid'+code+'.layout/data');
  var dados = linhas.childNodes;

  for(i = 0; i<dados.length; i++){
    dadosFilhos = dados[i].childNodes;
    for(j=0;j<dadosFilhos.length;j++){
      if(j==idx){
        dadosFilhos[idx].style.color = '#FFFFFF';
      }
    }
  }
}

/**
 * Essa função acrescenta uma linha na grade.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome da Grade<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo o 1º parâmetro sendo "Grade Vendas". Passando esse parâmetro, será inserida uma linha na Grade "Grade Vendas".
 */
function ebfGridInsertRow(grid) {
  var grid = $c(grid);
  if (!grid)
    throw "Componente "+grid+" não encontrado"; 
  grid.includeNewRow();
}

/**
 * Essa função acrescenta uma linha na grade e não dá refresh na grid, o que aumenta o desempenho.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome da Grade<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo o 1º parâmetro sendo "Grade Vendas". Passando esse parâmetro, será inserida uma linha na Grade "Grade Vendas".
 */
function ebfGridInsertRowWithoutRefresh(grid) {
  var grid = $c(grid);
  if (!grid)
    throw "Componente "+grid+" não encontrado";
  
  var newdata = new Array(grid.columns.length);
  for (var i =0; i<newdata.length; i++) { 
    newdata[i] = '';
  }  
  grid.data.push(newdata);
  grid.grid.setRowProperty("count", grid.data.length);
}

/**
 * Obtem o máximo valor de uma coluna. Os parâmetros passados <br/>
 * correspondem ao nome do formulário, o nome da grade e o campo que terá seus valores comparados.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário onde está localizada a grade.<br/>
 * 2. Componente Grade<br/>
 * 3. Nome do Campo<br/>
 * <br/>
 * Retorno:<br/>
 * Valor máximo referente ao campo informado (Número)<br/>
 * <br/>
 * Ex.<br/>
 * GRADE:   USUARIO<br/>
 * Campos: CODIGO,NOME,IDADE<br/>
 * No campo IDADE existe os valores: ( 18;25;14;32;30;29 )<br/>
 * Os parâmetros passados para a função serão:<br/>
 * - Nome do Formulário<br/>
 * - Nome da grade (USUARIO)<br/>
 * - Nome do campo (IDADE)<br/>
 * <br/>
 * O valor retornado será: (32)<br/>
 * <br/>
 * Observação:<br/>
 * 1. RESULTADOS DA FUNÇÃO<br/>
 *  A função, quando usada no 'fluxo cliente', retorna o MÁXIMO valor encontrado apenas dos dados visualizados na grade. <br/>
 * Caso estiver sendo usada a "paginação" na grade, os valores das páginas omitidas não serão verificados.<br/>
 * Já os fluxos do modo Servidor, a verificação dos valores é feita em todos os registros da grid (podendo estes estarem <br/>
 * paginados ou não). <br/>
 * O retorno da função Servidor são dados do tipo fracionado. Caso o campo seja do inteiro o resultado será do tipo<br/>
 * fracionado.<br/>
 * <br/>
 * 2. MODO INSERÇÃO OU ALTERAÇÃO<br/>
 * 2) Caso a função venha a ser usada com o formulario estando no modo de inserção ou alteração, deverá ser usado um<br/>
 * fluxo do modo cliente para que se obtenha o resultado.
 */
function ebfGridMaxColumn(form, grid, column) {
  var valor = 0;
  var maximo = 0;
  var grid = $c(grid);
  if (!grid) throw "Componente " + grid + " não encontrado";
  
  var qtdLinhas = grid.data.length;
  for (var i =0; i<qtdLinhas ;i++){     
    valor = parseNumeric(grid.data[i][grid.findColumn(column)]);
    if(valor > maximo)
      maximo = valor;      
  }
  return maximo;   
}

/**
 * Obtem o menor valor de uma determinada coluna. Os parâmetros passados <br/>
 * correspondem ao nome do formulário, o nome da grade e o campo que terá seus valores comparados.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome do Formulário<br/>
 * 2. Nome da Grade<br/>
 * 3. Nome do Campo<br/>
 * <br/>
 * Retorno:<br/>
 * Valor mínimo referente ao campo informado (Número)<br/>
 * <br/>
 * Ex.<br/>
 * GRADE:   USUARIO<br/>
 * Campos: CODIGO,NOME,IDADE<br/>
 * No campo IDADE existe os valores: ( 18;25;14;32;30;29 )<br/>
 * Os parâmetros passados para a função serão:<br/>
 * - Nome do Formulário<br/>
 * - Nome da grade (USUARIO)<br/>
 * - Nome do campo (IDADE)<br/>
 * <br/>
 * O valor retornado será: (14)<br/>
 * <br/>
 * Observações:<br/>
 * 1. RESULTADOS DA FUNÇÃO<br/>
 *  A função, quando usada no 'fluxo cliente', retorna o MÍNIMO valor encontrado apenas dos dados visualizados na grade. <br/>
 * Caso estiver sendo usada a "paginação" na grade, os valores das páginas omitidas não serão verificados.<br/>
 * Já os fluxos do modo Servidor, a verificação dos valores é feita em todos os registros da grid (podendo estes estarem <br/>
 * paginados ou não). <br/>
 * O fluxo se em camada Servidor sempre retorna o valor em Fracionado.<br/>
 * <br/>
 * 2. MODO INSERÇÃO OU ALTERAÇÃO<br/>
 * 2) Caso a função venha a ser usada com o formulario estando no modo de inserção ou alteração, deverá ser usado um<br/>
 * fluxo do modo cliente para que se obtenha o resultado.
 */
function ebfGridMinColumn(form, grid, column) {
  var valor = 0;
  var minimo = 0;
  var grid = $c(grid);
  if (!grid) throw "Componente " + grid + " não encontrado";
  
  var qtdLinhas = grid.data.length;
  for (var i =0; i<qtdLinhas ;i++){     
    valor = parseNumeric(grid.data[i][grid.findColumn(column)]);
    if(i == 0)
      minimo = valor;
    else if(valor < minimo)
      minimo = valor;      
  }
  return minimo;   
}

/**
 * Altera a largura de uma ou mais colunas de uma grade<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário onde está localizada a grade.<br/>
 * 2. Componente grade a ser alterado.<br/>
 * 3. Lista com as colunas que terão a largura modificada.<br/>
 * 4. Lista contendo os valores da largura das colunas.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function ebfGridModifyColumnsWidth(formName, gridName, columnList, widthList) {
  var grid = $c(gridName);
  for (var i = 0; i < columnList.length; i++) {
    var columnIndex = grid.findColumn(columnList[i]);
    var selector = "#" + grid.grid.getId() + " .active-column-" + columnIndex;
    var ss = document.styleSheets[document.styleSheets.length-1];
    var foundSelector = false;
    for(var j = 0; j < ss.rules.length; j++) {
      if(ss.rules[j].selectorText == selector) {
        foundSelector = true;
        ss.rules[j].style.width = widthList[i] + "px";
      }
    }
    if (!foundSelector) {
      grid.stylesheet.addRule(selector, 'width: '+ widthList[i] + "px;");
    }
  }
  grid.grid.refresh(); 
}

/**
 * Atualiza o componente grade.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome do componente grade.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function ebfGridRefresh(grid) {
  var grid = $c(grid);
  if (!grid)
    throw "Componente "+grid+" não encontrado"; 
  grid.grid.refresh();
}

/**
 * Essa função remove uma coluna da Grade. Passando como parâmetro a Grade e o nome da coluna que deseja remover.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome da Grade<br/>
 * 2. Nome da Coluna<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo o 1º parâmetro sendo "Estado" e o 2º sendo "UF". Ao chamar à função a coluna "UF" será removida da <br/>
 * Grade "Estado".
 */
function ebfGridRemoveColumn(grid, column) {
  var grid = $c(grid);
  if (!grid)
    throw "Componente "+grid+" não encontrado"; 
  grid.removeColumn(column);
}

/**
 * Essa função remove uma Linha da Grade. Passando como parâmetro a Grade e o número da linha que deseja remover.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome da Grade<br/>
 * 2. Número da Linha (De 0 à N)<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo o 1º parâmetro sendo "Carros" e o 2º sendo 2. Ao chamar à função a Linha 2 será removida da Grade "Carros".
 */
function ebfGridRemoveRow(grid, row) {
  var grid = $c(grid);
  if (!grid)
    throw "Componente "+grid+" não encontrado"; 
  grid.removeDataRow(row);
}

/**
 * Essa função retorna o total de linha que existe na grade. Informando apenas a Grade.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome da Grade<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna o total de linha da Grade. <br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo o 1º parâmetro sendo "Usuários". Passando esse parâmetro, ao chamar a função, o retorno será o total de<br/>
 * linhas da Grade "Usuários".
 */
function ebfGridRowCount(grid) {
  var grid = $c(grid);
  if (!grid)
    throw "Componente "+grid+" não encontrado"; 
  return grid.getRowCount();
}

/**
 * Essa função seleciona uma Linha da Grade. Passando como parâmetro a Grade e o número da linha que deseja selecionar.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome da Grade<br/>
 * 2. Número da Linha (De 0 à N)<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo o 1º parâmetro sendo "Carros" e o 2º sendo 2. Ao chamar à função a Linha 2 será selecionada da Grade "Carros".
 */
function ebfGridSelectRow(grid, row) {
  var grid = $c(grid);
  if (!grid)
    throw "Componente "+grid+" não encontrado";
  grid.timeout(grid.selectRow, 0, [row]);
}

/**
 * Altera o valor do CheckBox na grade.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome da Grade<br/>
 * 2. Número da Linha<br/>
 * 3. Nome da Coluna que se encontra o componente CheckBox<br/>
 * 4. Valor inteiro (0- Desmarcar, 1- Marcar,  2- Nulo).<br/>
 * <br/>
 * Retorno<br/>
 * Não Possui<br/>
 * <br/>
 * Observações:<br/>
 * Não possui interação com o banco de dados, ou seja, só modifica o valor na grade, porem o conteúdo no banco continua<br/>
 * sendo o mesmo.
 */
function ebfGridSetCheckValue (grid, row, column, value) {
  var componentGrid = $c(grid);
  var check = componentGrid.getDataByColumn(row, column);
  
  var regex = new RegExp("(src=\").+?(\".+state=\").+?(\")", "gi");
  if (value == 0){
    check = check.replace(regex,"$1"+skin+"uncheck.gif$2"+value+"$3");
  } else if (value == 1){
    check = check.replace(regex,"$1"+skin+"check.gif$2"+value+"$3");             
  } else if (value == 2) {
    check = check.replace(regex,"$1"+skin+"unknowcheck.gif$2"+value+"$3");
  }
  
  if (value == 0 || value == 1 || value == 2) {
    ebfGridSetValue(grid, row, column, check);
  }
}

/**
 * Altera a cor de uma linha da grade ou apenas algumas colunas da grade.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário que contém a grade<br/>
 * 2. Componente grade que se deseja pintar<br/>
 * 3. Linha que deve ser alterada (primeira linha é 0)<br/>
 * 4. Cor desejada<br/>
 * 5. Lista contendo as colunas que devem ser pintadas (primeira coluna é 0)<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui<br/>
 * <br/>
 * Observação:<br/>
 * 1. Caso o parâmetro 5 seja definido como Nulo, então toda a linha será pintada.
 */
function ebfGridSetColor(form, gridName, line, color, columns) {
  line = parseInt(line);
	
  var gridObj = $c(gridName, form);
	
  if (!gridObj) {
    throw "Grid \"" + gridName + "\" not found.";
  }
  if (gridObj.nav.mode != 0) {
    return false;
  }
	
  if (columns != null && columns.length > 0) {
    for (var i = 0; i < columns.length; i++) {
    	var column = parseInt(columns[i]);
      var template = gridObj.grid.getColumnTemplate(column);
      if (!template.colorsRow) {
        template.colorsRow = new Array();
      }
      template.colorsRow[line] = color;
      var selectColorRow = function() {
        return this.colorsRow[this.getProperty("row/index")];
      };
      template.setStyle("background-color", selectColorRow);
      template.parent = gridObj;
      template.setEvent("click",    function() { this.parent.clickEditableRow(this); } );
      template.setEvent("dblclick", function() { this.parent.dblClickEditableRow(this); } );
    }
  } else {
    var template = gridObj.grid.getTemplate("row");
    if (!template.colorsRow) {
      template.colorsRow = new Array();
    }
    template.colorsRow[line] = color;
    var selectColorRow = function() {
      return this.colorsRow[this.getProperty("row/index")];
    };
    template.setStyle("background", selectColorRow);
  }
  
  gridObj.grid.refresh();
}

/**
 * Essa função modifica o nome de uma coluna da Grade. Informando a Grade, o nome da coluna que deseja alterar e o <br/>
 * novo nome dela.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome da Grade<br/>
 * 2. Nome da Coluna<br/>
 * 3. Nome que deseja atribuir à coluna<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo o 1º parâmetro sendo "Ciência da Computação", o 2º parâmetro "LT2" e o 3º parâmetro "Linguagem Técnica 2".<br/>
 * Passando esse parâmetro, será mostrado na Grade "Ciência da Computação" o nome "Linguagem Técnica" na coluna que está o nome "LT2".
 */
function ebfGridSetColumn(grid, column, newColumn) {
  var grid = $c(grid);
  if (!grid)
    throw "Componente "+grid+" não encontrado"; 
  return grid.setColumn(column, newColumn);
}

/**
 * Essa função atribui um valor na Grade, informando o nome da grade, a linha, nome da coluna e o valor que deseja atribuir<br/>
 * a respectiva linha e coluna.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome da Grade<br/>
 * 2. Número da Linha (De 0 à N-1)<br/>
 * 3. Nome da Coluna<br/>
 * 4. Valor a ser atribuído<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo o 1º parâmetro sendo Grade Salário, o 2 º parâmetro sendo 2, o 3º parâmetro sendo Nomes e o 4º parâmetro<br/>
 * sendo 500. Passando esses parâmetros, será adicionado à Grade Salário o valor de 500 na terceira linha da coluna Nomes.
 */
function ebfGridSetValue(grid, row, column, value) {
  var grid = $c(grid);
  if (!grid)
    throw "Componente "+grid+" não encontrado"; 
  grid.setCellDataByColumn(row, column, value);
}

/**
 * Essa função atribui um valor na Grade, informando o nome da grade, a linha, nome da coluna e o valor que deseja atribuir<br/>
 * a respectiva linha e coluna sem atualizar a grade.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome da Grade<br/>
 * 2. Número da Linha (De 0 à N-1)<br/>
 * 3. Nome da Coluna<br/>
 * 4. Valor a ser atribuído<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo o 1º parâmetro sendo Grade Salário, o 2 º parâmetro sendo 2, o 3º parâmetro sendo Nomes e o 4º parâmetro sendo 500. <br/>
 * Passando esses parâmetros, será adicionado à Grade Salário o valor de 500 na terceira linha da coluna Nomes.
 */
function ebfGridSetValueNoRefresh(grid, row, column, value) {
  var grid = $c(grid);
  if (!grid)
    throw "Componente "+grid+" não encontrado"; 

  grid.data[row][grid.findColumn(column)] = value;
}

/**
 * Esta função mostra a coluna de uma grade se a condição passada no quarto parâmetro for verdadeira, ou oculta <br/>
 * caso a condição seja falsa.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário que contém a grade<br/>
 * 2. Componente Grade<br/>
 * 3. Nome da coluna<br/>
 * 4. Condição para mostrar a coluna<br/>
 * <br/>
 * Retorno: <br/>
 * Não Possui.<br/>
 * <br/>
 * Observação:<br/>
 * 1. É possível obter os valores da coluna mesmo após ter sido ocultada.
 */
function ebfGridShowColumn(pForm, nameGrid, nameColumn, show) {
  var grade = $c(nameGrid);
  var colNumber = grade.findColumn(nameColumn);
  show = (show? '': 'none'); 

  var template = grade.grid.getColumnTemplate(colNumber);
  template.invisibilyColumn = show;
  var showColumn = function() {
    return this.invisibilyColumn;
  }
  template.setStyle('display', showColumn);

  var templateTop = grade.grid.getTemplate('top').getItemTemplate();
  if (!templateTop.invisibilyColumns) {
    templateTop.invisibilyColumns = new Array();
  }
  templateTop.invisibilyColumns[colNumber] = show;
  var showColumnTop = function() {
    var display = this.invisibilyColumns[this.getId().split(':')[1]];
    return (display ? display : '');
  }
  templateTop.setStyle('display', showColumnTop);

  grade.grid.refresh();
}

/**
 * Essa função obtem o somatório dos os valores de um campo de uma Grade determinada e o retorna. Os parâmetros passados <br/>
 * correspondem ao nome do formulário o nome da Grade e o campo que terá seus valores somados.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome do Formulário onde se encontra o componente grade<br/>
 * 2. Componente grade<br/>
 * 3. Nome do Campo<br/>
 * <br/>
 * Retorno:<br/>
 * Somatório referente ao campo informado<br/>
 * <br/>
 * Ex.<br/>
 * GRADE:   USUARIO<br/>
 * Campos: CODIGO,NOME,IDADE<br/>
 * No campo IDADE existe os valores: ( 18,25,14,32,30,29 )<br/>
 * Os parâmetros passados para a função serão:<br/>
 * - Nome do Formulário<br/>
 * - Nome da grade (USUARIO)<br/>
 * - Nome do campo (IDADE)<br/>
 * <br/>
 * O valor retornado será: (148)<br/>
 * <br/>
 * Observações.: <br/>
 * 1. A função usada no 'fluxo cliente' retorna o somatório apenas dos dados visualizados na grade, se estiver sendo usada<br/>
 * a paginação na grade, os valores das páginas omitidas não farão parte do total obtido.<br/>
 * 2. Os fluxos do modo Servidor contabiliza os valores principais assim como os paginados.<br/>
 * 3. Essa função não pode ser utilizada em um fluxo servidor se for chamada a partir do evento "Ao modificar da Grade".
 */
function ebfGridSumColumn(form, grid, column) {
  var sum = 0;
  var total = 0;
  var grid = $c(grid);
  if (!grid) throw "Componente " + grid + " não encontrado";
  
  var qtdLinhas = grid.data.length;
  for (var i =0; i<qtdLinhas ;i++){     
    sum = parseNumeric(grid.data[i][grid.findColumn(column)]);
    total = total + sum;      
  }
  return total;   
}

/**
 * Função que cria um novo componente Moldura dinâmicamente.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Aba (caso não seja definida, a aba será criada).<br/>
 * 2. Posição X.<br/>
 * 3. Posição Y.<br/>
 * 4. Largura do componente.<br/>
 * 5. Altura do componente.<br/>
 * 6. Descrição do componente.,<br/>
 * 7. Nome do componente<br/>
 * <br/>
 * Retorno: <br/>
 * Não possui.
 */
function ebfGroupBoxNew(aba,posX,posY,width,height,description,value){
  var code = getCodComponent();
  var component = new HTMLGroupBox(ebfGetSystemID(),ebfGetFormID(), code, posX, posY, width, height, description, value);
  component.id = value;
  component.zindex = 1;
  component.loadComponentTime = 0;
  var container = $mainform().d.t.getTabByName(aba);
  if(!container){
     d.t.add(aba);
     container = $mainform().d.t.getTabByName(aba);
  } 
  component.design(container.div, true);
  document['c_' + code] = component;
}

/**
 * Cria uma tabela em uma moldura<br/>
 * <br/>
 * Parâmetros:<br/>
 * <br/>
 * 1. Formulário<br/>
 * 2. Moldura<br/>
 * 3. Largura da tabela (Opcional)<br/>
 * 4. Altura da tabela(Opcional)<br/>
 * 5. Cor do plano de fundo (Opcional)<br/>
 * 6. Largura da borda (Opcional)<br/>
 * 7. Cor da borda (Opcional)<br/>
 * 8. Espaçamento entre as células (Opcional)<br/>
 * 9. Espaçamento entre o texto e as bordas da célula (Opcional)<br/>
 * 10. Folha de estilo (Opcional)<br/>
 * 11. Barra de Rolagem (Opcional)<br/>
 * <br/>
 * Retorno:<br/>
 * GUID da tabela
 */
function ebfHTMLTableCreate(form, componentName, width, height, bgColor, border, borderColor, cellSpace, cellPad, style, scroll){

  //Obtém a moldura
  var component = $c(componentName);

  // Verifica se existe a moldura
  if  (component){
  
    var div = getDiv(id, 0, 0, component.getWidth(), component.getHeight(), 1000010, true);

    // Obtém o id da tabela
    var id = 'table' + parseInt((Math.random() * 9999999));

    //Criar Elementos tbody e table
    var tbody;
    var table;
    if (IE) {
      tbody = document.createElement("<tbody>");
      table = document.createElement("<table>");
    }else{
      tbody = document.createElement("tbody");
      table = document.createElement("table");
    } 

    //Obtém o tamanho da borda
    var tableBorder;
    if  (!(border) ||  (border < 0)){
      tableBorder = 0;
    } else {
      tableBorder = border;
    }

    //Obtém a largura da tabela
    var tableWidth;
    if (!(width) || (width <= 0)){
      tableWidth = component.getWidth();
    } else {
      tableWidth = width;
    }

    //Obtém a altura da tabela
    var tableHeight;
    if (!(height) || (height <= 0)){
      tableHeight = component.getHeight();
    } else {
      tableHeight = height;
    }


    //Obtém o espaçamento entre as células
    var tableCellSpace;
    if (!(cellSpace) ||  (cellSpace < 0)){
      tableCellSpace = 0;
    } else {
      tableCellSpace = cellSpace;
    }
 
    //Obtém o espaçamento para as bordas
    var tableCellPad;
    if (!(cellPad) ||  (cellPad < 0)){
      tableCellPad= 0;
    } else {
      tableCellPad= cellPad;
    }

    //Altera os atributos da tabela
    table.setAttribute("id",id);
    table.setAttribute("name",id);
    table.setAttribute("width",tableWidth);
    table.setAttribute("height",tableHeight);
    
    table.setAttribute("border",tableBorder);
    table.setAttribute("cellpadding",tableCellSpace);
    table.setAttribute("cellspacing",tableCellPad);
    if (borderColor)
      table.setAttribute("borderColor",borderColor);
  
    if (bgColor)
      table.setAttribute("bgColor",bgColor);
  
    if (style)
      table.className = style;
  
    table.appendChild(tbody);
    div.appendChild(table);
    if (scroll)
      div.style.overflow = "scroll";
    component.div.innerHTML = "";
    component.div.appendChild(div);

    document.ebfHTMLTable = id; 
    return id;
  }
}

/**
 * Insere uma célula em uma linha<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário<br/>
 * 2. Linha<br/>
 * 3. Largura da célula (Opcional)<br/>
 * 4. Alinhamento (Opcional)<br/>
 *     Valores aceitados:   <br/>
 *        + left (Esquerda)<br/>
 *        + center (Centro)<br/>
 *        + right (Direita)<br/>
 * 5. Cor do fundo (Opcional)<br/>
 * 6. Cor da borda (Opcional)<br/>
 * 7. Quantidade de linhas ocupadas (Opcional)<br/>
 * 8. Quantidade de colunas ocupadas (Opcional)<br/>
 * 9. Conteúdo (Opcional)<br/>
 * 10. Folha de estilo (Opcional)<br/>
 * <br/>
 * Retorno:<br/>
 * GUID da célula<br/>
 * <br/>
 * Observações:<br/>
 * 1. O parâmetro dois é obtido com a função "Tabela - Inserir linha em uma tabela"<br/>
 * 2. Para a utilização da função no servidor é necessário passar o parâmetro "Linha" em branco e ter utilizado <br/>
 *      a função "Tabela - Inserir linha em uma tabela"  antes. A célula irá ser inserida na útima linha criada na tela.
 */
function ebfHTMLTableCreateCell(form, row, width, align, bgColor, borderColor, rowspan, colspan, text, style){
                                  
  if (!row){
    if (document.ebfHTMLTableRow){
      row = document.ebfHTMLTableRow;
    }else{
      return;
    }  
  }

  //Obtém a linha
  var component = $(row);

  // Verifica se existe a tabela
  if  (component){
    // Obtém o id da célula
    var id = 'td' + parseInt((Math.random() * 9999999));
  
    //Criar Elemento td
    var td;
    if (IE) {
      td = document.createElement("<td>");
    }else{
      td = document.createElement("td");
    }

    //Obtém a largura da célula
    var cellWidth;
    if ((width) && (width <= 0)){
       cellWidth= 1;
    } else {
       cellWidth= width;
    }

    //Altera os atributos da célula
    td.setAttribute("id",id);
    td.setAttribute("width",cellWidth); 

    if ((align == 'left') || (align == 'center') || (align == 'right'))
      td.setAttribute("align",align);
 
    if ((colspan) && (colspan > 1))
      td.setAttribute("colspan",colspan);

    if ((rowspan) && (rowspan> 1))
      td.setAttribute("rowspan",rowspan);

    if (borderColor)
      td.setAttribute("borderColor",borderColor);
 
    if (bgColor)
      td.setAttribute("bgColor",bgColor);

    if (style)
      td.className = style;

    //Cria um elemento texto;
    //var elementText = document.createTextNode(text);

    //Adiciona o texto na célula
    //td.appendChild(elementText);
    td.innerHTML = text;
  
    //Adiciona a célula na linha
    component.appendChild(td);
  
    return id;       
  }
}

/**
 * Insere uma linha em uma tabela<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário<br/>
 * 2. Tabela<br/>
 * 3. Cor de fundo (Opcional)<br/>
 * 4. Cor da borda (Opcional)<br/>
 * 5. Folha de estilo (Opcional)<br/>
 * <br/>
 * Retorno:<br/>
 * GUID da linha criada<br/>
 * <br/>
 * Observações:<br/>
 * 1. O parâmetro dois é o retorno da função "Tabela - Criar tabela em uma moldura"<br/>
 * 2. Para a utilização da função no servidor é necessário passar o parâmetro "Tabela" em branco e ter utilizado <br/>
 *      a função "Tabela - Inserir linha em uma tabela"  antes. A linha irá ser inserida na útima tabela criada na tela.
 */
function ebfHTMLTableCreateRow(form, table, bgColor, borderColor, style){

  //Obtém a tabela
  if (!table)
    if (document.ebfHTMLTable){
      table = document.ebfHTMLTable;
    }else{
      return;
    }
  var component = $(table);               
 
  // Verifica se existe a tabela
  if  (component){ 
    var tbody = component.firstChild;
                     
    // Obtém o id da linha
    var id = 'tr' + parseInt((Math.random() * 9999999));
  
    //Criar Elemento tr
    var tr;
    if (IE) {
      tr = document.createElement("<tr>");
    }else{
      tr = document.createElement("tr");
    }

    //Altera os atributos da linha
    tr.setAttribute("id",id);
 
    if (borderColor)
      tr.setAttribute("borderColor",borderColor);
 
    if (bgColor)
      tr.setAttribute("bgColor",bgColor);

    if (style)
      tr.className = style;

    //Adiciona a linha na tabela
    tbody.appendChild(tr);
    document.ebfHTMLTableRow = id;
    return id;
  }
}

/**
 * Cria uma tabela a partir de uma lista de listas<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário<br/>
 * 2. Moldura<br/>
 * 3. Largura da tabela (Opcional)<br/>
 * 4. Altura da tabela (Opcional)<br/>
 * 5. Tamanho da borda da tabela (Opcional)<br/>
 * 6. Lista de listas de elementos <br/>
 * 7. Alinhamento (Opcional)<br/>
 *     Valores aceitados:   <br/>
 *        + left (Esquerda)<br/>
 *        + center (Centro)<br/>
 *        + right (Direita)<br/>
 * 8. Cor de fundo da tabela (Opcional)<br/>
 * 9. Cor da borda da tabela (Opcional)<br/>
 * 10. Cor de fundo da célula (Opcional)<br/>
 * 11. Espaçamento entre as células (Opcional)<br/>
 * 12. Espaçamento entre o texto e as bordas da célula (Opcional)<br/>
 * 13. Estilo das células (Opcional)<br/>
 * 14. Barra de Rolagem (Opcional)<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function ebfHTMLTableCreateWithArray(form, componentName, width, height, border, rowList, align, bgColor, borderColor, cellBgColor, cellSpace, cellPad, cellStyle, scroll){
  //Obtém a moldura
  var component = $c(componentName);

  // Verifica se existe a moldura
  if  (component){
    var div = getDiv(id, 0, 0, component.getWidth(), component.getHeight(), 1000010, true);

    // Obtém o id da tabela
    var id = 'table' + parseInt((Math.random() * 9999999));
    //Criar Elementos tbody e table
    var tbody;
    var table;
    if (IE) {
      tbody = document.createElement("<tbody>");
      table = document.createElement("<table>");
    }else{
      tbody = document.createElement("tbody");
      table = document.createElement("table");
    }

    //Obtém o tamanho da borda
    var tableBorder;
    if  (!(border) ||  (border < 0)){
      tableBorder = 0;
    } else {
      tableBorder = border;
    }
    //Obtém a largura da tabela
    var tableWidth;
    if (!(width) || (width <= 0)){
      tableWidth = component.getWidth();
    } else {
      tableWidth = width;
    }
    //Obtém a altura da tabela
    var tableHeight;
    if (!(height) || (height <= 0)){
      tableHeight = component.getHeight();
    } else {
      tableHeight = height;
    }
    //Obtém o espaçamento entre as células
    var tableCellSpace;
    if (!(cellSpace) ||  (cellSpace < 0)){
      tableCellSpace = 0;
    } else {
      tableCellSpace = cellSpace;
    }      
    //Obtém o espaçamento para as bordas
    var tableCellPad;
    if (!(cellPad) ||  (cellPad < 0)){
      tableCellPad= 0;
    } else {
      tableCellPad= cellPad;
    }           

    //Altera os atributos da tabela
    table.setAttribute("id",id);
    table.setAttribute("name",id);
    table.setAttribute("width",tableWidth);
    table.setAttribute("height",tableHeight);

    table.setAttribute("border",tableBorder);
    table.setAttribute("cellpadding",tableCellSpace);
    table.setAttribute("cellspacing",tableCellPad);
    if (borderColor)
      table.setAttribute("borderColor",borderColor);
    if (bgColor)
      table.setAttribute("bgColor",bgColor);                      


    var idCell, idRow, tr, td, cellList, cellText;
      
    for (indexRow = 0; indexRow < rowList.length; indexRow++){
      // Obtém o id da linha
      idRow = 'tr' + parseInt((Math.random() * 9999999));
      //Criar Elemento tr
      if (IE) {
        tr = document.createElement("<tr>");
      }else{
        tr = document.createElement("tr");
      }
      //Altera os atributos da linha
      tr.setAttribute("id",idRow);

      cellList = rowList[indexRow];

      for ( indexCell = 0; indexCell < cellList.length; indexCell++){
        // Obtém o id da célula
        idCell = 'td' + parseInt((Math.random() * 9999999));
        //Criar Elemento td
        if (IE) {
          td = document.createElement("<td>");
        }else{
          td = document.createElement("td");
        }
        //Altera os atributos da célula
        td.setAttribute("id",idCell);
        if ((align == 'left') || (align == 'center') || (align == 'right'))
          td.setAttribute("align",align);
        if (cellBgColor)
          td.setAttribute("bgColor",cellBgColor );

        if (cellStyle)
          td.className = cellStyle;

        //Cria um elemento texto;
        //cellText = document.createTextNode(cellList[indexCell]);
        
        //Adiciona o texto na célula
        //td.appendChild(cellText);
        
        td.innerHTML = cellList[indexCell];

        //Adiciona a célula na linha
        tr.appendChild(td);
      }

      //Adiciona a linha na tabela
      tbody.appendChild(tr);
    }       

    table.appendChild(tbody);
    div.appendChild(table);
    if (scroll)
      div.style.overflow = "scroll";
    component.div.innerHTML = "";
    component.div.appendChild(div);
  }
}

/**
 * Esconde a árvore passada por parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Variável onde está guardada a referência para a árvore.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function ebfHideTree(tree){	
  return tree.hideTree();		
}

/**
 * Altera a URL de um componente imagem.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário que contém o componente<br/>
 * 2. Nome do componente<br/>
 * 3. URL da imagem<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function ebfImageSetURL(formGUID, componentName, url) {
  var component = $c(componentName, formGUID);
  if (component) {
    component.type = 3;
    component.url = url;
    component.refresh(true);
  }
}

/**
 * Esta função localiza o conteúdo do 2° parâmetro dentro do conteúdo do primeiro parâmetro e retorna a posição deste caso o <br/>
 * encontre. Caso não encontre, retorna 0.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Texto onde será feita a pesquisa.<br/>
 * 2. Valor a ser localizado.<br/>
 * <br/>
 * Retorno:  <br/>
 * Retorna a posição do valor a ser localizado. Caso não encontre retorna 0.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1-Assumindo os parâmetros como "Maker Flow" (Letras) e "e" (Letras) , o retorno seria 4.<br/>
 * 2. Assumindo os parâmetros como "Maker Flow" (Letras) e "U" (Letras) , o retorno seria 0.
 */
function ebfIndexOf() {
  var indice = 0;
  if (existArgs(arguments)) {
    var value = arguments[0].toString();
    var valueToFind = arguments[1].toString();
    indice = value.indexOf(valueToFind);
    indice = indice == -1 ? 0 : ++indice;
  }
  return indice;
}

/**
 * Converte um número para hexadecimal com zeros a esquerda caso o número a ser convertido seja menor que a<br/>
 * quantidade de caracteres a ser retornada. <br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Valor a ser convertido.<br/>
 * 2. Quantidade de Caracteres a ser retornada<br/>
 * <br/>
 * Retorno:<br/>
 * Valor convertido para Hexadecimal.<br/>
 * <br/>
 * Exemplo:<br/>
 * Assumindo como parâmetros 10 e 8,  o retorno será 0000000A.<br/>
 * <br/>
 * Observação:<br/>
 * Hexadecimal é um sistema numérico com 16 dígitos, onde os dígitos de 0 a 9 são representados por números de 0 a 9, e<br/>
 * os dígitos de 10 a 15 são representados por letras, que vão de A a F.
 */
function ebfIntToHex(value, minsize) {
  if (!minsize) minsize = 2;
   var i = 0;
   var j = -1;
   var inp = value;
   value = inp;
   var a = parseInt(inp);
   var b = a.toString(16);
   var c = parseInt("0x" + b);
   if (b != 'NaN') 
   { 
     while (b.length < minsize) b +=  '0' + b;
     return b; 
   }
}

/**
 * Invoca um método no objeto passado por parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Objeto que contém o método<br/>
 * 2. Método a ser executado<br/>
 * 3. Lista de parâmetros do método. <br/>
 * <br/>
 * Retorno:<br/>
 * Retorna o resultado da execução do método.
 */
function ebfInvokeMethod(object, methodName, params){ 

  if (!object){
    throw 'Objeto inválido';
  }
  if (methodName == null || methodName == ''){
    throw 'Nome do método inválido';
  }
  var _object = object;
  var _params = params;

  var callCmd = '_object.'+methodName+'(';
  if (params != null){
    if (params.length>0){
      callCmd += '_params[0]';
      for(index=1; index<params.length; index++) {
        callCmd += ', _params['+index+']';
      }
    }
  }
  callCmd += ')';
  return eval(callCmd);
}

/**
 * Verifica se um valor é um CNPJ válido.<br/>
 * Caso o valor seja vazio, será considerado que o CNPJ é válido.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Valor a ser avaliado.<br/>
 * <br/>
 * Retorno:<br/>
 * Retorna Verdadeiro se for um CNPJ, caso contrário retorna Falso.
 */
function ebfIsCnpj(value) {
  if (value == null || typeof value == "undefined" || value == "") {
    return false;
  }
  return CNPJ(value);
}

/**
 * Verifica se um valor é um CPF.<br/>
 * Caso o valor seja vazio, será considerado que o CPF é válido.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Valor a ser avaliado.<br/>
 * <br/>
 * Retorno:<br/>
 * Retorna Verdadeiro se for um CPF, caso contrário retorna Falso.
 */
function ebfIsCpf(value) {
  if (value == null || typeof value == "undefined" || value == "") {
    return false;
  }
  return CPF(value);
}

/**
 * A função localiza a última subseqüência (passada no 2º parâmetro) dentro do texto e retorna a posição inicial da mesma.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Texto.<br/>
 * 2. Subseqüência ao qual deseja obter o índice.<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna a última posição do valor passado como parâmetro. <br/>
 * <br/>
 * Exemplos:<br/>
 * 1.Assumindo como parâmetros  "Maker Maker" (Letras) e "r" (Letras), o retorno seria  11(Inteiro).<br/>
 * 2.Assumindo como parâmetros "Maker Flow"(Letras) e "r" (Letras), o retorno seria 5 (Inteiro).
 */
function ebfLastIndexOf() {
  var indice = 0;
  if (existArgs(arguments)) {
    var value = arguments[0].toString();
    var valueToFind = arguments[1].toString();
    indice = value.lastIndexOf(valueToFind);
    indice = indice == -1 ? 0 : ++indice;
  }
  return indice;
}

/**
 * A função recebe um texto e retorna o tamanho do mesmo.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Texto no qual se deseja obter o tamanho.<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna a quantidade de caracteres (Inteiro) presente no texto passado como parâmetro.<br/>
 * <br/>
 * Exemplos:<br/>
 * 1.Assumindo como parâmetro "Maker Flow" (Letras), o retorno seria 10.<br/>
 * 2.Assumindo como parâmetro "Hoje é Segunda-Feira" (Letras), o retorno seria 20.
 */
function ebfLength() {
  var value = 0;
  if (existArgs(arguments)) {
    value = arguments[0].toString().length;
  }
  return value;
}

/**
 * Essa função cria uma lista com todos os valores que foram passados pelos parâmetros.<br/>
 * <br/>
 * Retorno: <br/>
 * Lista vazia. O retorno dessa função deve ser armazenado numa variável do tipo variante.<br/>
 * <br/>
 * Observações: <br/>
 * 1. Para inserir elemento na lista é necessária a utilização de outras funções da categoria lista.<br/>
 * 2. Não há suporte para passagem de parâmetro de uma lista criada na camada "Cliente" para a camada "Servidor"; a<br/>
 * ação contrária é suportada.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Caso queira inserir uma lista de números, primeiramente chama a função criar objeto lista e atribui a uma variável do tipo<br/>
 * variante e depois chama outra função da categoria Lista para inserir essa lista de números no Objeto Lista.
 */
function ebfListCreate() {
  return new Array();
}

/**
 * Transformar uma Lista(conjunto de valores) em um Texto separando cada elemento com um delimitador(separador)<br/>
 * especificado no 2º parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Objeto Lista.<br/>
 * 2. Separador entre os elementos da lista.<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna os elementos da lista passada (1° parâmetro) separados pelo conteúdo do 2º parâmetro (Letras).<br/>
 * <br/>
 * Exemplos: <br/>
 * 1-Assumindo os parâmetros como  uma lista com 2 elementos ("Maker" e "Flow" ) e "|"(Letras), o retorno seria "Maker|Flow" (Letras).<br/>
 * 2-Assumindo os parâmetros como  uma lista com 3 elementos ("ABC" ,"DEF" e "GHI") e  nulo (Letras) no segundo parâmetro,<br/>
 * o retorno seria "ABCDEFGHI" (Letras).
 */
function ebfListImplode(list, separator) {
  if (!(list instanceof Array)) {
    throw "Functions ebfListImplode expects an Array.";
  }
  var first = true;
  var value = "";
  for (var i = 0; i < list.length; i++) {
    var listValue = list[i];
    if (first) {
      first = false;
    } else if (separator != null && (typeof separator != "undefined")) {
      value += separator;
    }
    if (listValue != null && (typeof listValue != "undefined")) {
      value += listValue;
    }
  }
  return value;
}

/**
 * Essa função retorna o tamanho da lista, ou seja, a quantidade de elementos que pertencem à lista. <br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Lista com os elementos<br/>
 * <br/>
 * Retorno:<br/>
 * Retorna a quantidade de elementos na lista. O retorno da função pode ser armazenado numa variável do tipo inteiro.<br/>
 * <br/>
 * Exemplos:<br/>
 * 1. Assumindo que o 1º parâmetro seja uma lista com os seguintes valores: {a,b,c,d,e,f,g,h}. O retorno será o valor 8, pois<br/>
 * existem 8 elementos na lista.
 */
function ebfListLength() {
  var value = 0;
  if (existArgs(arguments)) {
    value = arguments[0].length;
  }
  return value;
}

/**
 * Essa função cria uma lista com todos os valores que foram passados pelos parâmetros.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Elemento da Lista<br/>
 * 2. Elemento da Lista<br/>
 * <br/>
 * Retorno: <br/>
 * Lista com todos os valores passados por parâmetro. O retorno dessa função deve ser armazenado numa variável <br/>
 * do tipo variante.<br/>
 * <br/>
 * Observações: <br/>
 * 1. A função pode ter (N) parâmetro.<br/>
 * 2. O acesso aos elementos da lista retornada é feito através de outras funções da categoria lista.<br/>
 * <br/>
 * Exemplos:<br/>
 * 1. Assumindo os parâmetros como sendo 10, 2 e 5, o retorno será uma lista com os elementos 10,2 e 5.<br/>
 * 2. Assumindo os parâmetros como sendo A, B e D, o retorno será uma lista com os elementos A, B e D.
 */
function ebfListParamsCreate() {
  var list = new Array()
  for(i = 0; i < arguments.length; i++) {
    list[i] = arguments[i];
  }
  return list;
}

/**
 * Essa função armazena um valor no objeto mapa passando como parâmetro a chave ou referencia do valor e o valor que<br/>
 * deseja armazenar.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Objeto Mapa<br/>
 * 2. Chave (ou Referência) <br/>
 * 3. Valor a ser armazenado<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna o objeto mapa com o valor armazenado. O retorno pode ser armazenado numa variável do tipo variante.<br/>
 * <br/>
 * Observações: <br/>
 * 1. Para obter o valor armazenado é preciso utilizar a função "Obter Elemento" passando como parâmetro a chave ou<br/>
 * referencia do valor.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo o 1º parâmetro sendo MAPA, o 2º parâmetro sendo Maker e o 3º parâmetro sendo Flow, o retorno será o conteúdo Flow armazenado no objeto mapa "MAPA" com a sua chave de referencia sendo Maker.
 */
function ebfMapAddObject(obj, key, value) {
  if (obj instanceof Map) {
    obj.add(key, value);
  }
}

/**
 * Essa função criar um mapa ou mapeamento para armazenar valores a partir de uma lista de "par/valor".<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Lista com "par/valor".<br/>
 * 2. Lista com "par/valor".<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna o objeto mapa com suas chaves e seus respectivos valores. O retorno pode ser armazenado numa variável do tipo variante.<br/>
 * <br/>
 * Observações: <br/>
 * A função pode ter (N) parâmetros.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo o 1º e 2º parâmetro sendo a Função Criar Lista a partir dos parâmetros contendo os pares de valores: Maker/Flow e Softwell/Freire. O retorno será um objeto mapa contendo esses elementos.
 */
function ebfMapCreateFromList() {
  var map = new Map();
  for (var i = 0; i < arguments.length; i++) {
    var params = arguments[i];
    if (params instanceof Array && params.length == 2) {
      map.add(params[0], params[1]);
    }
  }
  return map;
}

/**
 * Criar um mapa ou um mapeamento para armazenar valores, com uma diferença: ambos os valores (chave e valor) são Strings.<br/>
 *  <br/>
 * (É interessante saber que um Mapa associa os dois objetos: passando uma chave, então se obtém um valor).<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não possui.<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna o objeto mapa. O retorno pode ser armazenado numa variável do tipo variante
 */
function ebfMapCreateObject() {
  return new Map();
}

/**
 * Essa função obtém o elemento de um objeto mapa a partir da chave (ou Referência).<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Objeto Mapa<br/>
 * 2. Chave (ou Referência)<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna o elemento de um determinado objeto mapa a partir da chave (ou referência) do elemento. O retorno deverá ser <br/>
 * armazenado em uma variável do tipo variante.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo o 1º parâmetro contendo um objeto mapa com as seguintes chaves e respectivos valores: Maker/Flow; <br/>
 * Freire/Softwell, Banco/SQL e o 2º parâmetro contendo a chave Maker. A partir desses valores o retorno será o valor<br/>
 * "Flow".
 */
function ebfMapGetObject(obj, key) {
  if (obj instanceof Map) {
    return obj.get(key);
  }
  return null;
}

/**
 * Essa função obtém todas as chaves ou referencias de um determinado objeto mapa.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Objeto Mapa<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna uma lista de chaves. O retorno deverá ser armazenado numa variável do tipo variante.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo o 1º parâmetro contendo um objeto mapa com as seguintes chaves e respectivos valores: Maker/Flow; Freire/Softwell, Banco/SQL. A partir desses valores o retorno será uma lista com a chave do objeto mapa, que seria Maker, Freire e Banco.
 */
function ebfMapKeys(obj) {
  if (obj instanceof Map) {
    return obj.getKeys();
  }
  return new Array(0);
}

/**
 * Essa função retorna a quantidade de valores que existe no objeto mapa.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Objeto Mapa<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna o tamanho do objeto mapa, ou seja, a quantidade de valores que existe no mapa. O retorno pode ser armazenado numa variável do tipo Inteiro.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo o 1º parâmetro contendo um objeto mapa com as seguintes chaves e respectivos valores: Maker/Flow; Freire/Softwell, Banco/SQL. A partir desses valores o retorno será 3, pois existe 3 valores no objeto mapa que são Flow, Softwell e SQL.
 */
function ebfMapLength(obj) {
  if (obj instanceof Map) {
    return obj.size();
  }
  return 0;
}

/**
 * Essa função remove o elemento de um objeto mapa a partir da chave (ou Referencia).<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Objeto Mapa<br/>
 * 2. Chave (ou Referência)<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna o elemento removido de um determinado objeto mapa a partir da chave (ou referencia) do elemento. Caso o <br/>
 * elemento seja removido retorna Verdadeiro, caso contrário Falso.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo o 1º parâmetro contendo um objeto mapa com as seguintes chaves e respectivos valores: Maker/Flow; Freire/Softwell, Banco/SQL e o 2º parâmetro contendo a chave Freire. A partir desses valores o elemento a ser removido será o valor "Flow".
 */
function ebfMapRemoveObject(obj, key) {
  if (obj instanceof Map) {
    return obj.remove(key);
  }
  return -1;
}

/**
 * Essa função obtém todos os valores de um determinado objeto mapa.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Objeto Mapa<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna uma lista de valores. O retorno deverá ser armazenado numa variável do tipo variante.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo o 1º parâmetro contendo um objeto mapa com as seguintes chaves e respectivos valores: Maker/Flow; Freire/Softwell, Banco/SQL. A partir desses valores o retorno será uma lista com os valores do objeto mapa, que seria Flow, Softwell e SQL.
 */
function ebfMapValues(obj) {
  if (obj instanceof Map) {
    return obj.getValues();
  }
  return new Array(0);
}

/**
 * Calcula o logaritmo na base 10 de um valor.<br/>
 * <br/>
 * Parâmetros<br/>
 * 1. Valor para cálculo (logaritmando).<br/>
 * <br/>
 * Retorno: <br/>
 * Logaritmo na base 10 do valor determinado.<br/>
 * <br/>
 * Exemplos:<br/>
 * 1.Assumindo o Parâmetro 1 como 86 o retorno seria 1,934498451<br/>
 * <br/>
 * Observações:<br/>
 * 1. Para garantir a integridade das operações matemáticas, utilize conversão para o tipo de dado nos parâmetros.
 */
function ebfMath10Logarithm(theta) {
  var result = Math.log(toDouble(theta)) / Math.log(10);
  if (isNaN(result)) {
    throw "Argumento inválido para o cálculo do Logaritmo na Base 10.";
  }
  return result;
}

/**
 * Retorna o arco cosseno ou o cosseno inverso de um número. <br/>
 * O arco cosseno é o ângulo cujo cosseno é o Parâmetro 1. <br/>
 * O ângulo retornado é fornecido em radianos no intervalo de 0 (zero) a pi.<br/>
 * Se você quiser converter o resultado de radianos em graus, multiplique-o por 180/PI ou use a função Para Graus.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Ângulo em radianos (deve estar entre -1 e 1).<br/>
 * <br/>
 * Retorno: <br/>
 * Arco cosseno do ângulo determinado.<br/>
 * <br/>
 * Exemplos:<br/>
 * 1. Assumindo o Parâmetro 1 como -0,5 o retorno seria aproximadamente 2,094395.<br/>
 * <br/>
 * Observações:<br/>
 * 1. Para garantir a integridade das operações matemáticas, utilize conversão para o tipo de dado nos parâmetros.
 */
function ebfMathArcCosine(theta) {
  var result = Math.acos(toDouble(theta));
  if (isNaN(result)) {
    throw "Argumento inválido para o cálculo do Arco Cosseno.";
  }
  return result;
}

/**
 * Obtém o arco seno ou o seno inverso de um número. <br/>
 * O arco seno é o ângulo cujo seno é o Parâmetro 1. <br/>
 * O ângulo retornado é fornecido em radianos no intervalo de -pi/2 a pi/2.<br/>
 * Se você quiser converter o resultado de radianos em graus, multiplique-o por 180/PI ou use a função Para Graus.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. É o seno do ângulo desejado e deve estar entre -1 e 1.<br/>
 * <br/>
 * Retorno: <br/>
 * Arco seno do ângulo determinado.<br/>
 * <br/>
 * Exemplos:<br/>
 * 1. Assumindo o Parâmetro 1 como -0,5 o retorno seria aproximadamente -0,5236.<br/>
 * <br/>
 * Observações:<br/>
 * 1. Para garantir a integridade das operações matemáticas, utilize conversão para o tipo de dado nos parâmetros.
 */
function ebfMathArcSine(theta) {
  var result = Math.asin(toDouble(theta));
  if (isNaN(result)) {
    throw "Argumento inválido para o cálculo do Arco Seno.";
  }
  return result;
}

/**
 * Obtém o arco tangente, ou a tangente inversa, de um número.<br/>
 * O arco tangente é o ângulo cuja tangente é o Parâmetro 1.<br/>
 * O ângulo retornado é fornecido em radianos no intervalo -pi/2 a pi/2.<br/>
 * Se você quiser converter o resultado de radianos em graus, multiplique-o por 180/PI ou use a função Para Graus.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. É a tangente do ângulo desejado.<br/>
 * <br/>
 * Retorno:<br/>
 * Arco tangente do ângulo determinado.<br/>
 * <br/>
 * Exemplos:<br/>
 * 1. Assumindo o Parâmetro 1 como 1 o retorno seria aproximadamente 0,785398.<br/>
 * <br/>
 * Observações:<br/>
 * 1. Para garantir a integridade das operações matemáticas, utilize conversão para o tipo de dado nos parâmetros.
 */
function ebfMathArcTangent(theta) {
  var result = Math.atan(toDouble(theta));
  if (isNaN(result)) {
    throw "Argumento inválido para o cálculo do Arco Tangente.";
  }
  return result;
}

/**
 * Obtém o cálculo do arranjo de um valor.<br/>
 * Um arranjo ou permutação sem repetição é o cálculo de quantas maneiras diferentes é possível colocar d elementos de um conjunto com n elementos em seqüência, sem repetição.<br/>
 * A fórmula do cálculo de um arranjo é a seguinte: n! / (n-d)!<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Corresponde à quantidade de elementos do conjunto (d na fórmula acima).<br/>
 * 2.  Corresponde ào número de elementos em sequência, sem repetição (n na fórmula acima).<br/>
 * <br/>
 * Retorno:<br/>
 * Cálculo do arranjo do valor determinado.<br/>
 * <br/>
 * Observações:<br/>
 * 1. Para garantir a integridade das operações matemáticas, utilize conversão para o tipo de dado nos parâmetros.
 */
function ebfMathArrangement(elements, choices) {
  elements = toLong(elements);
  choices = toLong(choices);
  var occurrences = elements - choices;
  return ebfMathFactorial(elements) / ebfMathFactorial(occurrences);
}

/**
 * Arredonda um valor fracionado para cima.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Número a ser arredondado.<br/>
 * <br/>
 * Retorno:<br/>
 * Valor arredondado para cima.<br/>
 * <br/>
 * Exemplos:<br/>
 * 1. Assumindo o Parâmetro 1 como 9,5 o retorno seria 10,0.<br/>
 * 2. Assumindo o Parâmetro 1 como 5,4 o retorno seria 6,0.<br/>
 * <br/>
 * Observações:<br/>
 * 1. Para garantir a integridade das operações matemáticas, utilize conversão para o tipo de dado nos parâmetros.
 */
function ebfMathCeil(theta) {
  var result = Math.ceil(toDouble(theta));
  if (isNaN(result)) {
    throw "Argumento inválido arredondando o valor para cima.";
  }
  return result;
}

/**
 * Uma combinação indica quantas variedades de subconjuntos diferentes com s elementos existem em um conjunto com n elementos. <br/>
 * Só é usada quando não há repetição de membros dentro do conjunto.<br/>
 * A fórmula de cálculo de uma combinação é a seguinte:<br/>
 * n! / s! * (n - s)!<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Quantidade de elementos do conjunto (corresponde ao n da fórmula acima).<br/>
 * 2. Quantidade de elementos nos subconjuntos (corresponde ao s da fórmula acima).<br/>
 * <br/>
 * Retorno: <br/>
 * Cálculo da combinação.<br/>
 * <br/>
 * Exemplos:<br/>
 * 1.Assumindo o Parâmetro 1 como 3 e o Parâmetro 2 como 2, o retorno seria 3.<br/>
 * 2.Assumindo o Parâmetro 1 como 4 e o Parâmetro 2 como 2, o retorno seria 6.<br/>
 * <br/>
 * Observações:<br/>
 * 1. Para garantir a integridade das operações matemáticas, utilize conversão para o tipo de dado nos parâmetros.
 */
function ebfMathCombination(elements, choices) {
  return ebfMathArrangement(elements, choices) / ebfMathFactorial(choices);
}

/**
 * Obtém o cosseno de um ângulo.<br/>
 * Se o ângulo estiver em graus, multiplique-o por PI/180 ou use a função Para Radianos para convertê-lo em radianos.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Ângulo em radianos cujo cosseno você deseja obter.<br/>
 * <br/>
 * Retorno:<br/>
 * Cosseno do ângulo determinado.<br/>
 * <br/>
 * Exemplos:<br/>
 * 1. Assumindo o Parâmetro 1 como 1,047 o retorno seria 0,500171.<br/>
 * 2. Assumindo o Parâmetro 1 como 60*PI/180 o retorno seria 0,5.<br/>
 * <br/>
 * Observações:<br/>
 * 1. Para garantir a integridade das operações matemáticas, utilize conversão para o tipo de dado nos parâmetros.
 */
function ebfMathCosine(theta) {
  var result = Math.cos(toDouble(theta));
  if (isNaN(result)) {
    throw "Argumento inválido para o cálculo do Cosseno.";
  }
  return result;
}

/**
 * Obtém a raiz cúbica de um valor.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Valor a ser avaliado.<br/>
 * <br/>
 * Retorno:<br/>
 * Raiz cúbica do valor determinado.<br/>
 * <br/>
 * Exemplos:<br/>
 * 1. Assumindo o Parâmetro 1 como 8, o retorno seria 2.<br/>
 * <br/>
 * Observações:<br/>
 * 1. Para garantir a integridade das operações matemáticas, utilize conversão para o tipo de dado nos parâmetros.
 */
function ebfMathCubeRoot(value) {
  var result = Math.pow(toDouble(value), 1/3);
  if (isNaN(result)) {
    throw "Argumento inválido para o cálculo da Raiz Cúbica.";
  }
  return result;
}

/**
 * Retorna o logaritmo natural de um número. <br/>
 * Os logaritmos naturais se baseiam na constante e (2,71828182845904).<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. É o número real positivo para o qual você deseja obter o logaritmo natural.<br/>
 * <br/>
 * Retorno: <br/>
 * Logaritmo na base E do valor determinado.<br/>
 * <br/>
 * Exemplos:<br/>
 * 1. Assumindo o Parâmetro 1 como 86, o resultado seria (4,454347).<br/>
 * <br/>
 * Observações:<br/>
 * 1. Para garantir a integridade das operações matemáticas, utilize conversão para o tipo de dado nos parâmetros.
 */
function ebfMathELogarithm(theta) {
  var result = Math.log(toDouble(theta));
  if (isNaN(result)) {
    throw "Argumento inválido para o cálculo do Logaritmo Neperiano.";
  }
  return result;
}

/**
 * O Fatorial de um número natural n é o produto de todos os inteiros positivos menores ou iguais a n. <br/>
 * Isso é escrito como n! e lido como "fatorial de n ".<br/>
 * <br/>
 * Parâmetros <br/>
 * 1. Valor (n)<br/>
 * <br/>
 * Retorno: <br/>
 * Fatorial do valor determinado.<br/>
 * <br/>
 * Exemplos:<br/>
 * 1. Assumindo o Parâmetro 1 como 5 o retorno seria 120.<br/>
 * <br/>
 * Observações:<br/>
 * 1. Para garantir a integridade das operações matemáticas, utilize conversão para o tipo de dado nos parâmetros.
 */
function ebfMathFactorial(value) {
  var result = 1;
  value = toLong(value);
  if (value < 0) {
    throw "Argumento inválido no cálculo em análise combinatória.";
  }
  if (value > 1) {
    while (value > 1) {
      result *= value;
      value--;
    }
  }
  return result;
}

/**
 * Arredonda um valor fracionado para baixo.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Número a ser arredondado.<br/>
 * <br/>
 * Retorno:<br/>
 * Valor arredondado para baixo.<br/>
 * <br/>
 * Exemplos:<br/>
 * 1. Assumindo o Parâmetro 1 como 9,5 o retorno seria 9,0.<br/>
 * 2. Assumindo o Parâmetro 1 como 5,4 o retorno seria 5,0.<br/>
 * <br/>
 * Observações:<br/>
 * 1. Para garantir a integridade das operações matemáticas, utilize conversão para o tipo de dado nos parâmetros.
 */
function ebfMathFloor(theta) {
  var result = Math.floor(toDouble(theta));
  if (isNaN(result)) {
    throw "Argumento inválido arredondando o valor para baixo.";
  }
  return result;
}

/**
 * O número de Neper é a base dos logaritmos naturais.<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não possui.<br/>
 * <br/>
 * Retorno:<br/>
 * Retorna a constante de Neper (2,718..).<br/>
 * <br/>
 * Observações:<br/>
 * 1. Para garantir a integridade das operações matemáticas, utilize conversão para o tipo de dado nos parâmetros.
 */
function ebfMathNeper() {
  return Math.E;
}

/**
 * Obtém o valor de PI.<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não possui.<br/>
 * <br/>
 * Retorno:<br/>
 * Retorna o valor de PI (3,14...)<br/>
 * <br/>
 * Observações:<br/>
 * 1. Para garantir a integridade das operações matemáticas, utilize conversão para o tipo de dado nos parâmetros.
 */
function ebfMathPI() {
  return Math.PI;
}

/**
 * Obtém o seno de um ângulo.<br/>
 * Se o parâmetro estiver em graus, multiplique-o por PI/180 ou use a função Para Radianos para convertê-lo em radianos.<br/>
 * <br/>
 * Parâmetros <br/>
 * 1. Ângulo em radianos para o qual você deseja obter o seno.<br/>
 * <br/>
 * Retorno: <br/>
 * Seno do ângulo determinado.<br/>
 * <br/>
 * Exemplos:<br/>
 * 1. Assumindo o Parâmetro 1 como PI, o retorno seria 0, aproximadamente.<br/>
 * <br/>
 * Observações:<br/>
 * 1. Para garantir a integridade das operações matemáticas, utilize conversão para o tipo de dado nos parâmetros.
 */
function ebfMathSine(theta) {
  var result = Math.sin(toDouble(theta));
  if (isNaN(result)) {
    throw "Argumento inválido para o cálculo do Seno.";
  }
  return result;
}

/**
 * Obtém a tangente de um ângulo.<br/>
 * Se o parâmetro estiver em graus, multiplique-o por PI/180 ou use a função Para Radianos para convertê-lo em radianos.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Ângulo em radianos para o qual se deseja a tangente.<br/>
 * <br/>
 * Retorno: <br/>
 * Tangente do ângulo determinado.<br/>
 * <br/>
 * Exemplos:<br/>
 * 1.Assumindo o Parâmetro 1 como 0,785, o retorno seria 0,99920 aproximadamente.<br/>
 * <br/>
 * Observações:<br/>
 * 1. Para garantir a integridade das operações matemáticas, utilize conversão para o tipo de dado nos parâmetros.
 */
function ebfMathTangent(theta) {
  var result = Math.tan(toDouble(theta));
  if (isNaN(result)) {
    throw "Argumento inválido para o cálculo da Tangente.";
  }
  return result;
}

/**
 * Moda é uma função para obter o valor que mais se repete ou que possui a maior freqüência dentro de uma coluna.<br/>
 * Os parâmetros passados correspondem ao nome do formulário, o nome da grade e o campo que terá seus valores<br/>
 * comparados.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário<br/>
 * 2. Componente Grade<br/>
 * 3. Nome do Campo<br/>
 * <br/>
 * Retorno:<br/>
 * Valor que mais se repete entre os valores referente ao campo informado (Inteiro)
 */
function ebfModaGridColumn(form, gridName, columnName) {  
  var values = new Map();
  var mode = null;
  
  var grid = $c(gridName, form);
  var lines = grid.data.length;
  var columnIndex = grid.findColumn(columnName);
  
  // Percorre os elementos da grid e adiciona no Map seus valores sem repetição.
  // No momento que um valor já existe, incrementa-se apenas a quantidade de repetição.
  for (var i = 0; i < lines; i++) {
    var value = parseNumeric(grid.data[i][columnIndex]);
    if (!isNullable(value)) {
      var amount = 1;
      var currentAmount = values.get(value);
      if (currentAmount != null) {
        amount = currentAmount + 1;
      }
      values.add(value, amount);
    }
  }

  // Percorre o Map em busca da moda, ou seja, o elemento que tenha maior repetição.
  // Caso haja mais de um com a mesma repetição, o primeiro será retornado.
  var repetition = 1;
  for (var i = 0; i < values.size(); i++) {
    var quantity = values.getValues()[i];
    if (quantity > repetition) {
      repetition = quantity;
      mode = values.getKeys()[i];
    }
  }
  
  // Se a repetição for 1, então não houve moda.
  if (repetition == 1) {
    mode = null;
  }
  
  return mode;
}

/**
 * Remove o registro atual do formulário corrente.<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não possui.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observação:<br/>
 * 1. O uso dessa função tem uma melhor performance quando usada em regras clientes.
 */
function ebfNavDeleteCurrentRecord() {
  var nav = $mainform().d.n;
  if (nav) { 
    if(nav.actDeleteSync)
      nav.actDeleteSync();
    else 
      nav.actDelete();
  }
}

/**
 * Cancela o modo de edição de um registro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não possui.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observação:<br/>
 * O uso desta função tem uma melhor performance quando usada em regras clientes.
 */
function ebfNavEditCancel() {
  var nav = $mainform().d.n;
  if (nav) {
    nav.timeout(nav.actEditCancel, 0);
  }
}

/**
 * Salva o registro corrente.<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não possui.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observação:<br/>
 * 1. O uso dessa função tem uma melhor performance quando usada em regras clientes.
 */
function ebfNavEditSaveRecord() {
  var nav = $mainform().d.n;
  if (nav) {  
    if(nav.actEditSaveSync)
      nav.actEditSaveSync();
    else
      nav.actEditSave();
  }
}

/**
 * Vai para o primeiro registro do formulário corrente.<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não possui.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observação:<br/>
 * 1. O uso dessa função tem uma melhor performance quando usada em regras clientes.
 */
function ebfNavFirstRecord() {
  var nav = $mainform().d.n;
  if (nav) {
   if(nav.actFirstSync)	
     nav.actFirstSync();
   else
     nav.actFirst(); 
  }
}

/**
 * Vai para o registro definido no parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Posição do registro<br/>
 * <br/>
 * Observação:<br/>
 * 1. O uso dessa função tem uma melhor performance quando usada em regras clientes.
 */
function ebfNavGotoRecord(value) {
  var nav = $mainform().d.n;
  if (nav) {  
    if(nav.actGotoSync)
      nav.actGotoSync(value);
    else
      nav.actGoto(value);
  }
}

/**
 * Cancela o modo de inclusão de um registro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não possui.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observação:<br/>
 * O uso desta função tem uma melhor performance quando usada em regras clientes.
 */
function ebfNavIncludeCancel() {
  var nav = $mainform().d.n;
  if (nav) {
    nav.timeout(nav.actIncludeCancel, 0);
  }
}

/**
 * Inclui os dados como um novo registro no banco e fica novamente em modo de inserção para um novo cadastro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não possui.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observação:<br/>
 * 1. O uso dessa função tem uma melhor performance quando usada em regras clientes.
 */
function ebfNavIncludeMoreSaveRecord() {
  var nav = $mainform().d.n;
  if (nav) {
    if(nav.actIncludeSaveMoreSync) {
      try {
        nav.actIncludeSaveMoreSync();
      } finally {
        hideWait();
      }
    } else {
      nav.actIncludeSaveMore();
    }
  }
}

/**
 * Inclui os dados como um novo registro no banco.<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não possui<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observações:<br/>
 * 1. O uso dessa função tem uma melhor performance quando usada em regras clientes.<br/>
 * 2. Caso ocorra um erro durante a inserção dos dados no banco, não é possível capturar a exceção com as funções<br/>
 * try/catch, pois a função simula a gravação de um registro que está sendo editado e, em seguida, gravado no formulário.<br/>
 * Caso deseje tratar as exceções, deve ser utilizada a função "Executar Atualização".
 */
function ebfNavIncludeSaveRecord() {
  var nav = $mainform().d.n;
  if (nav) {
    if(nav.actIncludeSaveSync)
      nav.actIncludeSaveSync();
    else
      nav.actIncludeSave();
  }
}

/**
 * Vai para o último registro do formulário corrente.<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não possui.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observação:<br/>
 * 1. O uso dessa função tem uma melhor performance quando usada em regras clientes.
 */
function ebfNavLastRecord() {
  var nav = $mainform().d.n;
  if (nav) {  
    if(nav.actLastSync) 
      nav.actLastSync();
    else
      nav.actLast();
  }
}

/**
 * Vai para o próximo registro do formulário corrente.<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não possui.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observação:<br/>
 * 1. O uso dessa função tem uma melhor performance quando usada em regras clientes.
 */
function ebfNavNextRecord() {
  var nav = $mainform().d.n;
  if (nav) {  
    if(nav.actNextSync)
      nav.actNextSync();
    else
      nav.actNext();
  }
}

/**
 * Vai para o registro anterior do formulário corrente.<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não possui.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observação:<br/>
 * 1. O uso dessa função tem uma melhor performance quando usada em regras clientes.
 */
function ebfNavPreviousRecord() {
  var nav = $mainform().d.n;
  if (nav) {
    if(nav.actPreviousSync) 
      nav.actPreviousSync();
    else
      nav.actPrevious();      
  }
}

/**
 * Atualiza o registro corrente.<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não possui.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observação:<br/>
 * 1. O uso dessa função tem uma melhor performance quando usada em regras clientes.
 */
function ebfNavRefreshCurrentRecord() {
  var nav = $mainform().d.n;
  if (nav) {  
    nav.execAjaxEval("refresh");
  }
}

/**
 * Atualiza o formulário corrente.<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não possui.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observação:<br/>
 * 1. O uso dessa função tem uma melhor performance quando usada em regras clientes.
 */
function ebfNavRefreshForm() {
  parent.location.reload();
}

/**
 * Função que permite que um novo botão seja adicionado na barra de navegação.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome da imagem que deverá aparecer (A mesma deverá estar localizada em Skins\Default)<br/>
 * 2. Descrição (hint) que deverá aparecer<br/>
 * 3. Nome da REGRA (fluxo) que será executada ao se clicar no botão (esta regra deverá ser do tipo cliente).<br/>
 * 4. Lista de parâmetros para execução da função.<br/>
 * 5. Largura da Imagem.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observação:<br/>
 * Ao posicionar o mouse sobre a imagem, é necessário que haja outra com o mesmo nome da primeira mais '_over' para reproduzir o efeito de destaque neste evento.<br/>
 * Ex.: Nome da imagem : "enviar_email.gif"<br/>
 *        Imagem necessária na pasta Skins\Default : "enviar_email_over.gif"
 */
function ebfNavigationFormAddButton(img, caption, func, params, size){
   if(!size){
     size = 40;
   }
   func = reduceVariable(func, false);
   d.n.addMainButton(skin+img, caption, function(){executeJSRule(ebfGetSystemID(), ebfGetFormID(), func, params)}, size);
   
}

/**
 * Usado para quebrar a linha (pular linha) em um texto, onde o parâmetro recebido será a quantidade de linhas à serem<br/>
 * puladas.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Quantidade de quebra de linhas.<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna um texto com a quantidade de quebra de linha passada como parâmetro.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1-Em um processamento com uma concatenação onde o 1º parâmetro é "Maker" (Texto) o segundo é uma Quebra de 1 Linha <br/>
 * (Função "Quebra de linha" passando 1(Inteiro) como parâmetro) e o terceiro é "Flow" (texto), o retorno seria:<br/>
 * "Maker<br/>
 * // Quebra de Linha<br/>
 * Flow".
 */
function ebfNewLine() {
  var value = "";
  if (existArgs(arguments)) {
    var qtd = arguments[0];
    while (qtd-- > 0) {
      value += "\n";
    }
  }
  return value;
}

/**
 * Muda o foco do componente para o próximo componente de acordo com a tabulação.<br/>
 * <br/>
 * Parâmetro:<br/>
 * 1. ID do Componente em foco.<br/>
 * <br/>
 * Retorno: <br/>
 * Não Possui.<br/>
 * <br/>
 * Observações:<br/>
 * 1. Pode ser utilizado o nome do componente ou obter através da função "Obter ID do Componente".
 */
function ebfNextFocus(componentAtual) {
  componentAtual = $c(componentAtual);
  if (typeof(componentAtual) != "undefined") {
     controller.next(componentAtual, false);
  } else  {
      controller.focusFirst();
   }  
}

/**
 * Abre o formulário associado ao componente grade passado como parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Componente Grade.<br/>
 * <br/>
 * Observações:<br/>
 * 1. Para aparecer a lista de componente do formulário é necessário selecionar o formulário de trabalho no "Inicio" do fluxo.<br/>
 * 2. Caso não queira selecionar o formulário no início, pode-se escrever o nome (Letras) do componente (nome da grade) como parâmetro.<br/>
 * 3. O evento deve estar no mesmo formulário onde está o componente grade.
 */
function ebfOpenFormGrid(gridName) {
  if (gridName) {
    var grid = $c(gridName);
    var selectedIndex = grid.grid.getProperty("selection/index");
    if (selectedIndex == -1 && grid.getRowCount() > 0) {
      grid.selectRow(0, true);
    }
    grid.timeout(grid.openNormalForm, 0);
  }
}

/**
 * Esta função abre um determinado relatório podendo este estar ou não filtrado, a depender do parâmetro passado. Se for <br/>
 * filtrado, o segundo parâmetro deve receber verdadeiro e no terceiro parâmetro deve ter o filtro. Se não for filtrado, o <br/>
 * segundo parâmetro deve ser falso e o terceiro deve estar nulo.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome do Relatório que será aberto.<br/>
 * 2. Para abrir filtrado, verdadeiro, caso contrário, falso.<br/>
 * 3. Filtro personalizado a ser passado.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observações:<br/>
 * 1. O segundo parâmetro que recebe verdadeiro ou falso indica se o relatório deve ser filtrado pelo formulário que o abre. Para <br/>
 * casos em que os campos do filtro coincidem com campos presentes na consulta do formulário. Exemplo: se o relatório tiver um filtro<br/>
 * chamado PES_COD e esse campo estiver presente na consulta do formulário chamador, o relatório resultante será filtrado pelo<br/>
 * valor corrente do campo em questão.<br/>
 * 2. Caso o relatório tenha sido feito pelo gerador de relatórios legado (RB7), o filtro do terceiro parâmetro deve ser montado com a <br/>
 * seguinte sintaxe: <campo>=<valor>[;<campo>=<valor>[;...]].<br/>
 * Exemplo: PES_UF=BA; PES_CIDADE=4. Também pode usar uma lista com tamanho par, onde os índices ímpares são os nomes <br/>
 * dos campos e os pares são os valores. O valor do campo utilizado nesse parâmetro sobrepõe o valor do campo que coincidir <br/>
 * com a consulta do formulário, conforme explicado no segundo parâmetro.<br/>
 * 2.1 Caso o relatório tenha sido feito pelo RB10, deve ser utilizado o nome do parâmetro definido no critério da consulta.<br/>
 * 2.2. O filtro a ser passado (no terceiro parâmetro) deve existir no relatório.<br/>
 * 3. Caso o relatório possua o filtro between (Entre), deve ser utilizada ao fim a expressão _copy (em minúsculo).<br/>
 * <br/>
 * Exemplo:<br/>
 * Assumindo como parâmetros o nome do relatório "Cidade" (Letras), a opção de filtro "verdadeiro" (Lógico) e o filtro <br/>
 * "cidade=Salvador", o resultado seria a abertura do relatório "Cidade" somente onde o campo Cidade fosse Salvador.
 */
function ebfOpenReport(reportID, useForm, filter) {
  openWFRReport2(sysCode, reportID, idForm, reportID, useForm, filter);
}

/**
 * Abre um relatório no contexto chamado, sem desviar para uma tela ou perguntar por parâmetros<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Código/Nome do Relatório<br/>
 * 2. Parâmetros do Relatório<br/>
 * 3. Tipo do relatório gerado (PDF, HTM, JPG, XLS, TXT, SCR)<br/>
 * 4. Abrir em uma nova janela?<br/>
 * 5. Usar o gerador local?<br/>
 * <br/>
 * Observações: <br/>
 * 1. O tipo SCR que pode ser informado no 3º parâmetro desta função está relacionado à abertura <br/>
 * do relatório em tela.<br/>
 * 2. Caso o relatório tenha sido criado no RB7 (Gerador de Relatórios legado), o filtro funciona da seguinte forma: CAMPO=valor<br/>
 * 2.1 Caso o relatório tenha sido criado no RB10, o filtro deve ser o nome do parâmetro definido no critério da consulta. parâmetro1=valor<br/>
 * 2.2 Caso queira definir vários parâmetros, basta separá-los por ; <br/>
 *       Ex: (parâmetro1=valor;parâmetro2=valor2)<br/>
 * 3. Caso o relatório possua o filtro between (Entre), deve ser utilizada ao fim a expressão _copy.<br/>
 * Ex:<br/>
 * Data_Pagamento_copy=14/11/1987,14/11/2009;<br/>
 * As datas devem ser separadas por vírgula e o copy deve ser todo minúsculo.
 */
function ebfOpenReportInline(reportID, params, type, popup, local) {
  url = "wfrcore";
  url += "?action=reportOpenExternal&Order=";
  url += "&localreport=" + (local?"ON":"OFF");
  url += "&nopopup=" + (!popup?"true":"false");
  url += "&sys=" + sysCode;
  url += "&reportID=" + reportID;
  url += "&exptype=" + type;
  if (params != null) {                             
    url += ("&" + params.replace(/;/g,"&"));
  }
  IframeTransporter(url);
}

/**
 * Abre um relatório com ordenação no contexto chamado, sem desviar para uma tela ou perguntar por parâmetros<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Código/Nome do Relatório<br/>
 * 2. Parâmetros do Relatório<br/>
 * 3. Ordenação do Relatório, no formato: tabela.campo1|[0|1][;tabela.campo2|[0|1][;tabela.campoN|[0|1]]],<br/>
 *                      sendo: "0" descendente e "1" ascendente. (Opcional)<br/>
 * <br/>
 *                      Ex: pessoa.cod_pessoa|1;pessoa.nome|0<br/>
 * <br/>
 * 4. Tipo do relatório gerado (PDF, HTM, JPG, XLS, TXT, SCR)<br/>
 * 5. Abrir em uma nova janela? (Verdadeiro para abrir em nova janela)<br/>
 * 6. Usar o gerador local? (Verdadeiro para usar o gerador local)<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observações:<br/>
 * 1. Caso o relatório tenha sido criado pelo gerador de relatórios legado (RB7), o filtro funciona a partir do campo. Ex: campo=valor;<br/>
 * 1.1 Caso o relatório tenha sido criado pelo RB10, o filtro funciona a partir do nome do parâmetro definido no critério da consulta. Ex: parâmetro1=valor;<br/>
 * 1.2 O filtro a ser passado (no segundo parâmetro) deve existir no relatório.<br/>
 * 2. Caso o relatório possua o filtro between (Entre), deve ser utilizada ao fim a expressão _copy.<br/>
 * Ex:<br/>
 * Data_Pagamento_copy=14/11/1987,14/11/2009;<br/>
 * As datas devem ser separadas por vírgula e o copy deve ser todo minúsculo.
 */
function ebfOpenReportInlineOrder(reportID, params, order, type, popup, local) {
  url = "wfrcore";
  url += "?action=reportOpenExternal&Order="+order;
  url += "&localreport=" + (local?"ON":"OFF");
  url += "&nopopup=" + (!popup?"true":"false");
  url += "&sys=" + sysCode;
  url += "&reportID=" + reportID;
  url += "&exptype=" + type;
  if (params != null) {
    url += ("&" + params.replace(/;/g,"&"));
  }
  IframeTransporter(url);
}

/**
 * Essa função ativa o leitor para a captura de uma digital.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome do fluxo que receberá o código da digital (Tipo inteiro) onde vai ser passado por uma função;<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui;<br/>
 * <br/>
 * Exemplo:<br/>
 * Essa função recebe como parâmetro o nome de um fluxo (que deve ser digitado) e o fluxo que será passado deve conter um parâmetro de entrada (Código da Digital) que vai ser passado pela função;<br/>
 * <br/>
 * Observações:<br/>
 * 1)Para utilizar essa função é necessário instalar o Servidor de Digitais e o Driver do Dispositivo. O Servidor de Digitais se<br/>
 * encontra no DVD de instalação e pode também ser obtido com a Softwell Solutions. O Driver de Dispositivo deve ser obtido<br/>
 * junto com o seu fabricante.<br/>
 * 2) Apenas será identificado o usuário que esteja cadastrado no Servidor de Digitais.<br/>
 * Este servidor deve estar na mesma máquina onde se encontra o banco de dados da aplicação.<br/>
 * 3) Quando o retorno é igual a -2, sabe-se que o Servidor de Digitais não foi encontrado.<br/>
 * Quando o retorno é igual a -1, sabe-se que o usuário não está cadastrado no Servidor de Digitais.<br/>
 * Caso contrário, será retornado o inteiro equivalente à impressão digital.
 */
function ebfOpenRuleDigitalCapture(ruleName) {
  var iframe = document.createElement("<iframe>");
  iframe.frameBorder = 0;
  iframe.setAttribute("frameborder", "no");
  iframe.setAttribute("border", 0);
  iframe.setAttribute("marginwidth", 0);
  iframe.setAttribute("marginheight", 0);
  iframe.width = 0;
  iframe.height = 0;
  iframe.src = "ruleDigitalQuery.jsp?sys=" + sysCode + "&formID=" + idForm + "&ruleName=" + URLEncode(ruleName);
  document.body.appendChild(iframe);
}

/**
 * Essa função calcula um pagamento, o qual retorna o valor das parcelas adicionando o juros.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Valor<br/>
 * 2. Quantidade de Meses<br/>
 * 3. Porcentagem dos Juros<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna o valor das parcelas adicionando o juros.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo o 1º parâmetro sendo 1000 (fracionado), o 2º parâmetro sendo 5 e o 3º parâmetro sendo 0,2. O retorno será 334,38.<br/>
 * <br/>
 * Observações: <br/>
 * A porcentagem tem que ser passada com as casas decimais, Exemplo: 1% é 0,01, 10% 0,1  etc.).
 */
function ebfPayment() {
  var result = 0.0;
  if (existArgs(arguments)) {
    result = (parseNumeric(arguments[0]) * parseNumeric(arguments[2])) / (1 - Math.pow( (1 / (1 + parseNumeric(arguments[2]))), toLong(parseNumeric(arguments[1]))));
  }
  return result;
}

/**
 * Muda o foco do componente para o componente anterior de acordo com a tabulação.<br/>
 * <br/>
 * Parâmetro:<br/>
 * 1. ID do Componente em foco.<br/>
 * <br/>
 * Retorno: <br/>
 * Não Possui.<br/>
 * <br/>
 * Observações:<br/>
 * 1. Pode ser utilizado o nome do componente ou obter através da função "Obter ID do Componente".
 */
function ebfPrevFocus(componentAtual) {
  componentAtual = $c(componentAtual);
  if (componentAtual) {
     controller.next(componentAtual, true);
  } else  {
      controller.focusFirst();
   }  
}

/**
 * Função que adiciona um item ao componente Opções passado como parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário<br/>
 * 2. Componente (Componente Opções)<br/>
 * 3. Valor (Referente ao item adicionado)<br/>
 * 4. Label (Nome que aparecerá)<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observação:<br/>
 * 1. Ao adicionar item ao componente dinamicamente, não é possível salvar a opção selecionada no banco.
 */
function ebfRadioGroupAdd(form, component, value, label){
  var component = $c(component);
  component.add(value, label);
}

/**
 * Função que remove todos os itens do componente Opções (RadioGroup).<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário.<br/>
 * 2. Componente.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function ebfRadioGroupClean(form, component){
  var component = $c(component);
  var size = component.options.length;
  for(i=0;i<size;i++){
    component.labels.splice(0, 1);
    component.values.splice(0, 1);
  }
  component.reDesign();
}

/**
 * Função que retorna a quantidade itens de um componente Opções<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário onde se encontra o componente<br/>
 * 2. Componente Opções<br/>
 * <br/>
 * Retorno:<br/>
 * Retorna a quantidade de items do componente (Inteiro)
 */
function ebfRadioGroupGetSize(form, component){  
  component = $c(component);
  return component.options.length;
}

/**
 * Função que cria um novo componente Opções dinâmicamente.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Aba (caso não seja definida, a aba será criada).<br/>
 * 2. Posição X.<br/>
 * 3. Posição Y.<br/>
 * 4. Largura do Componente.<br/>
 * 5. Altura do Componente<br/>
 * 6. Descrição do Componente<br/>
 * 7. Valor do Componente<br/>
 * 8. Lista de Labels<br/>
 * 9. Lista de Valores<br/>
 * <br/>
 * Retorno:<br/>
 * Não Possui.
 */
function ebfRadioGroupNew(aba,posX,posY,width,height,description,value,labels,values){
  var code = getCodComponent();
  var component = new HTMLRadioGroup(ebfGetSystemID(),ebfGetFormID(), code, posX, posY, width, height, description, value, labels, values);
  component.id = description;
  component.zindex = 3;
  component.loadComponentTime = 0;
  var container = $mainform().d.t.getTabByName(aba);
  if(!container){
     d.t.add(aba);
     container = $mainform().d.t.getTabByName(aba);
  } 
  component.design(container.div, true);
  document['c_' + code] = component;
}

/**
 * Função que remove um item do componente Opções tomando o label do item como referência.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário onde está localizado o componente Opções.<br/>
 * 2. Componente<br/>
 * 3. Label do item a ser removido<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function ebfRadioGroupRemoveByLabel(form, component, label){  
  component = $c(component);
  var idx = arrayIndexOf(component.labels, label);
  if (idx != -1) {
    component.values.splice(idx, 1);
    component.labels.splice(idx, 1);
  }
  component.reDesign();
}

/**
 * Função que remove um item do componente Opções tomando o índice como referência.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário<br/>
 * 2. Componente<br/>
 * 3. Índice do item a ser removido (O Primeiro é 0)<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observação:<br/>
 * O índice dos items estão na ordem N-1.
 */
function ebfRadioGroupRemoveItem(form, component, idx){  
  component = $c(component);
  component.values.splice(idx, 1);
  component.labels.splice(idx, 1);
  component.reDesign();
}

/**
 * Função que seleciona o item do componente Opções.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário.<br/>
 * 2. Componente.<br/>
 * 3. Índice do item que se deseja selecionar. (O primeiro item tem índice 0).<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observação:<br/>
 * 1. O índice dos items estão na ordem de N-1.
 */
function ebfRadioGroupSetChecked(form, component, idx){
  var component = $c(component);
  for(i=0;i<component.options.length;i++){
    if(component.options[i].value == idx){
      component.options[i].setChecked(true);
    } else {
      component.options[i].setChecked(false);
    }
  }
}

/**
 * Retorna um número inteiro aleatório entre 0 e o valor informado como parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Valor que definirá o intervalo do número. <br/>
 * <br/>
 * Retorno:<br/>
 * Número aleatório (Inteiro).<br/>
 * <br/>
 * Exemplos:<br/>
 * 1. Assumindo como parâmetro 7 (Inteiro), o retorno seria um número aleatório entre 0 e 7.
 */
function ebfRandom(value) {
  return parseInt(parseNumeric(value) * Math.random());
}

/**
 * A função atualiza o registro corrente de um formulário que está em uma moldura a partir de outro formulário.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário onde a moldura se encontra<br/>
 * 2. Moldura onde se encontra o outro formulário<br/>
 * <br/>
 * Retorno: <br/>
 * Não Possui.
 */
function ebfRefreshBevelOtherForm(form, com){
	  if (isNull(form)) {
	    throw 'Defina um formulário para atualizar a moldura!';
	  }
	  var mainWindow = $mainform();
	  
	  while(getOpenerWindow(mainWindow) != null){
	    mainWindow = getOpenerWindow(mainWindow);
	    
	  }//encontra a janela principal do Sistema
	  
	  //procura o formulário usando o GUID passado
	  var myForm = searchFormByGUID(mainWindow,form);

	  //verifica se o formulário foi encontrado
	  if(myForm){ 
	    // obtem o componente   
	    var component = myForm.$c(com);
	    if (!isNull(component)){
		    	var oldIframe = component.div.getElementsByTagName("DIV")[0].getElementsByTagName("iframe")[0];	  
		    	myForm.eval(oldIframe.id).mainform.d.n.execAjaxEval("refresh");
	    }else{   
	      component = myForm.controller.getElementById(com, form);
	      if (isNull(component)) {
	        throw 'Moldura não encontrada no formulário escolhido!';
	      }
	      
	      var oldIframe = component.div.getElementsByTagName("DIV")[0].getElementsByTagName("iframe")[0];	  
	      myForm.eval(oldIframe.id).mainform.d.n.execAjaxEval("refresh");
	      
	    }
	  }else{
	    throw 'O Formulário cuja moldura se deseja atualizar não está aberto!';
	  }
}

/**
 * Atualiza o componente em outro formulário.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário.<br/>
 * 2. Componente.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function searchFormByGUIDRefreshComponentOtherForm(currentForm,GUID){
  if (currentForm && currentForm.formGUID == GUID){
    return currentForm;
  }

  if (currentForm && currentForm.mainform && currentForm.mainform.formGUID == GUID){
    return currentForm.mainform;
  }
  if (currentForm.children){
    for (var i=0;i<currentForm.children.length;i++){
      try {
        if (currentForm.children[i].mainform){
          if (currentForm.children[i].mainform.formGUID == GUID){
            return currentForm.children[i].mainform;
          }
          var returnForm = searchFormByGUIDRefreshComponentOtherForm(currentForm.children[i],GUID);
          if (returnForm){
            return returnForm;
          }
        }
      }catch(e){}
    }
  }
}

function ebfRefreshComponentOtherForm(form, com){
  if (isNull(form)) {
    throw 'Defina um formulário para atualizar o valor de um componente!';
  }
  var mainWindow = $mainform();

  while(getOpenerWindow(mainWindow) != null){
    mainWindow = getOpenerWindow(mainWindow);

  }//encontra a janela principal do Sistema

  //procura o formulário usando o GUID passado
  var myForm = searchFormByGUIDRefreshComponentOtherForm(mainWindow,form);

  //verifica se o formulário foi encontrado
  if(myForm){
    // obtem o componente
    var component = myForm.controller.getElementById(com);
    if (!isNull(component)){
      component.refresh();
    }else{
      component = myForm.controller.getElementById(com, form);
      if (isNull(component)) {
        throw 'Componente não encontrado para o formulário escolhido!';
      }
      component.refresh();
    }
  }else{
    throw 'O Formulário cujo componente se deseja atualizar não está aberto!';
  }
}

/**
 * Atualiza o registro corrente do formulário pai.<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não possui.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function ebfRefreshCurrentRecortParentForm() {
  top.opener.mainform.d.n.execAjaxEval("refresh");
}

/**
 * A função atualiza o formulário onde está o evento.<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não Possui<br/>
 * <br/>
 * Retorno: <br/>
 * Não Possui.<br/>
 * <br/>
 * Observação:<br/>
 * 1. Se essa função for executada antes de salvar alterações feitas no formulário, estas serão perdidas, pois a <br/>
 * essa função traz os dados existente no banco.
 */
function ebfRefreshForm() {
  $mainform().d.n.actRefresh();
}

/**
 * Essa função é utilizada para atualizar o registro que está sendo mostrado no formulário.<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não possui.<br/>
 * <br/>
 * Retorno: <br/>
 * Não possui.
 */
function ebfRefreshRecord() {
  $mainform().d.n.execAjaxEval("refresh");
}

/**
 * Remove acentos do texto passado por parâmetro<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Texto (Letras)<br/>
 * <br/>
 * Retorno:<br/>
 * Texto sem acentos (Letras)<br/>
 * <br/>
 * Exemplo:<br/>
 * àèìòùáéíóúâêîôûãõçñäëïöüÀÈÌÒÙÁÉÍÓÚÂÊÎÔÛÃÕÇÑÄËÏÖÜ<br/>
 * Sera retornado isto:<br/>
 * aeiouaeiouaeiouaocnaeiouAEIOUAEIOUAEIOUAOCNAEIOU
 */
function ebfRemoveAccents(text) {
  if (text == null || typeof text == "undefined") {
    return null;
  }
  return translateAcentos(text);
}

/**
 * Remove todos os filhos do elemento passado por parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Árvore <br/>
 * 2. Elemento do qual serão removidos os filhos.<br/>
 * <br/>
 * Exemplo:<br/>
 * Para remover todos os filhos do elemento que está na variável "Elemento" e pertence à árvore cuja referência está <br/>
 * armazenada na variável "Árvore", deverão ser passados os parâmetros "Árvore" e "Elemento".
 */
function ebfRemoveAllChildsOf(tree,element){	
  return tree.removeAllChildsOf(element);	
}

/**
 * Remove o botão de valores padrão do formulário.<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não possui.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observação:<br/>
 * 1. Esta função deve ser utilizada no evento ao entrar.
 */
function ebfRemoveDefaultValuesButton() {
  var nav = $mainform().d.n;

  if (nav) {
    nav.btDefaultValues.img.style.width = 0;
    if (nav.btHelp) {
      var btHelpX = nav.btHelp.getX();
      nav.btHelp.setX(nav.btDefaultValues.getX());
      if (nav.btExit) {
        nav.btExit.setX(btHelpX);
      }
    }
    nav.btDefaultValues = null;
  }  
}

/**
 * Remove o elemento passado por parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Árvore <br/>
 * 2. Elemento que será removido<br/>
 * <br/>
 * Exemplo:<br/>
 * Para remover o elemento que está na variável "Elemento" e pertence à árvore cuja referência está armazenada na <br/>
 * variável "Árvore", deverão ser passados os parâmetros "Árvore" e "Elemento".
 */
function ebfRemoveElement(tree,element){	
  tree.removeElement(element);	
}

/**
 * Essa função busca o elemento, que deseja obter, a partir da sua posição na lista e o remove do mesmo.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Objeto Lista<br/>
 * 2. Posição do elemento na lista que será removido<br/>
 * <br/>
 * Retorno: <br/>
 * Elemento removido da lista. O retorno da função pode ser armazenado numa variável do tipo variante.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo que o 1º parâmetro seja uma lista com os seguintes valores: {a, b, c, h}, o 2º parâmetro seja 4. O retorno<br/>
 * será o elemento "h" removido da lista, pois o elemento que está na posição 4 da lista é o "h".<br/>
 * 2. Assumindo que o 1º parâmetro seja uma lista com os seguintes valores: {56, 26, 95, 62}, o 2º parâmetro seja 2.<br/>
 * O retorno será o elemento "26" removido da lista, pois o elemento que está na posição 2 da lista é o "26";.<br/>
 * <br/>
 * Observação:<br/>
 * 1. Ao utilizar esta função num fluxo do tipo cliente, é necessário atribuir o retorno da mesma à lista cujo elemento se <br/>
 * deseja remover.<br/>
 *   - A função quando executada no cliente retorna a lista resultante após a remoção do objeto desejado.<br/>
 *   - A função quando executada no servidor retorna o objeto removido.
 */
function ebfRemoveElementFromList(list, idx) {
  if (list) {
    if ((idx) && (list.splice)) {
       list.splice((idx-1), 1);
    }
  }
  return list;
}

/**
 * Remove os botões de Gravar e Gravar+ do formulário.<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não possui.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observação:<br/>
 * Esta função remove os botões de Gravar e Gravar+ do modo de Inserção/alteração.
 */
function ebfRemoveSaveButtons() {
	  var navigation = $mainform().d.n;
	  if (navigation) {
	    if ((navigation.insButtons.length == 3) && (navigation.insButtons[0] != null)) {
	      navigation.insButtons[2].setX(navigation.insButtons[0].getX());
	      navigation.insButtons[1].setX(navigation.insButtons[0].getX());
	      navigation.insButtons[1].setVisible(false);
	      navigation.insButtons[0].setVisible(false);
	      navigation.insButtons[1] = null;
	      navigation.insButtons[0] = null;
	    }else if((navigation.insButtons.length < 3) && (navigation.insButtons[0] != null)){
	      navigation.insButtons[1].setVisible(false);
	      navigation.insButtons[0].setVisible(false);
	      navigation.insButtons[1] = null;
	      navigation.insButtons[0] = null;		  	    	
	    }
	    	
	  }
	}

/**
 * Remove  o botão de Gravar+ do formulário. Este botão é visível quando o formulário se encontra em modo de inserção.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observação:<br/>
 * 1. A função deve ser utilizada no evento ao entrar ou em modo normal do formulário.
 */
function ebfRemoveSaveMoreButton() {
  var navigation = $mainform().d.n;
  if ((navigation)&&(navigation.insButtons[0] != null)) {
    if((navigation.insButtons[1] != null)&&(navigation.insButtons[2] == null)){
      navigation.insButtons[1].setX(navigation.insButtons[0].getX());
      navigation.insButtons[0].setVisible(false);
      navigation.insButtons[0] = null;
    
    }else if (navigation.insButtons.length == 3) {
      navigation.insButtons[2].setX(navigation.insButtons[1].getX());
      navigation.insButtons[1].setX(navigation.insButtons[0].getX());
      navigation.insButtons[0].setVisible(false);
      navigation.insButtons[0] = null;
    }
  }
}

/**
 * Remove a variável de sessão passando no 1º parâmetro o nome da variável e no 2º o valor lógico que indica se ela é ou<br/>
 * não global.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome da Variável<br/>
 * 2. Valor Lógico (verdadeiro = variável global, falso = variável não global).<br/>
 * <br/>
 * Retorno:<br/>
 * Variante
 */
function ebfRemoveSessionAttribute(name, global){
  var content = getContent("sessionManager.do?sys=" + sysCode + "&nome=" + name + "&global=" + global + "&acao=remove");
  var ajaxReturn = eval(content);
  if (ajaxReturn) {
    return ajaxReturn;
  } else {
    return "";
  }
}

/**
 * A função localiza o 2º parâmetro dentro do texto e o substitui pelo conteúdo passado no 3º parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Texto.<br/>
 * 2. Valor à encontrar.<br/>
 * 3. Novo Valor.<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna o texto modificado. <br/>
 * <br/>
 * Observação:<br/>
 * A função só substitui a primeira ocorrência encontrada. Para substituir todas as subsequências encontradas utilize a função<br/>
 * Troca Todas as Subsequências.<br/>
 * <br/>
 * Exemplo: <br/>
 * 1.Assumindo os parâmetros como "Maker Flow" (Letras),"a"(Letras), e "%" (Letras), o retorno será "M%ker Flow".
 */
function ebfReplace() {
  var value = "";
  if (existArgs(arguments)) {
    value = arguments[0].toString();
    var valueToFind = arguments[1].toString();
    var valueToReplace = arguments[2].toString();
    value = value.replace(valueToFind, valueToReplace);
  }
  return value;
}

/**
 * Esta função localiza todas as subseqüências iguais ao  2º parâmetro dentro do texto e os substituem pelo conteúdo passado no<br/>
 * 3º parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Texto.<br/>
 * 2. Valor à encontrar.<br/>
 * 3. Valor desejado.<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna o texto modificado. <br/>
 * <br/>
 * Observação:<br/>
 * A substituição é feita em todas as subseqüências encontradas.<br/>
 * <br/>
 * Exemplo: <br/>
 * 1.Assumindo os parâmetros como "Banana" (Letras),"na"(Letras), e "&" (Letras), o retorno será "Ba&&".
 */
function ebfReplaceAll(OldString,FindString,ReplaceString) {
   if(!OldString) OldString = "";
   var SearchIndex = 0;
   var NewString = "";
   OldString = OldString.toString(); 
   FindString = FindString.toString();
   ReplaceString = ReplaceString.toString();
   while (OldString.indexOf(FindString,SearchIndex) != -1) {
   NewString += OldString.substring(SearchIndex,OldString.indexOf(FindString,SearchIndex));
   NewString += ReplaceString;
   SearchIndex = (OldString.indexOf(FindString,SearchIndex) + FindString.length);
   }
   NewString += OldString.substring(SearchIndex,OldString.length);
   return NewString;
}

/**
 * Essa função busca um elemento, a partir da sua posição na lista e o substitui por um novo elemento.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Objeto Lista<br/>
 * 2. Posição do elemento na lista que será substituído<br/>
 * 3. Novo elemento<br/>
 * <br/>
 * Retorno: <br/>
 * Posição do elemento da Lista que foi substituído.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo que o 1º parâmetro seja uma lista com os seguintes valores: {a, t, c, h}, o 2º parâmetro seja 1 e o 3º parâmetro "k". O retorno será a lista atualizada com os seguintes elementos: {k, t, c, h}, pois o elemento que está na posição 1 da lista é o "a".<br/>
 * 2. Assumindo que o 1º parâmetro seja uma lista com os seguintes valores: {95, 35, 02, 806}, o 2º parâmetro seja 3 e o 3º parâmetro "357". O retorno será a lista atualizada com os seguintes elementos: {95, 35, 357, 806}, pois o elemento que está na posição 3 da lista é o "02".
 */
function ebfReplaceElementFromList() {
  listReturn = null;
  if (existArgs(arguments)) {
    listReturn = arguments[0];
    var position = parseInt(arguments[1]) - 1;
    position = Math.max(0, position);
    position = Math.min(position, (arguments[0].length - 1));
    listReturn[position] = arguments[2];
  }
  return listReturn;
}

/**
 * Obtém o conteúdo de um componente do formulário principal ou de qualquer outro passado como parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário onde se localiza o componente a ser obtido o valor. <br/>
 * 2. Campo do qual se deseja obter o valor. <br/>
 * <br/>
 * Retorno: <br/>
 * Conteúdo do campo passado como parâmetro.<br/>
 * <br/>
 * Observações:<br/>
 * 1.Para essa regra funcionar como servidor, é necessário que o componente esteja associado a um campo da tabela.<br/>
 * 2.Se não for o formulário principal (que chama o fluxo) e o mesmo estiver aberto, o retorno será o conteúdo do campo <br/>
 * passado naquele registro. Caso o formulário passado não esteja sendo utilizado, o retorno será o primeiro registro no banco.<br/>
 * 3. Para obter o valor de um componente que se encontra em um Sub Form, deve ser passado o formulário do Sub Form<br/>
 * como parâmetro.<br/>
 * <br/>
 * Exemplo:<br/>
 * 1.No formulário "Cadastro" cujo conteúdo do campo "Cidade" é "Salvador", assumindo como parâmetros Cadastros <br/>
 * (Formulário), "Cidade" (Campo), o retorno seria "Salvador".
 */
function ebfSQLGetFieldFromForm(form, com) {
  return controller.getElementById(com, form).getValue(); 
}

/**
 * Obtém o conteúdo do campo passado como parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Campo no qual deseja obter o conteúdo.<br/>
 * <br/>
 * Retorno: <br/>
 * Conteúdo do campo.<br/>
 * <br/>
 * Observações:<br/>
 * 1. Para selecionar o campo é necessário indicar o nome do formulário no de trabalho no "Inicio" do fluxo.<br/>
 * 2. Caso não queira selecionar o formulário de trabalho, digite o nome do campo mudando a constante do tipo "formulário" para <br/>
 * uma constante do tipo "Letras".<br/>
 * 3. É necessário que o componente esteja associado a um campo da tabela.<br/>
 * 4. Caso o formulário que se deseja obter o campo esteja dentro de um componente moldura, deve-se utilizar a função "Executar Fluxo no Formulário"<br/>
 * e apontar para um fluxo que contenha esta função.<br/>
 * <br/>
 * Exemplo:<br/>
 * 1.Em um formulário cujo conteúdo do campo "Cidade" é "Salvador", assumindo como parâmetros este campo ("Cidade") ,o <br/>
 * retorno seria "Salvador".
 */
function ebfSQLGetFormField() {
  var value = "";
  if (existArgs(arguments)) {
    value = getFormFieldValue(arguments[0]);
  }
  return value;
}

/**
 * Altera o campo do formulário com o conteúdo passado no 2° parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Campo para ser alterado.<br/>
 * 2. Novo valor do campo.<br/>
 * <br/>
 * Retorno:<br/>
 * Não Possui.<br/>
 * <br/>
 * Observações:<br/>
 * 1.Para selecionar o campo é necessário indicar o nome do formulário no "Inicio" do fluxo . <br/>
 * 2.Caso não queira indicar o formulário no início, pode escrever o nome (Letras) do campo como parâmetro.<br/>
 * 3.O campo precisa estar associado a um campo da Tabela. Caso o isso não ocorra, usa-se a função "Alterar valor do <br/>
 * componente" da categoria "Formulário".<br/>
 * 4. A função não determina qual o formulário onde deve ser alterado, No entanto caso queira alterar um valor da grade<br/>
 * será necessário usar a função "Alterar valor do componente"<br/>
 * <br/>
 * Exemplo: <br/>
 * Assumindo como parâmetros os campos "Telefone" (Letras) de uma tabela qualquer e o valor "3354-9554"(Letras), <br/>
 * após o fluxo ser executado o campo "Telefone" conterá o conteúdo "3354-9554".
 */
function ebfSQLSetFormField() {
  if (existArgs(arguments)) {
    changeFormFieldValue(arguments[0], arguments[1]);
  }
  return true;
}

/**
 * Esta função procura dentro do 1° parâmetro a subseqüência passada no 2º parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Texto onde será feita a pesquisa.<br/>
 * 2. Valor a ser localizado.<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna verdadeiro se encontrar a subseqüência ou falso caso não encontre.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1.Assumindo os parâmetros como 'Maker'(Letras), e 'Ma '(Letras) , o retorno seria verdadeiro.<br/>
 * 2.Assumindo os parâmetros como 'Maker'(Letras), e 'Ja '(Letras) , o retorno seria falso.
 */
function ebfSearchSubstring() {
  var indice = 0;
  if (existArgs(arguments)) {
    var value = arguments[0].toString();
    var valueToFind = arguments[1].toString();
    indice = value.indexOf(valueToFind);
  }
  return indice != -1;
}

/**
 * Esta função obtém e retorna o objeto da aba que está ativa quando o fluxo é executado.<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não Possui.<br/>
 * <br/>
 * Retorno: <br/>
 * Objeto da aba ativa.<br/>
 * <br/>
 * Exemplo:<br/>
 * Se a aba é "Cadastros", a função gera um objeto desta aba. [object HTMLab Cadastro]
 */
function ebfSelectedTab() {
  return d.t.getSelectedTab();
}

/**
 * Define um valor de um Cookie.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome do cookie definido.<br/>
 * 2. Valor do cookie.<br/>
 * 3. Comentário.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Ex.:<br/>
 * 1.°Parâmetro: senhaUsuarios<br/>
 * 2.°Parâmetro: 123<br/>
 * 3.°Parâmetro: Senha de um usuário logado em uma <br/>
 * <br/>
 * Observações:<br/>
 * 1. Existe uma função "Obter valor de um Cookie" que permite obter o cookie criado por essa função.
 */
function ebfSetCookie(cookieName,cookieValue,cookieComment) { 
  var today = new Date(); 
  var expire = new Date(); 	 
  expire.setTime(today.getTime() + 3600000*24); 
  document.cookie = cookieName+"="+escape(cookieValue) 
  + ";expires="+expire.toGMTString(); 
}

/**
 * Essa função insere um elemento numa lista, podendo indicar a sua posição na lista. <br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Objeto Lista<br/>
 * 2. Elemento a ser inserido<br/>
 * 3. Inteiro indicando a posição do elemento na Lista ou nulo indicando inclusão no final da lista (OPCIONAL)<br/>
 * <br/>
 * Retorno:<br/>
 * Lista atualizada. O retorno da função pode ser armazenado numa variável do tipo variante.<br/>
 * <br/>
 * Exemplos:<br/>
 * 1. Assumindo que o 1º parâmetro seja uma lista com os seguintes valores: {a, b, c, d, e, f, g, h}, o 2º parâmetro "s" e o 3º<br/>
 * parâmetro NULO. O retorno será uma lista com os seguintes valores: {a, b, c, d, e, f, g, h, s}. Como não indicou a posição<br/>
 * do elemento, ele é inserido na ultima posição da lista.<br/>
 * 2. Assumindo que o 1º parâmetro seja uma lista com os seguintes valores: {v, y, d}, o 2º parâmetro "u" e o 3º parâmetro 2. <br/>
 * O retorno será uma lista com os seguintes valores: {v, u, y, d}. Como o 3º parâmetro determina a posição do elemento na<br/>
 * lista, ele será inserido na posição 2 da lista.
 */
function ebfSetElementAtList() {
  var value = null;
  if (existArgs(arguments)) {
    var list = arguments[0];
    var element = arguments[1];
    var position = arguments[2];
    if (position) {
      position--;
      position = Math.max(0, position);
      position = Math.min(position, list.length);
      if (position == 0) {
        list.unshift(element);
      } else if (position == (list.length)) {
        list.push(element);
      } else {
        var arr1 = list.slice(0, (position-1));
        arr1.push(element);
        var arr2 = list.slice(position);
        value = new Array();
        value = value.concat(arr1);
        value = value.concat(arr2);
      }
    } else {
      list.push(element);
    }
    value = list;
  }
  return value;
}

/**
 * Altera o tipo, tamanho e cor da fonte dos elementos da árvore.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Árvore <br/>
 * 2. Tipo de Letra (Exemplo: Arial,Helvetica, sans-serif)<br/>
 * 3. Tamanho da Fonte<br/>
 * 4. Cor da Fonte<br/>
 * <br/>
 * Exemplo: <br/>
 * 1 - Assumindo como parâmetros a árvore, "arial black",  12 e #666600, a fonte dos elementos da árvore irá alterar para o tipo e tamanho passado por parâmetro e a cor da fonte será vermelha.<br/>
 * <br/>
 * Observação:<br/>
 * A árvore pode ser obtida através da função "Obter Componente" da categoria Formulário.
 */
function ebfSetFontStyle(tree,font,size,color){	
  tree.setFontStyle(font,size,color);		
}

/**
 * Altera a altura dos ícones da árvore para a passada por parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Árvore. <br/>
 * 2. Nova altura dos ícones.<br/>
 * <br/>
 * Exemplo:<br/>
 * 1.Assumindo como parâmetros a referência para a árvore e 20, a altura dos ícones será alterada para 20. <br/>
 * <br/>
 * Observação:<br/>
 * A árvore pode ser obtida através da função "Obter Componente" da categoria Formulário.
 */
function ebfSetIconsHeight(tree,height){	
  tree.setIconsHeight(height);	
}

/**
 * Agenda a execução de um fluxo para ser executado após um determinado tempo. <br/>
 * O tempo deve ser definido em milisegundos.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Digite o nome da regra. (Letras)<br/>
 * 2. Lista de parâmetros da regra<br/>
 * 3. Tempo para a regra ser executada, em milissegundos<br/>
 * <br/>
 * Observações:<br/>
 * 1. Fluxo cliente somente agenda para a camada CLIENTE, e servidor somente para a camada SERVIDOR, para agendar <br/>
 * fluxos de outra camada utilize um subfluxo para agendar;<br/>
 * 2. Fluxo servidor não interage com a tela, funções como "Habilitar Controle" ou mensagens não serão exibidos.
 */
function ebfSetRuleExecutionTime(rule, ruleParams, time){
  rule = reduceVariable(rule, false);
  var parametros = "";
  if (ruleParams != null && typeof ruleParams != 'undefined') {
    for (var i = 0; i < ruleParams.length; i++) {
      parametros += ("'" + ruleParams[i] + "'");
      if (i != ruleParams.length-1) {
        parametros += ",";
      }
    }
  }
  var system;
  var formID = "";
  if (d && d.WFRForm && d.WFRForm.sys && d.WFRForm.formID) {
    system = d.WFRForm.sys.value;
    formID = d.WFRForm.formID.value;
  } else {
    system = sysCode;
  }
  setTimeout("executeJSRuleNoField('" + system + "', '" + formID + "', '" + rule + "', [" + parametros + "])", time);
}

/**
 * As variáveis de sessão são utilizadas quando houver a necessidade de ter uma variável que se mantém para regras<br/>
 * diferentes. Variáveis de sessão não globais se mantém de acordo com o usuário e as globais se mantém para todo usuário.<br/>
 * Se for necessário, por exemplo, guardar a hora de login de um usuário para ser utilizada em várias regras diferentes, essa<br/>
 * variável de sessão será local. Se for necessário, por exemplo, guardar a quantidade de usuários logados, essa variável de<br/>
 * sessão será global.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome da variável.<br/>
 * 2. Valor a ser armazenado.<br/>
 * 3. Escopo da variável. Recebe verdadeiro(se ela vai ser global) ou falso (não global - exclusiva do usuário atual).<br/>
 * <br/>
 * Retorno:<br/>
 * Retorna o antigo valor da variável. Caso a variável não exista, retorna Nulo.<br/>
 * <br/>
 * Exemplos:<br/>
 * Assumindo como parâmetros: Contador (Letras),6 (Inteiro) e Verdadeiro (Lógico), quando a função for executada vai ser criada uma varável global chamada Contador com o conteúdo 6.<br/>
 * <br/>
 * Obs.: <br/>
 * <br/>
 *   - As variáveis de sessão definidas num fluxo servidor poderão ser acessadas apenas em regras do tipo servidor, da mesma forma acontece se estas forem definidas num fluxo cliente. As funções que acessam variáveis de sessão são: "Obter variável da Sessão" e "Remover variável da Sessão".<br/>
 *   - As variáveis de sessão definidas num fluxo do tipo cliente não tem a opção de escopo global ou local, sempre que definidas, tais variáveis tem escopo local, de modo que o terceiro parâmetro desta função pode ser desconsiderado.<br/>
 *   - Filtragem de relatórios por variável de sessão. Caso exista uma variável de sessão com o formato<br/>
 *     REPORT_FILTER_<campo do filtro do relatório>, o sistema preenche automaticamente o filtro.
 */
function ebfSetSessionAttribute(name, value, global){
  var postData = ("sys=" + sysCode + "&nome=" + URLEncode(name) + "&valor=" + URLEncode(value) + "&global=" + global + "&acao=set");
  var content = postURL("sessionManager.do", postData);
  return content;
}

/**
 * Exibe uma mensagem de impressão de relatório.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Mensagem. (Letras)<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui<br/>
 * <br/>
 * Observações:<br/>
 * 1. Essa função deve ser utilizada antes das funções de "Abrir Relatório".<br/>
 * <br/>
 * Ex:<br/>
 * 1º Parâmetro = O relatório está sendo gerado...
 */
function ebfShowMainMessage(msg) {

  var win = $mainform();
  
  var myWidth = 0, myHeight = 0;
  var w = 300;
  var h = 40;

  if( typeof( win.innerWidth ) == 'number' ) {
    myWidth = win.innerWidth;
    myHeight = win.innerHeight;
  } else if( win.document.documentElement &&
      ( win.document.documentElement.clientWidth || win.document.documentElement.clientHeight ) ) {
    myWidth = win.document.documentElement.clientWidth;
    myHeight = win.document.documentElement.clientHeight;
  } else if( win.document.body && ( win.document.body.clientWidth || win.document.body.clientHeight ) ) {
    myWidth = win.document.body.clientWidth;
    myHeight = win.document.body.clientHeight;
  }

  l = (myWidth - w) / 2;
  t = (myHeight - h) / 2;

  if (msg != '') {
    var div = win.document.createElement("div");
    div.style.width = w;
    div.style.height = h;
    div.style.left = l+'px';
    div.style.top = t+'px';
    div.style.position = 'absolute';
    div.name  = 'messageDIV';
    div.id  = 'messageDIV';
    div.style.display = 'block';
    div.style.zIndex = 1000000;
    
    div.innerHTML = '<table width='+w+' height='+h+' border=0 cellpadding=2 cellspacing=1 bgcolor=#000000><tr><td bgcolor=#FFFF99><center><font face=arial size=2>'+msg+'</font></center></td></tr></table>';
    win.document.messageDIV = div;
    win.document.body.appendChild(div);
 
    if (win.parent) {
      var self = $mainform();   
      win.parent.hideMainMessage = function() {
        self.hideMainMessage();
      }
    }  
    
  } else
    win.hideMainMessage();
}

/**
 * Mostra a Árvore<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Árvore<br/>
 * 2. Valor Lógico<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo os parâmetros como "Árvore" (Variante) e "False" (Lógico). Então a árvore será escondida. Caso o valor <br/>
 * lógico seja "True", a árvore aparecerá.
 */
function ebfShowTree(tree,view){	
  if (view)
    tree.showTree();
  else
    tree.hideTree();		
}

/**
 * Separa o texto em um determinado caractere passado no 2° parâmetro e retorna cada parte deste texto em uma posição<br/>
 * de uma lista.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Texto que será quebrado.<br/>
 * 2. Caractere.<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna uma lista com o texto separado (Lista).<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo os parâmetros como "M,A,K,E,R,F,L,O,W" (Letras), e "," (Letras),  o retorno será uma lista com 09 elementos<br/>
 * contendo "M"|"A"|"K"|"E"|"R"|"F"|"L"|"O"|"W" respectivamente.
 */
function ebfSplit(text, caracterSplit) {
  return text.split(caracterSplit);
}

/**
 * Interrompe a execução do fluxo. Caso seja passado alguma mensagem por parâmetro, esta é exibida.<br/>
 * Se houver algum processamento após a utilização dessa função, este não será executado.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Mensagem a ser exibida (Opcional).<br/>
 * <br/>
 * Exemplo:<br/>
 * 1. Assumindo como parâmetro "Operação Cancelada" (Letras), quando a função for executada exibirá a mensagem "Operação Cancelada" e o fluxo será interrompido. Nenhum processamento depois dele será executado.
 */
function ebfStopRuleExecution(msg) {
  document.hasRuleErrors = true;
  throw new StopRuleExecution(msg);
}

/**
 * Separa o texto em um determinado caractere passado no 2° parâmetro e retorna cada parte deste texto em uma posição<br/>
 * de uma lista.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Texto que será quebrado.<br/>
 * 2. Caractere.<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna uma lista com o texto separado (Lista).<br/>
 * <br/>
 * Exemplos: <br/>
 * 1-Assumindo os parâmetros como "M,A,K,E,R,F,L,O,W" (Letras), e "," (Letras),  o retorno uma lista com 09 elementos contendo "M"|"A"|"K"|"E"|"R"|"F"|"L"|"O"|"W" respectivamente.
 */
function ebfStrSplit(texto, separador) {
  return texto.split(separador);
}

/**
 * Inverte o texto passado por parâmetro.  <br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Texto a ser invertido.<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna o texto invertido(Letras).<br/>
 * <br/>
 * Exemplos:<br/>
 * 1.Assumindo como parâmetro a palavra "Maker"; (Letras), o retorno seria "rekaM".
 */
function ebfStringReverse(value) {
  var output = "";
  for (i = 0; i <= value.length; i++) {
    output = value.charAt (i) + output;
  }
  return output;
}

/**
 * Converte um texto para o formato HTML.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Texto que será convertido. <br/>
 * <br/>
 * Retorno:<br/>
 * Texto no formato HTML. (Letras)<br/>
 * <br/>
 * Observações:<br/>
 * HTML é uma linguagem de marcação utilizada para produzir páginas na Web<br/>
 * <br/>
 * Exemplo:<br/>
 * 1-Assumindo como parâmetro a variável "Texto", o retorno será o conteúdo da variável "Texto" convertido para o formato <br/>
 * HTML.
 */
function ebfStringToHTMLString(value) {
  return stringToHTMLString(value);
}

/**
 * Converte para o formato Texto removendo os caracteres especiais de JavaScript. <br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Texto normal para ser convertido para o formato padrão JavaScript.<br/>
 * <br/>
 * Retorno:<br/>
 * Texto passado por parâmetro convertido para o Padrão JavaScript. (Letras)<br/>
 * <br/>
 * Exemplo:<br/>
 * Assumindo como parâmetro o conteúdo "<br/>
 * ", o retorno será "\r", pois "<br/>
 * " é um caractere especial JavaScript.
 */
function ebfStringToJs(value) {
  return stringToJs(value);
}

/**
 * A função recebe um texto (1º parâmetro) e retorna uma subsequência deste texto. A subsequência inicia na posição<br/>
 * indicada no 2º parâmetro, com o tamanho indicado no 3º parâmetro, <br/>
 * <br/>
 * Parâmetros:<br/>
 * 1.Texto<br/>
 * 2. Posição inicial da subsequência que se deseja obter.<br/>
 * 3. Quantidade de caracteres da subsequência.<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna a subsequência contida no texto(Letras) passado no 1º parâmetro, que inicia na posição informada no<br/>
 * 2º parâmetro, e contém o número de caracteres informado no 3º parâmetro.<br/>
 * <br/>
 * Exemplos:<br/>
 * 1.Assumindo como parâmetros "Fluxo de ações" (Letras), 2 (Inteiro) e 10(Inteiro). O retorno será "luxo de aç".
 */
function ebfSubstring() {
  var retorno = "";
  if (existArgs(arguments)) {
    var value = arguments[0].toString();
    var length = value.length;
    var ini = parseInt(arguments[1]) - 1;
    var fim = ini + parseInt(arguments[2]);
    ini = ini < 0 ? 0 : ini;
    fim = fim > length ? length : fim;
    if (!(ini > length || ini >= fim)) {
      try {
        retorno = value.substring(ini, fim);
      } catch (ex) {
      }
    }
  }
  return retorno;
}

/**
 * A função recebe um texto (primeiro parâmetro) e retorna apenas a quantidade de caracteres passada no segundo<br/>
 * parâmetro a partir do final, ou seja, contados de trás pra frente.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1.Texto<br/>
 * 2. Quantidade de caracteres que não serão removidos do texto.<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna o texto (Letras) com apenas a quantidade de caracteres passado no segundo parâmetro do texto, contados de<br/>
 * trás para frente.<br/>
 * <br/>
 * Exemplos:<br/>
 * 1. Assumindo como parâmetros:<br/>
 * 1°: Maker Flow (Letras)<br/>
 * 2°:3(Inteiro)<br/>
 * Retorno: low(Letras)
 */
function ebfSubstringInverse(value, size) {
  var valor = ebfStringReverse(value);
  valor = ebfSubstring(valor, 1, size);
  valor = ebfStringReverse(valor);
  return valor;
}

/**
 * Função que cria uma nova aba dinamicamente.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome da Aba.<br/>
 * 2. Valor lógico que confirma a criação da aba mesmo que já exista outra de mesmo nome.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function ebfTabNew(name,duplicate){
  var container = $mainform().d.t.getTabByName(name); 
  if(!container || duplicate){
    if(d.t){
      d.t.add(name);
    }
  }
}

/**
 * Recebe um texto ou Variável no 1º parâmetro para ser impresso e no 2º parâmetro recebe a porta que será usada para<br/>
 * impressão, Se não for passada a porta de impressão para o 2º parâmetro, ele adotará a porta padrão (LPT1).<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Texto a ser Impresso ou Variável do tipo Letra (é necessário incluir ao fim do texto um caracter quebra <br/>
 * de linha. Para tal, o texto pode ser concatenado com o retorno da função "Quebra de linha").<br/>
 * 2. Porta a ser Usada.<br/>
 * <br/>
 * Retorno:<br/>
 * Retorna o texto impresso caso nada tenha dado de errado na impressão<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Tendo a necessidade de imprimir um texto.<br/>
 * 2. Selecione o texto ou uma Variável a ser impresso<br/>
 * 3. Selecione a porta da impressora
 */
var printServer = null;
function ebfTextPrinter(text, port) {
  var id = 'PrintServer';
  if(printServer) {
    printServer.document.WEBRUNTextPrinter.print(text, port);
    return;
  }
  var iframe;
  if (IE) {
    iframe = document.createElement("<iframe name='" + id + "' id='" + id + "'>");
  } else {
    iframe = document.createElement("iframe");
    iframe.name = id;
    iframe.id = id;
  }
  iframe.frameBorder = 0;
  iframe.setAttribute("frameborder", "no");
  iframe.setAttribute("border", 0);
  iframe.setAttribute("marginwidth", 0);
  iframe.setAttribute("marginheight", 0);
  iframe.width = 0;
  iframe.height = 0;
  iframe.src = "apps/HTMLTextPrinterApplet.html?text=" + escape(text) + '&port=' + escape(port);
  document.body.appendChild(iframe);
  printServer = eval(id);
}

/**
 * Lança uma exceção.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Mensagem da exceção<br/>
 * 2. Causa da exceção (Opcional)<br/>
 * <br/>
 * Observações:<br/>
 * 1. Caso essa função seja usada dentro das funções "Monitorar Exceções" e "Capturar Exceções", então as <br/>
 * informações chegarão no fluxo definido em "Capturar Exceções".
 */
function ebfThrowException(message, cause) {
  var ex = new Object();
  ex.message = message;
  ex.cause = cause;
  throw ex;
}

/**
 * Recebe como parâmetro uma data/hora e a retorna com a data modificada para  01/01/1900<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Data/Hora<br/>
 * <br/>
 * Retorno:<br/>
 * Data/Hora<br/>
 * <br/>
 * Exemplos<br/>
 * 1. Obter hora("05/10/2007 11:20:30")<br/>
 *     Retorno: "01/01/1900 11:20:30"
 */
function ebfTimeOfDateTime(date) {
  if (date != null && date instanceof Date) {
    date.setYear(1900);
    date.setMonth(0);
    date.setDate(1);
  }
  return date;
}

/**
 * Esta função cria um novo objeto Temporizador, recebe como parâmetro o nome do temporizador, que será usado nas <br/>
 * funções de iniciar, pausar, parar e zerar. Recebe ainda, o Formulário e o componente do tipo caixa de texto no qual este <br/>
 * temporizador será constantemente atualizado.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome do Temporizador (Letras)<br/>
 * 2. Formulário onde está localizado um componente a ser utilizado pelo Timer.<br/>
 * 3. Componente. (Caixa de Texto, Label, etc..)<br/>
 * <br/>
 * Retorno:<br/>
 * Retorna a referência do timer. (Variante)<br/>
 * <br/>
 * Exemplo:<br/>
 * 1º Parâmetro : temporizador (letras)<br/>
 * 2º Parâmetro : Cadastro de Tempo<br/>
 * 3º Parâmetro : tempo.<br/>
 * Neste exemplo, o edit com nome tempo do Formulário Cadastro de Tempo irá constantemente ser atualizado com o valor <br/>
 * do temporizador criado.
 */
function ebfTimerCreate(name, form, com) {
  var code = getCodComponent();
  var timer = new HTMLTimer(ebfGetSystemID(), ebfGetFormID(), code, com, form, name);
  return timer;
}

/**
 * Pausa ou Continua a contagem no temporizador passado como parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome do Temporizador. (Timer)<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observação:<br/>
 * 1. Caso o timer ja esteja pausado e a função seja novamente chamada, o contador irá continuar de onde parou.
 */
function ebfTimerPause(id){
  var timer = getTimerById(id);
  if (timer) {
    timer.pause();
  }
}

/**
 * Reinicia a contagem no temporizador passado como parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome do Temporizador (Timer).<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function ebfTimerReset(id){
  var timer = getTimerById(id);
  if (timer) {
    timer.reset();
  }  
}

/**
 * Inicia a contagem no temporizador passado como parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome do Temporizador. (Timer)<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observação:<br/>
 * O Temporizador deve ter sido criado anteriormente.
 */
function ebfTimerStart(id){
  var timer = getTimerById(id);
  if (timer) {
    timer.start();
  }
}

/**
 * Para a contagem no temporizador passado como parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome do Temporizador (Timer).<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function ebfTimerStop(id){
  var timer = getTimerById(id);
  if (timer) {
    timer.stop();
  }
}

/**
 * Converte para o formato Texto removendo os caracteres especiais de JavaScript. <br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Texto JavaScript para ser convertido para o formato de texto normal.<br/>
 * <br/>
 * Retorno:<br/>
 * Texto passado por parâmetro convertido para o formato de texto normal.<br/>
 * <br/>
 * Exemplo: <br/>
 * Assumindo como parâmetro o conteúdo "<br/>
 * ", o retorno será "\r", pois "<br/>
 * " é um caractere especial JavaScript.
 */
function ebfToJSString(str) {
  var sb = ""; 
  if (str != null) {
    str = str.toString();
    for (var i = 0; i < str.length; i++) {
      c = str.charAt(i);
      if (c == '\\') {
        sb += "\\\\";
      } else if (c == '\'') {
        sb += "\\'";
      } else if (c == '"') {
        sb += "\\\"";
      } else if (c == '\n') {
        sb += "\\n";
      } else if (c == '\r') {
      } else {
        sb += c;
      }
    }
    return sb;
  } else {
    return "";
  }
}

/**
 * Transforma o texto passado como parâmetro para  minúsculo.<br/>
 * <br/>
 * Parâmetros:  <br/>
 * 1. Texto a ser transformado.<br/>
 * <br/>
 * Retorno: <br/>
 * Converte o texto passado no primeiro parâmetro para  letras minúsculas e retorna.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1-Assumindo o parâmetro como "MAKER FLOW" (Letras),  o retorno seria "maker flow".<br/>
 * 2-Assumindo o parâmetro como "Maker Flow" (Letras),  o retorno seria "maker flow".
 */
function ebfToLowerCase() {
  var value = "";
  if (existArgs(arguments)) {
    value = arguments[0].toLowerCase();
  }
  return value;
}

/**
 * Transforma o texto passado como parâmetro para maiúsculo.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Texto a ser transformado.<br/>
 * <br/>
 * Retorno: <br/>
 * Converte as o texto passado no primeiro parâmetro para  letras maiúsculas e retorna.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1-Assumindo o parâmetro como "maker flow" (Letras),  o retorno seria "MAKER FLOW".<br/>
 * 2-Assumindo o parâmetro como "Maker Flow" (Letras),  o retorno seria "MAKER FLOW".
 */
function ebfToUpperCase() {
  var value = "";
  if (existArgs(arguments)) {
    value = arguments[0].toUpperCase();
  }
  return value;
}

/**
 * Traduz um texto para um determinado idioma.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Texto a ser traduzido<br/>
 * 2. Lista de parâmetros do texto<br/>
 * <br/>
 * Retorno:<br/>
 * Retorna o texto traduzido para o idioma definido no parâmetro<br/>
 * <br/>
 * Observações:<br/>
 * 1. Quando utilizada na camada servidor, a função irá buscar o texto passado na tabela de traduções. Se for utilizada<br/>
 * na camada cliente, o texto já tem que estar determinado no fluxo para que ele possa buscar na tabela antes da chamada<br/>
 * da função.<br/>
 * 2. O segundo parâmetro é para definir nomes próprios que não possuem tradução.<br/>
 * <br/>
 * Exemplo:<br/>
 * Se definirmos o texto<br/>
 * P1. Meu nome é {0} e meu pai é {1}.<br/>
 * No Segundo parâmetro devemos criar uma lista com os valores correspondentes a posição no texto.<br/>
 * P2. Lista [Maria, João]<br/>
 * <br/>
 * Desta forma, a função irá retornar: <br/>
 * My name is Maria and my father is João.
 */
function ebfTranslate(text) {
  // Caso o texto não tenha sida definido, então retorna o próprio valor
  if ((text == null) || (typeof text == "undefined") || (text === "") || (this.translations.findKey(resources_locale) == -1)) {
    return text;
  }
	
  var value = text;
	
  // Traduz o texto
  var resourcesMap = this.translations.get(resources_locale);
  if (resourcesMap.findKey(text) != -1) {
    value = resourcesMap.get(text);
  }
	
  // Trata os parâmetros, caso haja
  if ((arguments.length > 1) && (arguments[1] != null) && (typeof arguments[1] != "undefined")) {
    if (arguments[1] instanceof Array) {
      // Obtém o Array
      var params = arguments[1];
			
      for (var i = 0; i < params.length; i++) {
        var param = params[i];
        if (param != null && typeof param != "undefined") {
          var regexp = new RegExp("\\{" + (i) + "\\}", "g");
          value = value.replace(regexp, param);
        }
      }
    } else {
      // Obtém os parâmetros definidos a partir do segundo parâmetro
      for (var i = 1; i < arguments.length; i++) {
        var param = arguments[i];
        if (param != null && typeof param != "undefined") {
          var regexp = new RegExp("\\{" + (i-1) + "\\}", "g");
          value = value.replace(regexp, param);
        }
      }
    }    
  }
  return value;
}

/**
 * Altera borda da árvore<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Árvore<br/>
 * 2. Tamanho da borda (pixel)<br/>
 * 3. Cor<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1.Assumindo os parâmetros como "Árvore" (Variante), "2" (Inteiro) e a Cor(Azul). Será criada uma borda em volta da árvore de 2 pixeis de largura e de cor Azul.
 */
function ebfTreeChangeBorder(tree,borderSize,color) {
  tree.otherDiv.style.border = borderSize + "px solid " + color;
}

/**
 * Função que retorna um elemento da árvore a partir do seu ID.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Árvore na qual o elemento se encontra<br/>
 * 2. ID do elemento desejado<br/>
 * <br/>
 * Retorno:<br/>
 * Retorna a referência do elemento. (Variante)
 */
function ebfTreeGetElementById(tree, id){
  if(!tree)
    throw "O objeto árvore não foi definido!";
  if(! (tree instanceof HTMLTreeview) )
    throw "O objeto passado não é do tipo Árvore!";
    
  if(!id)
    throw "O ID do elemento desejado não pode ser nulo!";
    
  return tree.getElement(id);  
}

/**
 * Obter Informações do Elemento<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Árvore.<br/>
 * 2. Elemento.<br/>
 * <br/>
 * Retorno:<br/>
 * Informação (Letras)<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo os parâmetros como "Árvore" (Variante), "Elemento" (Variante). Caso haja alguma informação sobre o elemento passado por parâmetro, ela será retornada para uma variável do tipo Letras.<br/>
 * OBS: Para o funcionamento correto da função, o arquivo imagem necessáriamente deve estar na pasta "Skins/Default/" do seu servidor.
 */
function ebfTreeGetElementDBInfo(tree,element){	
  return tree.getElementDBInfo(element);	
}

/**
 * Obtem o nome do Elemento passado como parâmetro.<br/>
 * <br/>
 * Parâmetros<br/>
 * 1. Árvore<br/>
 * 2. Elemento (Referência)<br/>
 * <br/>
 * Retorno<br/>
 * 1. Retorna o Nome do Elemento.
 */
function ebfTreeGetElementDesc(tree, element){

  if(!tree)
    throw "O objeto árvore não foi definido";
  if(! (tree instanceof HTMLTreeview) )
    throw "O objeto passado não é do tipo Árvore";
  if(!element)
    throw "O objeto passado não é um elemento de uma árvore";

  try {
    return element.caption;
   
    
  } catch(e){
    throw e;
  }
  
  return -1;
}

/**
 * Função que retorna a chave do elemento passado como parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Árvore na qual o elemento se encontra;<br/>
 * 2. Elemento desejado.<br/>
 * <br/>
 * Retorno:<br/>
 * Chave do elemento. (Variante)
 */
function ebfTreeGetElementKey(tree, element){

  if(!tree)
    throw "O objeto árvore não foi definido";
  if(! (tree instanceof HTMLTreeview) )
    throw "O objeto passado não é do tipo Árvore";
  if(!element)
    throw "O objeto passado não é um elemento de uma árvore";

  try {
    var key = tree.getElementDBInfo(element).chave;
    //var key = tree.getElementById(element);
    return key;
    
  } catch(e){
    throw e;
  }
  
  return -1;
}

/**
 * Remove o elemento passado por parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Árvore <br/>
 * 2. Elemento que será removido<br/>
 * <br/>
 * Exemplo:<br/>
 * Para remover o elemento que está na variável "Elemento" e pertence à árvore cuja referência está armazenada na<br/>
 * variável "Árvore", deverão ser passados os parâmetros "Árvore" e "Elemento".
 */
function ebfTreeRemoveElement(tree,element){	
  tree.removeElement(element);	
}

/**
 * Renderiza o elemento passado por parâmetro.<br/>
 * <br/>
 * Parâmetro:<br/>
 * 1. Elemento que será renderizado<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
function ebfTreeRenderElement(element){
  if (element instanceof Bs_TreeElement) {
    element.render(true, true);	
  }	
}

/**
 * Adiciona Informações ao Elemento.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Árvore.<br/>
 * 2. Elemento.<br/>
 * 3. Lista de Informações Adicionais<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo os parâmetros como uma "Árvore" (Variante),  o "Elemento" (Variante) e uma "Lista" com informações adicionais, esta será atribuída ao Elemento. Podendo ser obtida com a função Árvore - Obter Informações do Elemento.
 */
function ebfTreeSetElementDBInfo(tree,element,arrInfo){	
  tree.setElementDBInfo(element,arrInfo);	
}

/**
 * Altera o ícone da árvore.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Árvore.<br/>
 * 2. Elemento.<br/>
 * 3. Nome do arquivo imagem.<br/>
 * <br/>
 * Observação:<br/>
 * Para o funcionamento correto da função, o arquivo imagem necessariamente deve estar na pasta "Skins/Default/" do <br/>
 * seu servidor.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo os parâmetros como "Árvore" (Variante), "Elemento" (Variante) e "Skins/Default/novoicone.gif" (Letras). <br/>
 * Então o ícone do elemento da árvore (ambos passado por parâmetro) será alterado pela nova imagem <br/>
 * (Támbem passada por parâmetro).
 */
function ebfTreeSetIcon(tree,element,iconFile){	
  tree.setIcon(element,iconFile);	
}

/**
 * Filtra a árvore de acordo com a palavra-chave passada.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Árvore a ser filtrada<br/>
 * 2. Filtro (Letras)<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observações:<br/>
 * 1. Somente são considerados no filtro, os elementos Raízes.<br/>
 * 2. O filtro ocorre de acordo com a descrição dos elementos e não pelo campo-chave.
 */
function ebfTreeviewFilter(com, filter) {
  $c(com).filter(filter);
}

/**
 * Remove os espaços existentes antes e depois do texto passado por parâmetro e retorna.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Texto a ser utilizado.<br/>
 * <br/>
 * Retorno:  <br/>
 * Retorna o texto passado como parâmetro, porém sem espaços no início e no final (Letras).<br/>
 * <br/>
 * Exemplos:<br/>
 * 1.Assumindo como parâmetro "           Maker Flow          " (Letras), o retorno seria "Maker Flow".
 */
function ebfTrim() {
  var value = "";
  if (existArgs(arguments)) {
    value = trim(arguments[0]);
  }
  return value;
}

/**
 * Essa função realiza o upload de um arquivo. Poderá ser informado o nome da pasta que será armazenado o arquivo, <br/>
 * uma possível regra chamada e os parâmetros que essa regra poderá receber(caso exista).<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome da pasta (Caso nulo será armazenado em uma pasta chamada "Upload");<br/>
 * 2. Nome de uma regra (Caso nulo a função realizará apenas o upload do arquivo)<br/>
 * .<br/>
 * Parâmetros Seguintes: <br/>
 * Parâmetros passados para regra definida (2°Parametro). Para passar mais de um parâmetro basta clicar no botão <br/>
 * (com sinal de adição) que se encontra abaixo.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.<br/>
 * <br/>
 * Observações:<br/>
 * 1. A regra chamada pela função upload, caso seja definida na camada servidor, não pode chamar um subfluxo cliente.
 */
function ebfUploadFile(url, ruleName) {
  if (ruleName == null || typeof ruleName == "undefined") {
    ruleName = "";
  }
  if (url == null || typeof url == "undefined") {
    url = "";
  }
  var params = "";
  if (arguments.length > 2) {
    for (var i = 2; i < arguments.length; i++) {
      params += ("&P_" + (i-2) + "=" + URLEncode(arguments[i]));
    }
  }
  var pageURL = "ruleUploadFile.jsp?sys="+sysCode+"&formID="+idForm+"&ruleName="+URLEncode(ruleName)+"&url="+url+params;
  window.open(pageURL,"upload","width=240,height=50,top=20,left=50");
}

/**
 * Criar o nome de uma variável. Se o nome passado por parâmetro possuir acentos ou cedilhas, a função trata removendo<br/>
 * e retorna um nome de variável correto. Caso deseje-se utilizar um nome de fluxo, basta marcar o segundo parâmetro como<br/>
 * Verdadeiro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome da Variável.<br/>
 * 2. Valor lógico (Verdadeiro ou falso).<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna o nome da variável sem acentos nem cedilhas.<br/>
 * <br/>
 * Exemplos: <br/>
 * Assumindo como parâmetro "Ação" (Letras), se o segundo parâmetro for Falso, o resultado será "ACAO", se for verdadeiro<br/>
 * será "Acao".
 */
function ebfUtilReduceVariable(texto, className) {
  return reduceVariable(texto, !parseBoolean(className));
}

/**
 * Essa função faz uma validação numa string utilizando expressão regular.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Recebe o texto que será validado pela expressão regular.<br/>
 * 2. Recebe a expressão regular para validar o texto.<br/>
 * <br/>
 * Retorno:<br/>
 * Lógico<br/>
 * <br/>
 * Observações:<br/>
 * 1. Os retornos podem ser:<br/>
 *     True  - O texto informado é válido, segundo a expressão regular informada.<br/>
 *     False - O texto informado não é válido.
 */
function ebfValidateTextER (text, regEx) {
  
  if (regEx == null || typeof regEx == "undefined" || regEx == "") {
    return false;
  }
  
  var regExp = new RegExp(regEx);
  return regExp.test(text);
  
}

/**
 * Verifica o estado da grade passada por parâmetro, retornando 'I' caso esteja em modo de inserção, 'A' caso esteja em <br/>
 * modo de edição, ou 'N' se não for nenhum dos dois casos.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Nome da Grade<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna em que modo a grade está: 'I' se estiver em modo de inserção, 'A' se em modo de edição, 'N' se não for <br/>
 * nenhum dos dois casos anteriores.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1.Assumindo a grade passada por parâmetro está em modo de inserção. Ao chamar o fluxo o retorno será 'I'.
 */
function ebfWhatIsGridModeStatus(grid) {
  var grid = $c(grid);
  if (!grid) throw "Componente " + grid + " não encontrado";
  if (grid.editing) return 'A';
  else if (grid.inserting) return 'I';
  else return 'N';
}

/**
 * Obtém o atributo do Elemento XML informado <br/>
 * (Atributos são informações adicionais que são acrescentadas a uma tag(delimitadores)).<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Objeto XML.<br/>
 * 2. Nome do Atributo.<br/>
 * <br/>
 * Retorno: <br/>
 * A variável de Retorno deverá ser do tipo Variante<br/>
 * <br/>
 * Observações: <br/>
 * A linguagem XML é definida como o formato universal para dados estruturados na Web. Para saber mais sobre o assunto, <br/>
 * pesquise em um site de busca sobre (XML) ou (Extensible Markup Language).<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Se tivermos então um elemento XML .<br/>
 *     <?xml version="1.0"?><br/>
 *     <aviso date="25/10/2007"><br/>
 *            <para>Janice</para><br/>
 *            <de>Jefferson</de><br/>
 *            <cabecalho>Lembre-se</cabecalho><br/>
 *            <corpo>Lançamento do oficial do Maker</corpo><br/>
 *     </aviso> <br/>
 *     Então retorna:  3.0.
 */
function ebfXMLGetAttribute(node, attribute) {
  return node.getAttribute(attribute);
}

/**
 * Retorna o primeiro sub-elemento do elemento passado como parâmetro<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Objeto XML<br/>
 * 2. Nome do Elemento<br/>
 * <br/>
 * Retorno:<br/>
 * A variável de Retorno deverá ser do tipo variante.Retorna o primeiro sub-elemento<br/>
 * <br/>
 * Observações: <br/>
 * 1. A linguagem XML é definida como o formato universal para dados estruturados na Web. Para saber mais sobre o<br/>
 * assunto, pesquise em um site de busca sobre (XML) ou (Extensible Markup Language).<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Tendo uma XML onde o elemento é <br/>
 *     <TEXTO>	<br/>
 * 	   <SQL>Sequel</SQL>	   <br/>
 *                         <MAKER>Flow</MAKER>	<br/>
 *     </TEXTO> <br/>
 *     Então o retorno seria "<SQL>"
 */
function ebfXMLGetChildElement(node, childName) {
  var c = node.getElementsByTagName(childName);
  if (c.length > 0) 
   return c[0];
}

/**
 * Obtém todos os filhos de um determinado Elemento XML informado.<br/>
 * (Os Filhos do Elemento no caso seria então os Sub-Elementos do Elemento.).<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. objeto XML. (Raiz, Nó, etc...)<br/>
 * 2. Nome do Elemento.<br/>
 * <br/>
 * Retorno: <br/>
 * A variável de Retorno deverá ser do tipo Variante.<br/>
 * <br/>
 * Observações: <br/>
 * 1. A linguagem XML é definida como o formato universal para dados estruturados na Web. Para saber mais sobre o assunto, <br/>
 *    pesquise em um site de busca sobre (XML) ou (Extensible Markup Language).<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Tendo uma XML onde o elemento é <br/>
 *     <TEXTO>	<br/>
 *       <SQL>Sequel</SQL>	   <br/>
 *       <MAKER>Flow</MAKER>	 <br/>
 *     </TEXTO><br/>
 *     Então o retorno seria o que estive-se dentro do nó <TEXTO>, no caso,  <SQL> e <MAKER>.
 */
function ebfXMLGetChildrenElement(node, childName) {
  if (childName) {
    return node.getElementsByTagName(childName);
  }
  else {
    return node.childNodes;  
  }
}

/**
 * Obtém o nome de um elemento XML.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Objeto XML.<br/>
 * <br/>
 * Retorno:<br/>
 * Letras<br/>
 * <br/>
 * Exemplos:<br/>
 * 1. Se temos então <br/>
 *          <TEXTO><br/>
 *                Maker Flow  Versão = 3.0 <br/>
 *          </TEXTO><br/>
 *     O retorno será: TEXTO
 */
function ebfXMLGetElementTagName(node) {
  return node.tagName;
}

/**
 * Obtém todo o conteúdo e  todos os sub-elementos que estão dentro do Elemento.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Objeto XML (nó do elemento)<br/>
 * <br/>
 * Exemplos:<br/>
 * 1. Se temos  então <br/>
 *     <TEXTO><br/>
 *             Maker Flow	<br/>
 *             <SQL>Sequel</SQL>	    <br/>
 *             <MAKER>Flow</MAKER>	<br/>
 *     </TEXTO><br/>
 *     Então o retorno seria: Maker Flow , <SQL>Sequel</SQL> e <MAKER>Flow</MAKER>
 */
function ebfXMLGetElementValue(node) {
  if (node.firstChild)
    return node.firstChild.nodeValue;
  else
    return null;
}

/**
 * Obtém o Elemento acima do Sub-Elemento<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Objeto XML.<br/>
 * <br/>
 * Exemplos:<br/>
 * 1. Tendo uma XML onde o Sub-Elemento é  <MAKER>Flow</MAKER> e acima dele tem um Elemento pai<br/>
 *     <TEXTO>		   <br/>
 * 	   <MAKER>Flow</MAKER>	<br/>
 *     </TEXTO><br/>
 *     Então o seu Elemento pai é "<TEXTO>"
 */
function ebfXMLGetParentElement(node) {
  return node.parentNode
}

/**
 * Obtém um elemento raiz de um XML.<br/>
 * (O Elemento raiz seria o elemento pai de um arquivo XML)<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Objeto XML<br/>
 * <br/>
 * Retorno:<br/>
 * A variável de Retorno deverá ser do tipo Variante<br/>
 * <br/>
 * Observações:: <br/>
 * 1. A linguagem XML é definida como o formato universal para dados estruturados na Web. Para saber mais sobre o assunto, pesquise em um site de busca sobre (XML) ou (Extensible Markup Language).<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Se tivermos então um elemento XML .<br/>
 *       <?xml version="1.0" encoding="ISO-8859-1"?><br/>
 *       <software><br/>
 *         <titulo>Maker</titulo><br/>
 *         <direitos>SOFTWELL</direitos><br/>
 *         <ano>2007</ano><br/>
 *       </software ><br/>
 *     Então retorna: < software >.
 */
function ebfXMLGetRoot(doc) {
  if (doc) return doc.documentElement;
}

/**
 * Essa função cria um objeto XML passando como parâmetro o texto no formato em XML. E atribui o objeto criado a uma<br/>
 * variável do tipo Letras.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. O texto em XML<br/>
 * <br/>
 * Retorno: <br/>
 * Cria o objeto XML. O retorno deve ser armazenado numa variável do tipo Letras.<br/>
 * <br/>
 * Observações: <br/>
 * 1. A linguagem XML é definida como o formato universal para dados estruturados na Web. Para saber mais sobre o<br/>
 * assunto, pesquise em um site de busca sobre (XML) ou (Extensible Markup Language).<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo o 1º parâmetro sendo: <br/>
 *         <?xml version="1.0" encoding="ISO-8859-1"?><br/>
 *           <CURSO><br/>
 *                <DISCIPLINA><br/>
 *                    <OBJETIVO><br/>
 *                         Ensinar XML<br/>
 *                    </OBJETIVO><br/>
 *                    <METODOLOGIA><br/>
 *                          Laboratório<br/>
 *                    </METODOLOGIA><br/>
 *                    <AVALIACAO><br/>
 *                          3 provas<br/>
 *                    </AVALIACAO><br/>
 *                </DISCIPLINA><br/>
 *           </CURSO><br/>
 *   O retorno será a criação do objeto XML.
 */
function ebfXMLOpen(XMLText) {
  var doc = null;
  if (document.implementation && document.implementation.createDocument) {//Mozzila
   var domParser = new DOMParser();
   doc = domParser.parseFromString(XMLText, 'application/xml');
   fixXMLDocument(doc);
   return doc;
  }
  else {//IE
    doc = new ActiveXObject("MSXML2.DOMDocument");
    doc.loadXML(XMLText);
  }
  return doc;
};

/**
 * Verifica se o formulário passado como parâmetro está aberto.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Formulário<br/>
 * <br/>
 * Retorno:<br/>
 * Retorna verdadeiro se o formulário estiver aberto.
 */
function searchFormByGUIDFormIsOpened(currentForm,GUID){
  if (currentForm && currentForm.formGUID == GUID){
    return currentForm;
  }

  if (currentForm && currentForm.mainform && currentForm.mainform.formGUID == GUID){
    return currentForm.mainform;
  }
  if (currentForm.children){
    for (var i=0;i<currentForm.children.length;i++){
      try {
        if (currentForm.children[i].mainform){
          if (currentForm.children[i].mainform.formGUID == GUID){
            return currentForm.children[i].mainform;
          }
          var returnForm = searchFormByGUIDFormIsOpened(currentForm.children[i],GUID);
          if (returnForm){
            return returnForm;
          }
        }
      }catch(e){}
    }
  }
}

function formIsOpenned(form){
  if (isNull(form)) {
    return false;
  }
  var mainWindow = $mainform();
  
  while(getOpenerWindow(mainWindow) != null){
    mainWindow = getOpenerWindow(mainWindow);
    
  }//encontra a janela principal do Sistema
  
  //procura o formulário usando o GUID passado
  var myForm = searchFormByGUIDFormIsOpened(mainWindow,form);

  //verifica se o formulário foi encontrado
  if(myForm){
    return true;
  }else{
    return false;
  }
}

/**
 * Esta função retorna uma lista com o nome de todos os componentes presentes na tela onde esta função foi chamada.<br/>
 * <br/>
 * Parâmetros:<br/>
 * Não Possui.<br/>
 * <br/>
 * Retorno:<br/>
 * Lista com Nome dos Componentes (Variante)
 */
function getAllComponentNames() {

  var all = controller.getAllElements();
  var elems = new Array();
  for (var i in all) {
    if (typeof(all[i]) == 'function' || all[i].code == -1 || all[i].code == 0 || all[i].code == undefined) continue;
      elems.push(all[i].id);
  }
  return elems;

}

/**
 * Essa função verifica se o 1º parâmetro é diferente do 2º parâmetro. Caso seja, retorna verdadeiro, caso contrário, falso.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Primeiro valor<br/>
 * 2. Segundo valor<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna verdadeiro se o 1º parâmetro for diferente do 2º parâmetro, caso contrário retorna falso.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo os parâmetros como 10 (inteiro) e 2 (Inteiro), o retorno seria verdadeiro.<br/>
 * 2. Assumindo os parâmetros como A (letra) e A (letra), o retorno falso.<br/>
 * <br/>
 * Observações: <br/>
 * Essa função diferencia letras maiúsculas e minúsculas.<br/>
 * Observação:<br/>
 * Devido a tipagem dinâmica das variáveis na camada cliente. Para que a função considere que os parâmetros são<br/>
 *  numéricos, será necessário converter os valores para número (inteiro ou fracionario) ao passar os parâmetros para a<br/>
 *  função (mesmo se as variáveis utilizadas já forem numéricas).
 */
function isDiferent() {
  var value = false;
  if (existArgs(arguments)) {
    var param1 = arguments[0];
    var param2 = arguments[1];
    if (param1 instanceof Date) {
      var data1 = param1;
      var data2 = toDate(param2);
      if (data1 != null && data2 != null) {
        value = (data1.compareTo(data2) != 0);
      }
    } else if (param1 instanceof Time) {
      var hora1 = param1;
      var hora2 = parseTime(param2);
      if (hora1 != null && hora2 != null) {
        value = (hora1.compareTo(hora2) != 0);
      }
    } else {
      value = (param1 != param2);
    }
  }
  return value;
}

/**
 * Essa função verifica se os valores passados por parâmetro são iguais, ou seja, possuem o mesmo valor.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Valor a ser verificado<br/>
 * 2. Valor a ser verificado<br/>
 * <br/>
 * Retorno: <br/>
 * O Retorno será verdadeiro se o valor do 1º parâmetro for igual ao valor do 2º parâmetro, caso contrário o retorno será falso.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo o valor do 1º parâmetro sendo "ab" e o 2º parâmetro sendo "AB" o valor de retorno será falso, pois a função diferencia letras maiúsculas e minúsculas.<br/>
 * 2. Assumindo o valor do 1º parâmetro sendo "80" e o 2º parâmetro sendo "80" o valor de retorno será verdadeiro, pois 80 é igual a 80.<br/>
 * <br/>
 * Observações: <br/>
 * Essa função diferencia letras maiúsculas e minúsculas.<br/>
 * Devido a tipagem dinâmica das variáveis na camada cliente. Para que a função considere que os parâmetros são<br/>
 *  numéricos, será necessário converter os valores para número (inteiro ou fracionario) ao passar os parâmetros para a<br/>
 *  função (mesmo se as variáveis utilizadas já forem numéricas).
 */
function isEqual() {
  var value = false;
  if (existArgs(arguments)) {
    var param1 = arguments[0];
    var param2 = arguments[1];
    if (param1 instanceof Date) {
      var data1 = param1;
      var data2 = toDate(param2);
      if (data1 != null && data2 != null) {
        value = (data1.compareTo(data2) == 0);
      }
    } else if (param1 instanceof Time) {
      var hora1 = param1;
      var hora2 = parseTime(param2);
      if (hora1 != null && hora2 != null) {
        value = (hora1.compareTo(hora2) == 0);
      }
    } else {
      value = (param1 == param2);
    }
  }
  return value;
}

/**
 * Essa função verifica se o valor do 1º parâmetro é maior que o do 2º parâmetro. A depender do resultado retorna verdadeiro ou falso.<br/>
 * Se os valores dos parâmetros forem iguais o retorno será falso, pois o mesmo valor não é maior que ele mesmo.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Valor a ser verificado<br/>
 * 2. Valor a ser verificado<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna verdadeiro se o valor do 1º parâmetro for maior que o valor do 2º parâmetro, caso contrário o retorno será falso.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo o valor do 1º parâmetro sendo 20 e o 2º parâmetro sendo 30 o valor de retorno será falso, pois 20 não é maior que 30.<br/>
 * 2. Assumindo o valor do 1º parâmetro sendo 80 e o 2º parâmetro sendo 80 o valor de retorno será falso, pois 80 não é maior que 80.<br/>
 * <br/>
 * Observação:<br/>
 * Devido a tipagem dinâmica das variáveis na camada cliente. Para que a função considere que os parâmetros são<br/>
 *  numéricos, será necessário converter os valores para número (inteiro ou fracionario) ao passar os parâmetros para a<br/>
 *  função (mesmo se as variáveis utilizadas já forem numéricas).
 */
function isGreater(value1, value2) {
  var value = false;
  if (value1 != null && typeof value1 != "undefined" && value2 != null && typeof value2 != "undefined") {
    var param1 = value1;
    var param2 = value2;
    if (param1 instanceof Date) {
      var data1 = param1;
      var data2 = toDate(param2);
      if (data1 != null && data2 != null) {
        value = (data1.compareTo(data2) == 1);
      }
    } else if (param1 instanceof Time) {
      var hora1 = param1;
      var hora2 = parseTime(param2);
      if (hora1 != null && hora2 != null) {
        value = (hora1.compareTo(hora2) == 1);
      }
    } else {
      value = param1 > param2;
    }
  }
  return value;
}

/**
 * Essa função verifica se o valor do 1º parâmetro é maior ou igual a do 2º parâmetro. A depender do resultado retorna verdadeiro ou falso.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Valor a ser verificado<br/>
 * 2. Valor a ser verificado<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna verdadeiro se o valor do 1º parâmetro for maior ou igual que o valor do 2º parâmetro, caso contrário o retorno será falso.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo o valor do 1º parâmetro sendo 36 e o 2º parâmetro sendo 52 o valor de retorno será falso, pois 36 não é maior nem igual a 52.<br/>
 * 2. Assumindo o valor do 1º parâmetro sendo 55 e o 2º parâmetro sendo 55 o valor de retorno será verdadeiro, pois a condição é maior ou igual e 55 é igual a 55.<br/>
 * <br/>
 * Observação:<br/>
 * Devido a tipagem dinâmica das variáveis na camada cliente. Para que a função considere que os parâmetros são<br/>
 *  numéricos, será necessário converter os valores para número (inteiro ou fracionario) ao passar os parâmetros para a<br/>
 *  função (mesmo se as variáveis utilizadas já forem numéricas).
 */
function isGreaterOrEqual(value1, value2) {
  var value = false;
  if (value1 != null && typeof value1 != "undefined" && value2 != null && typeof value2 != "undefined") {
    var param1 = value1;
    var param2 = value2;
    if (param1 instanceof Date) {
      var data1 = param1;
      var data2 = toDate(param2);
      if (data1 != null && data2 != null) {
        value = (data1.compareTo(data2) == 0 || data1.compareTo(data2) == 1);
      }
    } else if (param1 instanceof Time) {
      var hora1 = param1;
      var hora2 = parseTime(param2);
      if (hora1 != null && hora2 != null) {
        value = (hora1.compareTo(hora2) == 0 || hora1.compareTo(hora2) == 1);
      }
    } else {
      value = param1 >= param2;
    }
  }
  return value;
}

/**
 * Essa função verifica se o valor do 1º parâmetro é menor que o valor do 2º parâmetro. A depender do resultado retorna verdadeiro ou falso.<br/>
 * Se os valores dos parâmetros forem iguais o retorno será falso, pois o mesmo valor não é menor que ele mesmo.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Valor a ser verificado<br/>
 * 2.  Valor a ser verificado<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna verdadeiro se o valor do 1º parâmetro for menor que o valor do 2º parâmetro, caso contrário o retorno será falso.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo o valor do 1º parâmetro sendo 26 e o 2º parâmetro sendo 12 o valor de retorno será falso, pois 26 não é menor que 12.<br/>
 * 2. Assumindo o valor do 1º parâmetro sendo 5 e o 2º parâmetro sendo 87 o valor de retorno será verdadeiro, pois 5 é menor que 87.<br/>
 * <br/>
 * Observação:<br/>
 * Devido a tipagem dinâmica das variáveis na camada cliente. Para que a função considere que os parâmetros são<br/>
 *  numéricos, será necessário converter os valores para número (inteiro ou fracionario) ao passar os parâmetros para a<br/>
 *  função (mesmo se as variáveis utilizadas já forem numéricas).
 */
function isMinor(value1, value2) {
  var value = false;
  if (value1 != null && typeof value1 != "undefined" && value2 != null && typeof value2 != "undefined") {
    var param1 = value1;
    var param2 = value2;
    if (param1 instanceof Date) {
      var data1 = param1;
      var data2 = toDate(param2);
      if (data1 != null && data2 != null) {
        value = (data1.compareTo(data2) == -1);
      }
    } else if (param1 instanceof Time) {
      var hora1 = param1;
      var hora2 = parseTime(param2);
      if (hora1 != null && hora2 != null) {
        value = (hora1.compareTo(hora2) == -1);
      }
    } else {
      value = param1 < param2;
    }
  }
  return value;
}

/**
 * Essa função verifica se o valor do 1º parâmetro é menor ou igual ao valor do 2º parâmetro. A depender do resultado retorna verdadeiro ou falso.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Valor a ser verificado<br/>
 * 2. Valor a ser verificado<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna verdadeiro se o valor do 1º parâmetro for menor ou igual ao valor do 2º parâmetro, caso contrário o retorno será falso.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo o valor do 1º parâmetro sendo 65 e o 2º parâmetro sendo 15 o valor de retorno será falso, pois 65 não é menor nem igual que 15.<br/>
 * 2. Assumindo o valor do 1º parâmetro sendo 505 e o 2º parâmetro sendo 632 o valor de retorno será verdadeiro, pois 505 é menor que 632.<br/>
 * 3. Assumindo o valor do 1º parâmetro sendo 39 e o 2º parâmetro sendo 39 o valor de retorno será verdadeiro, pois a condição é maior ou igual e 39 é igual a 39.<br/>
 * <br/>
 * Observação:<br/>
 * Devido a tipagem dinâmica das variáveis na camada cliente. Para que a função considere que os parâmetros são<br/>
 *  numéricos, será necessário converter os valores para número (inteiro ou fracionario) ao passar os parâmetros para a<br/>
 *  função (mesmo se as variáveis utilizadas já forem numéricas).
 */
function isMinorOrEqual(value1, value2) {
  var value = false;
  if (value1 != null && typeof value1 != "undefined" && value2 != null && typeof value2 != "undefined") {
    var param1 = value1;
    var param2 = value2;
    if (param1 instanceof Date) {
      var data1 = param1;
      var data2 = toDate(param2);
      if (data1 != null && data2 != null) {
        value = (data1.compareTo(data2) == 0 || data1.compareTo(data2) == -1);
      }
    } else if (param1 instanceof Time) {
      var hora1 = param1;
      var hora2 = parseTime(param2);
      if (hora1 != null && hora2 != null) {
        value = (hora1.compareTo(hora2) == 0 || hora1.compareTo(hora2) == -1);
      }
    } else {
      value = param1 <= param2;
    }
  }
  return value;
}

/**
 * Essa função verifica se o parâmetro é nulo. A depender do resultado, retorna verdadeiro ou falso.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1.Recebe um valor ou uma função para ser avaliada.<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna verdadeiro se o valor for nulo, caso contrário o retorno será falso.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo que tenhamos feito uma consulta no banco de dados (ex: FPG_ACUMULO) e a partir da consulta obtemos o valor do campo (FOL_COD). Atribuindo essas duas funções a função É Nulo, caso a consulta não retorne valor de FOL_COD o retorno será verdadeiro, pois o campo está com o valor nulo.<br/>
 * 2. Assumindo que tenhamos obtido o valor de um componente do formulário, se não tiver valor no componente o retorno será verdadeiro, caso o componente tenha algum valor atribuído a ele o retorno será falso.
 */
function isNull() {
  if (existArgs(arguments)) {
    return (arguments[0] == null || typeof arguments[0] == 'undefined' || arguments[0] == '' || arguments[0].toString() == 'NaN');
  }
  return true;
}

/**
 * Essa função verifica se o parâmetro é nulo ou vazio. A depender do resultado, retorna verdadeiro ou falso.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1.Recebe um valor ou uma função para ser avaliada.<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna verdadeiro se o valor for nulo ou vazio, caso contrário o retorno será falso.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo que tenhamos feito uma consulta no banco de dados (ex: FPG_ACUMULO) e a partir da consulta obtemos o valor do campo (FOL_COD). Atribuindo essas duas funções a função É Nulo, caso a consulta não retorne valor de FOL_COD o retorno será verdadeiro, pois o campo está com o valor nulo.<br/>
 * 2. Assumindo que tenhamos obtido o valor de um componente do formulário, se não tiver valor no componente o retorno será verdadeiro, caso o componente tenha algum valor atribuído a ele o retorno será falso.<br/>
 * 3. Verificando se um campo no formulário está em branco, a função rettornará verdadeiro caso o campo esteja vazio caso contrário retornará falso.
 */
function isNullOrEmpty(variavel) {
  return (variavel == null || typeof variavel == 'undefined' || trim(variavel) == '' || variavel.toString() == 'NaN');
}

/**
 * Essa função busca a posição do elemento que foi informado na lista. Se encontrar retorna a posição. <br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Lista onde será procurado o elemento<br/>
 * 2. Elemento que será procurado<br/>
 * <br/>
 * Retorno:<br/>
 * A posição do elemento na lista. O retorno dessa função pode ser armazenado numa variável do tipo inteiro.<br/>
 * <br/>
 * Exemplos:<br/>
 * 1. Assumindo que o 1º parâmetro seja uma lista com os seguintes valores: {a,b,c,d,e,f,g,h} e o 2º parâmetro seja o valor <br/>
 * "d". O retorno será o valor 4, pois "d" está na posição 4 da lista.
 */
function listContainsObject(list, obj) {
  position = 0;
  if(list) {
    for (i = 0; i < list.length; i++) {
      if(list[i] == obj) {
        position = i + 1;
      }  
    }  
  }
  return position;
}

/**
 * Retorna a soma dos números dos parâmetros passados.<br/>
 * <br/>
 * Parâmetros: <br/>
 * n. Informar o valor para ser somado.<br/>
 * <br/>
 * Retorno:<br/>
 * Resultado da Soma dos parâmetros passados.<br/>
 * <br/>
 * Exemplo:<br/>
 * 1. Assumindo os parâmetros como: 2 (Inteiro) e 2 (Inteiro), o retorno seria: 4 (Inteiro).<br/>
 * <br/>
 * Observações:<br/>
 * 1. Para garantir a integridade das operações matemáticas, utilize conversão para o tipo de dado nos parâmetros.
 */
function oprAdd() {
  var value = 0;
  if (existArgs(arguments)) {
    value = arguments[0];
    if (value instanceof Date) {
      for (var i = 1; i < arguments.length; i++) {
        var temp = toDate(arguments[i]);
        value.incDay(temp.getDate());
      }
    } else if (value instanceof Time) {
      for (var i = 1; i < arguments.length; i++) {
        var temp = parseTime(arguments[i]);
        value.incHour(temp.getHour());
      }
    } else {
      value = parseNumeric(value);
      for (var i = 1; i < arguments.length; i++) {
        var temp = parseNumeric(arguments[i]);
        value += temp;
      }
    }
  }
  return value;
}

/**
 * Essa função verifica se algum valor passado é falso, para retorna falso ou se são verdadeiros para retornar verdadeiro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * n. Valores ou funções que retornem valores lógicos.<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna verdadeiro se todos os valores forem verdadeiros, caso um valor seja falso o retorno será falso.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo que tenhamos dois parâmetros: o 1º recebe a função maior contendo os parâmetros: 3 e 5 (3>5) e o 2º recebe<br/>
 * a função menor contendo os parâmetros: 7 e 10 (7<10), o retorno será falso,pois 3 é menor que 5.<br/>
 * 2. Assumindo que tenhamos dois parâmetros: o 1º recebe a função igual contendo os parâmetros: A e A (A=A) e o 2º recebe <br/>
 * a função diferente contendo os parâmetros: 56 e 65 (56<>65), o retorno será verdadeiro, pois as duas condições são <br/>
 * verdadeiras.
 */
function oprAnd() {
  var value = true;
  if (existArgs(arguments)) {
    for (var i = 0; i < arguments.length; i++) {
      var temp = arguments[i];
      value = value && temp;
    }
  }
  return value;
}

/**
 * Calcula a média aritmética dos valores passados como parâmetro.<br/>
 * <br/>
 * Parâmetros: <br/>
 * n. Valor a ser somado.<br/>
 * <br/>
 * Retorno:<br/>
 * Retorna a divisão da soma dos números passados por parâmetro pela quantidade de parâmetros.<br/>
 * <br/>
 * Exemplo:<br/>
 * 1. Informando os parâmetros como: 10 (Inteiro) e 2 (Inteiro), o resultado é 6,0 (Fracionado).<br/>
 * 2. Informando os parâmteros como: 7 (Inteiro), 7 (Inteiro) e 7 (Inteiro) o resultado é 7,0 (Fracionado).<br/>
 * <br/>
 * Observações:<br/>
 * 1. Para garantir a integridade das operações matemáticas, utilize conversão para o tipo de dado nos parâmetros.
 */
function oprAverage() {
  var average = 0.0;
  if (existArgs(arguments)) {
    var divisor = 0.0;
    var dividendo = arguments.length;
    for (var i = 0; i < arguments.length; i++) {
      var temp = arguments[i];
      if (temp) {
        divisor += parseNumeric(temp);
      }
    }
    average = divisor / dividendo;
  }
  return average;
}

/**
 * Essa função verifica se o valor passado no 1º parâmetro está contido no intervalo que é delimitado pelo 2º e 3º parâmetros. A depender do resultado, retorna verdadeiro ou falso.<br/>
 * <br/>
 * Parâmetro:<br/>
 * 1. Valor a ser verificado<br/>
 * 2. Menor valor do intervalo<br/>
 * 3. Maior valor do intervalo<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna verdadeiro se o valor verificado estiver no intervalo, caso contrário o retorno será falso.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo que o valor do 1º parâmetro seja 50, o do 2º parâmetro 10 e o valor do 3º parâmetro 100 o retorno será verdadeiro, pois 50 está entre 10 e 100.<br/>
 * 2. Assumindo que o valor do 1º parâmetro seja 5, o do 2º parâmetro 35 e o valor do 3º parâmetro 70 o retorno será falso, pois 5 não esta entre 35 e 70.
 */
function oprBetween() {
  var between = false;
  if (existArgs(arguments)) {
    var value = arguments[0];
    var v1 = arguments[1];
    var v2 = arguments[2];
    if (value && v1 && v2) {
      if ((value instanceof Date) && (v1 instanceof Date) && (v2 instanceof Date)) {
        between = value.compareTo(v1) >= 0 && value.compareTo(v2) <= 0;
      } else if ((value instanceof Time) && (v1 instanceof Time) && (v2 instanceof Time)) {
        between = value.compareTo(v1) >= 0 && value.compareTo(v2) <= 0;
      } else if ((typeof value == "number") && (typeof v1 == "number") && (typeof v2 == "number")) {
        between = value >= v1 && value <= v2;
      } else {
        between = value.toString() >= v1.toString() && value.toString() <= v2.toString();
      }
    }
  }
  return between;
}

/**
 * Essa função é utilizada para realizar a divisão.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Valor do dividendo.<br/>
 * 2. Valor do divisor.<br/>
 * <br/>
 * Retorno:<br/>
 * Resultado da divisão dos números passados por parâmetros.<br/>
 * <br/>
 * Exemplo: <br/>
 * 1. Assumindo o Parâmetro 1 como: 10 (Inteiro) e o Parâmetro 2 como 5 (Inteiro), o retorno seria : 2,0.<br/>
 * 2. Assumindo o Parâmetro 1 como: 10,5 e o Parâmetro 2 como 2,5 o retorno seria: 4,2.<br/>
 * <br/>
 * Observações:<br/>
 * 1. Para garantir a integridade das operações matemáticas, utilize conversão para o tipo de dado nos parâmetros.
 */
function oprDivide() {
  var value = 0;
  if (existArgs(arguments)) {
    value = parseNumeric(arguments[0]);
    for (var i = 1; i < arguments.length; i++) {
      var temp = arguments[i];
      value /= parseNumeric(temp);
    }
  }
  return value;
}

/**
 * Essa função retorna o valor lógico falso.<br/>
 * <br/>
 * Retorno: <br/>
 * Valor lógico falso.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Utilizando a função igual contendo no 1º parâmetro a constante lógica false e o 2º parâmetro a função Falso o retorno será <br/>
 * verdadeiro, pois falso é igual a falso.<br/>
 * 2. Utilizando a função Diferente  contendo no 1º parâmetro a constante lógica true e o 2º parâmetro a função Falso o retorno<br/>
 * será verdadeiro, pois falso é diferente de verdadeiro.
 */
function oprFalse() {
  return false;
}

/**
 * Essa função verifica o valor lógico do 1º parâmetro, se o mesmo for verdadeiro o retorno será o valor que estiver no 2º <br/>
 * parâmetro, caso contrário o valor do 3º parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Função que tenha um retorno lógico<br/>
 * 2. Valor a ser retornado caso o primeiro parâmetro seja verdadeiro<br/>
 * 3. Valor a ser retornado caso o primeiro parâmetro seja falso<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna o valor do 2º parâmetro ou do 3º parâmetro a depender do retorno lógico do 1º parâmetro.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo que o valor do 1º parâmetro seja a função igual contendo os valores 7 e 7 (7=7), o 2º parâmetro o valor 7 e o 3º<br/>
 * parâmetro o valor 5, o retorno será 7, pois a condição do 1º parâmetro é verdadeira.<br/>
 * 2. Assumindo que o valor do 1º parâmetro seja a função diferente contendo os valores 19 e 19 (19<>19), o 2º parâmetro o <br/>
 * valor 35 e o 3º parâmetro a função soma contendo 5 e 15 (5+15) , o retorno será o resultado da soma no caso 20, pois a <br/>
 * condição do 1º parâmetro é falsa.
 */
function oprIf() {
  var value = null;
  if (existArgs(arguments)) {
    value = arguments[0] ? arguments[1] : arguments[2];
  }
  return value;
}

/**
 * Essa função é utilizada para obter o maior dos valores passados por parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * n. Valor a ser comparado.<br/>
 * <br/>
 * Retorno:<br/>
 * Obtém o maior valor dentre os passados por parâmetro, pode ter (n) parâmetros a serem avaliados.<br/>
 * <br/>
 * Exemplo:<br/>
 * 1. Assumindo os parâmetros como: 100 (Inteiro), 66 (Inteiro) e 99 (Inteiro) o retorno seria: 100,0 (Fracionado).<br/>
 * <br/>
 * Observações:<br/>
 * 1. Para garantir a integridade das operações matemáticas, utilize conversão para o tipo de dado nos parâmetros.
 */
function oprMaximum() {
  var maximum = null;
  if (existArgs(arguments)) {
    maximum = parseNumeric(arguments[0]);
    for (var i = 0; i < arguments.length; i++) {
      var temp = parseNumeric(arguments[i]);
      if (temp > maximum) {
        maximum = temp;
      }
    }
  }
  return maximum;
}

/**
 * Essa função é utilizada para obter o menor dos valores passados por parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * n. Valor a ser comparado.<br/>
 * <br/>
 * Retorno:<br/>
 * Obtém o menor valor dentre os passados por parâmetro, pode ter (n) parâmetros a serem avaliados.<br/>
 * <br/>
 * Exemplo:<br/>
 * 1. Assumindo os parâmetros como: 100 (Inteiro), 66 (Inteiro) e 99 (Inteiro) o retorno seria: 66,0 (Fracionado).<br/>
 * <br/>
 * Observações:<br/>
 * 1. Para garantir a integridade das operações matemáticas, utilize conversão para o tipo de dado nos parâmetros.
 */
function oprMinimum() {
  var minimum = null;
  if (existArgs(arguments)) {
    minimum = parseNumeric(arguments[0]);
    for (var i = 0; i < arguments.length; i++) {
      var temp = parseNumeric(arguments[i]);      
      if (temp < minimum) {      	
        minimum = temp;
      }
    }
  }
  return minimum;
}

/**
 * Calcula o resto da divisão de dois números.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Divisor.<br/>
 * 2. Dividendo.<br/>
 * <br/>
 * Retorno:<br/>
 * Retorna o resto da divisão do número do Parâmetro 1 com o número do Parâmetro 2.<br/>
 * <br/>
 * Exemplo: <br/>
 * 1. Assumindo os parâmetros como: 5 (Inteiro) e 2 (inteiro), o retorno seria: 1(Inteiro).<br/>
 * <br/>
 * Observações:<br/>
 * 1. Para garantir a integridade das operações matemáticas, utilize conversão para o tipo de dado nos parâmetros.
 */
function oprMod() {
  var value = 0;
  if (existArgs(arguments)) {
    value = parseNumeric(arguments[0]);
    for (var i = 1; i < arguments.length; i++) {
      var temp = parseNumeric(arguments[i]);
      value %= temp;
    }
  }
  return value;
}

/**
 * Calcula o valor absoluto de um número, ou seja, retorna sempre o valor positivo.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Valor para retornar um valor absoluto.<br/>
 * <br/>
 * Retorno:<br/>
 * Módulo do número passado por parâmetro.<br/>
 * <br/>
 * Exemplo:<br/>
 * 1. Assumindo o Parâmetro 1 como -10 (Inteiro), o retorno seria 10 (Inteiro).<br/>
 * <br/>
 * Observações:<br/>
 * 1. Para garantir a integridade das operações matemáticas, utilize conversão para o tipo de dado nos parâmetros.
 */
function oprModulus() {
  var value = 0;
  if (existArgs(arguments)) {
    value = Math.abs(parseNumeric(arguments[0]));
  }
  return value;
}

/**
 * Retorna a multiplicação dos números passados por parâmetro.<br/>
 * <br/>
 * Parâmetros: <br/>
 * n.Valor a ser multiplicado.<br/>
 * <br/>
 * Retorno:<br/>
 * Resultado da multiplicação dos parâmetros passados.<br/>
 * <br/>
 * Exemplo: <br/>
 * 1. Assumindo os valores dos parâmetros 5 (Inteiro) e 4 (Inteiro), o retorno seria 20 (Inteiro).<br/>
 * <br/>
 * Observações:<br/>
 * 1. Para garantir a integridade das operações matemáticas, utilize conversão para o tipo de dado nos parâmetros.
 */
function oprMultiply() {
  var value = 1.0;
  if (existArgs(arguments)) {
    for (var i = 0; i < arguments.length; i++) {
      var temp = arguments[i];
      value *= parseNumeric(temp);
    }
  }
  return value;
}

/**
 * Essa função inverte o valor lógico. Se o valor do parâmetro for verdadeiro o retorno dele terá o valor lógico falso. Caso <br/>
 * contrário será verdadeiro.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1.Valor Lógico<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna o valor lógico invertido. <br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo que o 1º parâmetro é uma variável do tipo lógica de valor verdadeiro, o retorno será falso. <br/>
 * 2. Assumindo que o 1º parâmetro é a função igual contendo os valores 5 e 5 (5=5) o retorno será falso, pois (5=5 é verdadeiro)<br/>
 * a negação dessa operação é falso.
 */
function oprNot() {
  var value = null;
  if (existArgs(arguments)) {
    var temp = arguments[0];
    if (temp != null) {
      if (typeof temp == "number") {
        value = -temp;
      } else if (typeof temp == "boolean") {
        value = !temp;
      } else {
        interactionError("Tipo de parâmetro desconhecido para a operação NOT.");
        value = temp;
      }
    }
  }
  return value;
}

/**
 * Essa função verifica se algum valor passado por parâmetro é verdadeiro, para retornar verdadeiro ou se todos os parâmetros são valores falsos, para retornar falso.<br/>
 * <br/>
 * Parâmetros:<br/>
 * n. Recebe valores ou funções que retornem valores lógicos.<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna verdadeiro se apenas um parâmetro for verdadeiro e retorna falso se todos os parâmetros forem falsos.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo que tenhamos dois parâmetros: o 1º recebe a função maior contendo os parâmetros: 3 e 5 (3>5) e o 2º recebe a função menor contendo os parâmetros: 7 e 10 (7<10), o retorno será verdadeiro,pois um parâmetro é verdadeiro.<br/>
 * 2. Assumindo que tenhamos dois parâmetros: o 1º recebe a função igual contendo os parâmetros: A e F (A=F) e o 2º recebe a função diferente contendo os parâmetros: 64 e 64 (64<>64), o retorno será falso, pois as duas condições são falsas.
 */
function oprOr() {
  var value = false;
  if (existArgs(arguments)) {
    for (var i = 0; i < arguments.length; i++) {
      var temp = arguments[i];
      value = temp || value;
    }
  }
  return value;
}

/**
 * Eleva o coeficiente passado no Parâmetro 1, ao expoente passado no Parâmetro 2.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Valor a ser elevado à potência (coeficiente).<br/>
 * 2. Valor para ser informado como expoente.<br/>
 * <br/>
 * Retorno:<br/>
 * Retorna o valor calculado.<br/>
 * <br/>
 * Exemplo: <br/>
 * 1. Assumindo os parâmetros como 4 (Inteiro) e 2 (Inteiro), o retorno seria: 16.0 (Fracionado).<br/>
 * <br/>
 * Observações:<br/>
 * 1. Para garantir a integridade das operações matemáticas, utilize conversão para o tipo de dado nos parâmetros.
 */
function oprPow() {
  var value = 0;
  if (existArgs(arguments)) {
    value = Math.pow(parseNumeric(arguments[0]), parseNumeric(arguments[1]));
  }
  return value;
}

/**
 * Obtém o valor inteiro de um número arredondando para cima ou para baixo, a depender da parte fracionada do número.<br/>
 * Se a parte fracionada do número for maior ou igual a 0,5 o número será arredondado para cima, caso contrário para baixo.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Valor a ser arredondado.<br/>
 * <br/>
 * Retorno:<br/>
 * Retorna o valor (inteiro) arredondado de um número passado por parâmetro.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Assumindo o parâmetro como: 9,5 , retorno seria: 10 (Inteiro).<br/>
 * 2. Assumindo o parâmetro como: 9,4 , retorno seria: 9 (Inteiro).<br/>
 * <br/>
 * Observações:<br/>
 * 1. Para garantir a integridade das operações matemáticas, utilize conversão para o tipo de dado nos parâmetros.
 */
function oprRound() {
  var value = 0;
  if (existArgs(arguments)) {
    value = Math.round(parseNumeric(arguments[0]));
  }
  return value;
}

/**
 * Calcula a raiz quadrada de um número.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1.Valor para ser tirado a raiz quadrada.<br/>
 * <br/>
 * Retorno:<br/>
 * Raiz quadrada do número passado.<br/>
 * <br/>
 * Exemplo: <br/>
 * 1. Assumindo o parâmetro como 16 (Inteiro), o retorno seria: 4,0 (Fracionado), pois  4² = 16.<br/>
 * <br/>
 * Observações:<br/>
 * 1. Para garantir a integridade das operações matemáticas, utilize conversão para o tipo de dado nos parâmetros.
 */
function oprSqrt() {
  var value = 0;
  if (existArgs(arguments)) {
    value = Math.sqrt(parseNumeric(arguments[0]));
  }
  return value;
}

/**
 * Subtração de valores informados nos parâmetros.<br/>
 * <br/>
 * Parâmetro: <br/>
 * n.Valor para a subtração.<br/>
 * <br/>
 * Retorno:<br/>
 * Retorna a subtração de dois ou mais números.<br/>
 * <br/>
 * Exemplo:<br/>
 * 1. Assumindo os parâmetros como: 10 (Inteiro) e 5 (Inteiro), o retorno seria: 5(Inteiro).<br/>
 * <br/>
 * Observação:<br/>
 * 1. O tipo de retorno resultante depende do tipo do primeiro parâmetro.<br/>
 * 2. Para garantir a integridade das operações matemáticas, utilize conversão para o tipo de dado nos parâmetros.
 */
function oprSubtract() {
  var value = 0;
  if (existArgs(arguments)) {
    value = arguments[0];
    if (value instanceof Date) {
      for (var i = 1; i < arguments.length; i++) {
        var temp = toDate(arguments[i]);
        value.subtractDay(temp.getDate());
      }
    } else if (value instanceof Time) {
      for (var i = 1; i < arguments.length; i++) {
        var temp = parseTime(arguments[i]);
        value.subtractHour(temp.getHour());
      }
    } else {
      value = parseNumeric(value);
      for (var i = 1; i < arguments.length; i++) {
        var temp = parseNumeric(arguments[i]);
        value -= temp;
      }
    }
  }
  return value;
}

/**
 * Retorna o valor lógico verdadeiro.<br/>
 * <br/>
 * Retorno: <br/>
 * O Retorno será verdadeiro.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1. Utilizando a função igual contendo no 1º parâmetro a constante lógica true e o 2º parâmetro a função Verdadeiro o retorno <br/>
 * será verdadeiro, pois verdadeiro é igual a verdadeiro.<br/>
 * 2. Utilizando a função Diferente contendo no 1º parâmetro a constante lógica false e o 2º parâmetro a função verdadeiro o <br/>
 * retorno será verdadeiro, pois falso é diferente de verdadeiro.
 */
function oprTrue() {
  return true;
}

/**
 * Arredonda para baixo um número fracionado.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Valor fracionado.<br/>
 * <br/>
 * Retorno:<br/>
 * Número arredondado para baixo.<br/>
 * <br/>
 * Exemplo: <br/>
 * 1. Assumindo o parâmetro: 9,6 (Fracionado), o retorno seria: 9 (Inteiro)<br/>
 * <br/>
 * Observações:<br/>
 * 1. Para garantir a integridade das operações matemáticas, utilize conversão para o tipo de dado nos parâmetros.
 */
function oprTrunc() {
  var value = 0;
  if (existArgs(arguments)) {
    value = parseNumeric(arguments[0]).trunc();
  }
  return value;
}

/**
 * Remove o navegador do formulário que chama o fluxo.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Não Possui.<br/>
 * <br/>
 * Retorno: <br/>
 * Não Possui.<br/>
 * <br/>
 * Observação:<br/>
 * 1. O navegador que vai ser removido será a do formulário que chama o fluxo.<br/>
 * <br/>
 * Exemplo:<br/>
 * 1. Em um formulário que possua barra de navegação, quando essa função for executada esta barra será removida.
 */
function removeNavigator() {
  controller.removeNavigator();
}

/**
 * Causa um atraso na execução de um fluxo. Conhecida também como sleep.<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Tempo em segundos.<br/>
 * <br/>
 * Retorno:<br/>
 * Não possui.
 */
/* Função em implementação, não utilize.*/
/*
function sleep() {
  document.flag = true;
  if (existArgs(arguments)) {
     window.setTimeout("document.flag = false;", arguments[0] * 1000);
     while(document.flag);
  }
  return true;
}
*/

/**
 * Transforma o texto normal em um texto para Delphi com a identação passada no segundo parâmetro.<br/>
 * (Coloca os caracteres especiais para serem executados em Delphi , como por exemplo caracteres de quebra de linha e<br/>
 * etc..)<br/>
 * <br/>
 * Parâmetros: <br/>
 * 1. Texto que será transformado para Delphi.<br/>
 * 2. Parâmetro: Identação.<br/>
 * <br/>
 * Retorno: <br/>
 * Retorna o texto em Delphi.<br/>
 * <br/>
 * Exemplo: <br/>
 * 1.A quebra de linha em Delphi é representada por "#13#10". Assim, passando como parâmetros "Maker(Quebra de Linha)<br/>
 * All " (Letras) e "   " (3 espaços em branco), o resultado será (   '"Maker'#13#10'All "').
 */
function stringToDelphiString(v, ident) { 
  if((typeof v == "undefined") || (v == null)) return '';
  v = "" + v; 
  var SIZE = 67;
  var strings = new Array();
  var i = 0; 
  var s;
  do {
    s = v.substr(i, SIZE);
    if (s!='') strings.push(s);
    i += SIZE;
  } while (s != '');
  var r = '';
  for (var i=0;i<strings.length;i++) {
    r += ((ident?ident:'') + convertToDelphiString(strings[i]));
    if (i != strings.length-1)
      r += '+\r\n';
  }
  if (r == '')
    return '\'\'';
  else
    return r; 
}
function convertToDelphiString(v) { 
  var r = '';
  var opened = false;
  for (var i=0;i<v.length;i++) {
    var code = v.charCodeAt(i);
    if (code == 13)
      continue;
    var especial = !((code >= 32 && code <= 126 && code != 39)) ;
    if (especial) {
      if (opened) {
        r += '\'';
        opened = false;
      }
      if (code == 10)
        r += '#13#10';
      else 
        r += '#'+code;
    } else {
      if (!opened) {
        r += '\'';
        opened = true;
      } 
      if (code == 39)
        r += '\'\''; 
      else
        r += v.charAt(i);
      if (i == v.length-1 && opened)
        r += '\'';
    }
  }
  return r;
}

/**
 * Converte para valor lógico o texto passado por parâmetro. <br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Texto que será convertido para lógico.<br/>
 * <br/>
 * Retorno:<br/>
 * Valor lógico correspondente ao texto enviado.<br/>
 * <br/>
 * Exemplo: <br/>
 * 1-Assumindo como parâmetro o conteúdo " 1", o retorno será o valor lógico verdadeiro.<br/>
 * 2-Assumindo como parâmetro o conteúdo " 0 ", o retorno será o valor lógico falso.
 */
function toBoolean(value) {
  return parseBoolean(value);
}

/**
 * Converte um valor passado por parâmetro para Bytes.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Conteúdo que será convertido para bytes.<br/>
 * <br/>
 * Retorno:<br/>
 * Array de Bytes equivalente ao conteúdo passado por parâmetro.<br/>
 * <br/>
 * Exemplos: <br/>
 * 1-Assumindo o parâmetro "Maker", será retornado um aray de bytes equivalente à palavra Maker.<br/>
 * <br/>
 * Observação:<br/>
 * Para manipular os bytes de retorno dessa função é necessária a utilização da função "Array para Bytes" da categoria<br/>
 * "Conversão". <br/>
 * Após convertido pra lista o conteúdo poderá ser manipulado pelas funções da categoria "Lista".
 */
function toBytes(obj) {
  return obj ? obj.toString() : "";
}

/**
 * Converte para data o valor passado no primeiro parâmetro.<br/>
 * O segundo parâmetro é opcional, e por ele pode-se informar o formato da data que será retornada (válido apenas para fluxo servidor).<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Valor a ser convertido<br/>
 * 2. Formato do parâmetro a ser convertido. (OPCIONAL, válido apenas para fluxo servidor)<br/>
 * <br/>
 * Retorno: <br/>
 * Valor convertido para data.<br/>
 * <br/>
 * Exemplo: <br/>
 * 1.Assumindo como parâmetros a data 10/10/2007 09:12:40 e  o formato dd/MM/yyyy,  o retorno será 10/10/2007 00:00:00.<br/>
 * <br/>
 * Observações:<br/>
 * O formato da Data referente ao segundo parâmetro deve ser escrito no seguinte formato:<br/>
 *          dd    - Para dia do mês da data do primeiro parâmetro.<br/>
 *          MM  - Para Mês do Ano da data do primeiro parâmetro.<br/>
 *         yyyy  - Para o Ano da data do primeiro parâmetro.<br/>
 * O formato da data não remove as horas.
 */
function toDate(value) {
  var toDate = null;
  if (value instanceof Date) {
    toDate = value;
  } else {
    if (value != null && (typeof value != "undefined")) {
      var dtExpReg = /^\s*(\d+)[\/\.-](\d+)[\/\.-](\d+)(\s(\d+):(\d+):(\d+))?\s*$/;
      var dataArr = dtExpReg.exec(value);
      if (dataArr != null) {
        var dia = retirarZerosIniciais(dataArr[1]);
        var mes = retirarZerosIniciais(dataArr[2]);
        var ano = retirarZerosIniciais(dataArr[3]);
        var hora = retirarZerosIniciais(dataArr[5]);
        var minuto = retirarZerosIniciais(dataArr[6]);
        var segundo = retirarZerosIniciais(dataArr[7]);
        if (hora != null && (typeof hora != "undefined")) {
          toDate = new Date(ano, mes-1, dia, hora, minuto, segundo);
        } else {
          toDate = new Date(ano, mes-1, dia, 0, 0, 0);
        }
      }
    }
  }
  return toDate;
}

/**
 * Converte um valor em "radianos" para grau.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Valor em radianos a ser convertido.<br/>
 * <br/>
 * Retorno: <br/>
 * "Radianos" convertido para "Graus". (Número)
 */
function toDegrees(radians) {
  return (Math.PI * toDouble(radians)) / 180;
}

/**
 * Converte para fracionado o valor passado por parâmetro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Valor a ser convertido.<br/>
 * <br/>
 * Retorno: <br/>
 * Valor convertido para Fracionado. <br/>
 * <br/>
 * Exemplo:<br/>
 * Assumindo como parâmetro "2,54" ,  o retorno será 2.54.
 */
function toDouble(value) {
  return parseNumeric(value);
}

/**
 * Converte um valor passado por parâmetro para inteiro.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Valor a ser convertido.<br/>
 * <br/>
 * Retorno: <br/>
 * Valor convertido para Inteiro. <br/>
 * <br/>
 * Exemplo:<br/>
 * Assumindo como parâmetros "12,54"  ,  o retorno será 12.
 */
function toLong() {
  var value = 0;
  if (existArgs(arguments)) {
    value = parseInt(toDouble(arguments[0]));
  }
  return value;
}

/**
 * Converte um valor em "graus" para radiano.<br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Grau a ser convertido.<br/>
 * <br/>
 * Retorno:<br/>
 * Grau convertido para radianos. (Número)
 */
function toRadians(degrees) {
  return (180 * toDouble(degrees)) / Math.PI;
}

/**
 * Converte um valor passado por parâmetro para letras. <br/>
 * <br/>
 * Parâmetros:<br/>
 * 1. Valor a ser convertido.<br/>
 * <br/>
 * Retorno: <br/>
 * Valor convertido para Letras.<br/>
 * <br/>
 * Exemplo:<br/>
 * Assumindo como parâmetro o fracionado 7.4, o retorno será o valor 7.4 convertido para letras.
 */
function toString(obj) {
  return isNullable(obj) ? "" : new String(obj);
}

//-->