/**
*
* @package Rotinas de Utilidade Geral
*/


/**
* Retorna um objeto pelo id, ou pelo nome no formulário.
* @param sID string
* @return object
*/

/*function $(sID)
{
   var obj = document.getElementById(sID);
   if ( !obj )
   {
      var obj = document.forms[0][sID];
   }
   return obj;
}*/

/**
* Retorna a diferenca em meses entre dois períodos, no formato MM/YYYY
* @param sPeriodo string
* @param nQtdMes integer
* @return integer
*/

function subtrairMesAno(sDataIni, sDataFim)
{
	nMesIni =	sDataIni.substr(0, 2);
	nAnoIni = sDataIni.substr(3, 4);

	nMesFim =	sDataFim.substr(0, 2);
	nAnoFim = sDataFim.substr(3, 4);

	nQtdAnos = nAnoFim - nAnoIni;
	nQtdMeses = nMesFim - nMesIni + 1;

	return (nQtdAnos * 12) + nQtdMeses;
}

/**
* Retorna uma data no formato MM/YYYY somada de [n] meses.
* @param sPeriodo string
* @param nQtdMes integer
* @return string
*/

function adicionarMesAno(sPeriodo, nQtdMes)
{
 	nMes = parseInt(sPeriodo.substr(0, 2), 10);
 	nAno = parseInt(sPeriodo.substr(3, 4), 10);

  nMes = nMes + parseInt(nQtdMes, 10);

 	if (nMes > 12)
 	{
 		  nMes = nMes - 12;
 		  nAno = nAno + 1;
 	}

 	sMes = String(nMes - 1);
 	sMes = (sMes.length == 1) ? "0" + sMes : sMes;

 	return  sMes + "/" + String(nAno);
}

/**
* Mostra uma página, em tela inteira .
* @param sURL string URL da página
* @param sNomeJanela string nome da Janela ( Parâmetro opcional )
* @return void
*/

function mostrarRelatorio(sURL,sNomeJanela)
{
  if (mostrarRelatorio.arguments.length == 1)
		  sNomeJanela = "";

  window.open(sURL,sNomeJanela,'top = 0, left = 0,height='+(screen.availHeight-100)+',width='+(screen.availWidth-10)+',fullscreen=no,toolbar=no,location=no,directories=no,status=yes,menubar=yes,scrollbars=yes,resizable=yes,copyhistory=no,alwaysLowered=no,alwaysRaised=yes,dependent=no,hotkeys=yes,titlebar=yes,z-lock=no');
}

/**
* Retira as aspas e os apostrofos encontrados em uma string
* @params URL string URL da página
* @param sNomeJanela string Nome da janela
* @param nLargura integer Comprimento da janela ser mostrada
* @param nAltura integer Altura da janela a ser mostrada
* @return void
*/

function mostrarPopup(sURL,sNomeJanela,nLargura,nAltura)
{
   nTop  = Number((screen.availHeight-nAltura)/2);
   nLeft = Number((screen.availWidth-nLargura)/2);
   window.open(sURL,sNomeJanela,'top ='+String(nTop)+',left='+String(nLeft)+',height='+String(nAltura)+',width='+String(nLargura)+',fullscreen=no,toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes,copyhistory=no,alwaysLowered=no,alwaysRaised=yes,dependent=no,hotkeys=yes,titlebar=no,z-lock=no');
}

/**
* Ordena a lista contida em uma caixa de seleção em ordem alfabética crescente
* @param Lista objectSelect Objeto caixa de selecao
* @return void
*/

function ordernarLista(Lista)
{

  function items(id,valor)
  {
     this.id    = id;
     this.valor = valor;
  }

  // Converter caracteres com acentos para a versão sem acentos, como ç => c
  function obterCharCodeValido(nCharCode)
  {
     switch (nCharCode)
     {
        case 224:
        case 225:
        case 226:
        case 227:
        case 228:
        case 229: return 97;break; //a
        case 192:
        case 193:
        case 194:
        case 195:
        case 196:
        case 197: return 65;break; //A
        case 199: return 67;break; //C
        case 231: return 99;break; //c
        case 232:
        case 233:
        case 234:
        case 235: return 101;break;//e
        case 200:
        case 201:
        case 202:
        case 203: return 69;break; //E
        case 204:
        case 205:
        case 206:
        case 207: return 73;break; //I
        case 236:
        case 237:
        case 238:
        case 239: return 105;break; //i
        case 210:
        case 211:
        case 213:
        case 214: return 79;break; //O
        case 242:
        case 243:
        case 244:
        case 245:
        case 246: return 111;break; //o
        case 250:
        case 251:
        case 252: return 117;break; //u
        case 217:
        case 218:
        case 219:
        case 220: return 85;break; //U
        default: return nCharCode;break;

     }

  }

  /**
   * Função usada para a ordenação do array de itens
   * Retorna:
   * 0 = strings iguais
   * 1 = s1 deve ficar na frente de s2
   * -1 = s1 deve ficar atrás de s2
   */

  function compararStrings(s1,s2)
  {
     resultado = 0;

     cadeia1 = s1.valor;
     cadeia2 = s2.valor;

     cadeia1 = cadeia1.toUpperCase();
     cadeia2 = cadeia2.toUpperCase();

     if ( cadeia1.length > cadeia2.length )
     {
     	  nComp = cadeia2.length;
     }
     else
     {
     	  nComp = cadeia1.length;
     }

     for( i = 0; i < nComp;i++)
     {
        nCharCode1 = obterCharCodeValido(cadeia1.charCodeAt(i));
        nCharCode2 = obterCharCodeValido(cadeia2.charCodeAt(i));

       	if ( nCharCode1 != nCharCode2 )
       	{
           if ( nCharCode1 < nCharCode2 )
           {
              resultado = -1;
              break;
           }
           else if ( nCharCode1 > nCharCode2 )
           {
              resultado = 1;
              break;
           }
       	}
     }

     // Ordenando por comprimento

     if ( ( resultado == 0 ) && ( cadeia1.length > cadeia2.length ) )
     {
        resultado = 1;
     }

     return resultado;

  }

  var arrItems = new Array();

  // Copiando o conteúdo da caixa de seleção para o array
  for(i =0;i < Lista.options.length;i++)
  {
     arrItems[i] = new items(Lista.options[i].value,Lista.options[i].text);
  }

  arrItems.sort(compararStrings); // Ordenando o conteúdo, usando a função compararStrings

  Lista.options.length = 0; // Limpando o conteúdo da caixa de seleção

  // Copiando o conteúdo do array para a caixa de seleção
  for(i =0;i < arrItems.length;i++)
  {
     Lista.options[i] = new Option(arrItems[i].valor,arrItems[i].id);
  }

}

/**
* Copia itens selecionados de uma caixa de seleção para outra.
* @param ListaDe objectSelect Objeto caixa de selecao, de onde serão copiados os itens selecionados
* @param ListaPara objectSelect Objeto caixa de selecao, destino dos itens copiados
* @return boolean
*/

function moverItensSelect(ListaDe,ListaPara)
{

  var c = 0;
  for(i = 0;i < ListaDe.options.length;)
  {
    if ( ListaDe.options[i].selected )
    {
      ListaPara.options[ListaPara.length] = new Option(ListaDe.options[i].text,ListaDe.options[i].value);
      ListaDe.options[i] = null;
      i = 0;
	    c++;
    }
    else
    {
      i++;
    }
  }
  if (c == 0)
  {
		alert("É necessário selecionar ao menos um item!")
	}
	else
	{
   	ordernarLista(ListaDe);
	  ordernarLista(ListaPara);
  }
  return true;

}

/**
* Marca ou desmarca todos os items contidos em uma caixa de seleção.
* @param Lista objectSelect Objeto caixa de selecao, contido no formulario
* @param bValor boolean Se true, todos os itens serão selecionados, false para contrário
* @return void
*/

function marcarItensSelect(Lista,bValor)
{

  if ( arguments.length < 2 )
  {
    bValor = true;
  }

  for(i = 0;i < Lista.options.length;i++)
  {
    Lista.options[i].selected = bValor;
  }

}

/**
* Marca ou desmarca todos os checboxs contidos em um formulario.
* @param formulario objectForm Objeto formulario, contido na página
* @param bValor boolean Se true, todos os checkbox serão marcados, false para contrário
* @return void
*/

function marcarItensCheckBox(formulario,bValor)
{

  if ( arguments.length < 2 )
  {
     bValor = true;
  }

  for(i=0;i < formulario.length;i++)
  {
    if ( formulario.elements[i].type == "checkbox" )
      formulario.elements[i].checked = bValor;
  }

}

/**
* Marca ou desmarca todos os checboxs contidos em uma tabela.
* @param sTabelaID string Id da tabela, contido na página
* @param bValor boolean Se true, todos os checkbox serão marcados, false para contrário
* @return void
*/

function marcarCheckBoxTabelaPorId(sTabelaID,bValor,sClasse1,sClasse2)
{
  var oTabela = document.getElementById(sTabelaID);
  
  if ( arguments.length < 2 )
  {
     bValor = true;
     sClasse1 = 'TabelaLinha1';
     sClasse2 = 'TabelaLinha2';
  }
  else if ( arguments.length < 3 )
  {
	 sClasse1 = 'TabelaLinha1';
     sClasse2 = 'TabelaLinha2';
  }
  else if ( arguments.length < 4 )
  {
	 sClasse2 = 'TabelaLinha2';
  }

  var oInputs = oTabela.getElementsByTagName("INPUT");
  for (var i=0;i < oInputs.length;i++)
  {
	 if ( oInputs[i].type.toUpperCase() == "CHECKBOX" )
	 {
		var oCheckBox = oInputs[i];
		oCheckBox.checked = bValor;
        sClass = ( oCheckBox.checked ) ? sClasse2 : sClasse1;
  
        var oTR = oCheckBox.parentNode.parentNode;
        oTDs = oTR.getElementsByTagName("TD");
        for (var j=0;j<oTDs.length;j++)
        {
           oTDs[j].className = sClass;
        }
	 }
  }

}


/**
* Compara duas datas no formato MM/YYYY. Retorna:
* 0 = sPeriodo1 = sPeriodo2
* 1 = sPeriodo1 > sPeriodo2
* 2 = sPeriodo1 < sPeriodo2
* @param sPeriodo1 string Data no formato MM/YYYY
* @param sPeriodo2 string Data no formato MM/YYYY
* @return integer
*/

function compararPeriodo(sPeriodo1,sPeriodo2)
{

  aPeriodo1 = sPeriodo1.split("\/");
  aPeriodo2 = sPeriodo2.split("\/");
  nPeriodo1 = Number(aPeriodo1[1])*100 + Number(aPeriodo1[0]);
  nPeriodo2 = Number(aPeriodo2[1])*100 + Number(aPeriodo2[0]);

  if ( nPeriodo1 == nPeriodo2 )
  {
    return 0;
  }
  else if ( nPeriodo1 > nPeriodo2 )
  {
    return 1;
  }
  else
  {
    return 2;
  }

}

/**
* Compara duas datas no formato DD/MM/YYYY. Retorna:
* 0 = data1 = data2
* 1 = data1 > data2
* 2 = data1 < data2
* @param sData1 string Data no formato DD/MM/YYYY
* @param sData2 string Data no formato DD/MM/YYYY
* @return integer
*/

function compararDatas(sData1,sData2)
{
	if (compararDatas.arguments.length == 1){
		Data = new Date();
		sDia = Data.getDate();
		sMes = Data.getMonth()+1;
		sAno = Data.getFullYear();
		sData2 = sDia + "/" + sMes + "/" + sAno;
	}

  arrData1 = sData1.split("/");
  arrData2 = sData2.split("/");

  var data1 = new Date(Number(arrData1[2]),Number(arrData1[1]) - 1,Number(arrData1[0]));
  var data2 = new Date(Number(arrData2[2]),Number(arrData2[1]) - 1,Number(arrData2[0]));

  if ( data1 > data2 )
    return 1
  else if ( data1 < data2 )
    return 2
  else
    return 0;

}

/**
* Copia todos os valores de um formulario e retorna uma string que pode ser usada
*   como parâmetro de uma URL.
* @param formulario formObject formulario da página
* @return string Campos do formulario transformados em uma requisicao GET
*/

function formToGetRequest(formulario)
{
   sGET = "";
   for(var i = 0;i < formulario.elements.length;i++)
   {
      var formObj = formulario.elements[i];
      switch ( formObj.type )
      {
         case "button":
         case "fileupload":
         case "hidden":
         case "password":
         case "reset":
         case "submit":
         case "text":
         case "textarea":
         {
            sGET += "&"+formObj.name+'='+escape(formObj.value);
            break;
         }
         case "checkbox":
         {
            if ( formObj.checked )
            {
               sGET += "&"+formObj.name+'='+escape(formObj.value);
               break;
            }
         }
         case "radio":
         {
            if ( formObj.checked )
            {
               sGET += "&"+formObj.name+'='+escape(formObj.value);
               break;
            }
         }
         default:
         {
            ehCaixaSelecao = /^select(\-|\w)*$/i
            if ( ehCaixaSelecao.test(formObj.type) )
            {
               if ( formObj.multiple )
               {
                  for(j = 0;j < formObj.options.length;j++)
                  {
                    if ( formObj.options[j].selected )
                    {
                      sGET += "&"+formObj.name+'='+escape(formObj.options[j].value);
                    }
                  }
               }
               else
               {
                 sGET += "&"+formObj.name+'='+escape(formObj.options[formObj.selectedIndex].value);
               }
               break;
            }
         }

      }

   }

   return sGET;

}

/**
* Cria um iframe oculto para busca
* @param string sName
* @param string sSource
* @return void
*/

function carregarIframeBusca(sName,sSource)
{
   var oIframe = document.getElementById(sName);
   var oDocumento = document.documentElement;
   if ( oIframe == null )
   {
      var oIframe = document.createElement("iframe");
      with ( oIframe )
      {
        id = sName;
        name = sName;
        frameBorder = 0;
        border = 0;
        height = 0;
        width = 0;
        vspace = 0;
        hspace = 0;
        scrolling = "no";
        marginHeight = 0;
        marginWidth = 0;
      }
      oDocumento.appendChild(oIframe);
   }
   oIframe.src = sSource;
}

/**
* Sincroniza o valor de campo Text de um formulario com o valor de uma caixa de seleção
* @param formField objFormField objeto de formulario, que pode ser um campo TEXT ou campo SELECT
* @param string sValor Valor que será passado ao objeto
* @return void
*/

function sincronizarCampos(objFormField,sValor)
{
  ehCaixaSelecao = /^select(\-|\w)*$/i

  objFormField.value = sValor;
  if ( ehCaixaSelecao.test(objFormField.type) )
  {
    if ( objFormField.selectedIndex == -1 ) objFormField.selectedIndex = 0;
  }

}

/**
* Seleciona o primeiro campo do formulario
* @return void
*/

function selecionarPrimeiroCampo()
{
   var formulario = document.forms[0];
   for(i = 0;i < formulario.elements.length;i++)
   {
      if ( ( formulario.elements[i].type != 'hidden' ) && ( !formulario.elements[i].disabled ) )
      {
         formulario.elements[i].focus();
         break;
      }
   }
}

/**
* Usado para paginacao
* @param integer nIndice
* @return void
*/
function paginacao(nIndice)
{
   var formulario = document.forms[0];

   sURL = location.href;
   if ( sURL.indexOf("indice") == -1 )
   {
	  sURL = ( sURL.indexOf("?") == -1 ) ? sURL+"?indice="+String(nIndice) : sURL+"&indice="+String(nIndice);
   }
   else if ( sURL.indexOf("?indice=") != -1 )
   {
	  var regExp = /\?indice=(\w)+/gi 
	  sURL = sURL.replace(regExp,"?indice="+String(nIndice));
   }
   else if ( sURL.indexOf("&indice=") != -1 )
   {
	  var regExp = /&indice=(\w)+/gi
	  sURL = sURL.replace(regExp,"&indice="+String(nIndice));
   }
   
   with ( formulario )
   {
      action = sURL;
      submit();
   }
}

/**
* Obtem o elemento imediatamente ascedente por tag
* @param DOMElement oElemento
* @param string sTag
* @return DOMElement
*/
function obterElementoAscedentePorTag(oElemento,sTag)
{
   var oDocumento = document.documentElement;

   var oTemp = oElemento;
   var oTagElements = null;
   var oAlvo = null;

   while ( oTemp != oDocumento )
   {
      var oTagElements = oTemp.getElementsByTagName(sTag);
      if ( oTagElements && ( oTagElements.length > 0 ) )
      {
	     oAlvo = oTagElements[0]; 
         break;
      }
      var oTemp = oTemp.parentNode;
   }

   return oAlvo;
}

/**
* Seleciona todos os contidos em uma tabela a partir de um elemento 
*incluso sensível a eventos como onclick
* @param event evento
* @return void
*/
function marcarCheckBoxTabelaPorEvento(evento)
{
   if (!evento) var evento = window.event;
   var oElemento = (evento.target) ? evento.target : evento.srcElement;
   
   var bMarcarTodos = false;
   
   if ( oElemento.getAttribute("allchecked") != null )
   {
	  sValor = oElemento.getAttribute("allchecked");
	  if ( sValor == "ON" ){
		 oElemento.setAttribute("allchecked","OFF")
	     bMarcarTodos = false;
      } else {
	     oElemento.setAttribute("allchecked","ON")
	     bMarcarTodos = true;
      }
   }
   else
   {
	  oElemento.setAttribute("allchecked","ON")
	  bMarcarTodos = true;
   }

   var oTabela = obterElementoAscedentePorTag(oElemento,"TABLE");
   marcarCheckBoxTabelaPorId(oTabela.id,bMarcarTodos);
}

/**
* Usado para dar destaque ao clicar em um checkbox na linha da tabela
* @param integer oTabela
* @param string sClasse1
* @param string sClasse2
* @return void
*/
function aplicarDestaqueLinhaTabela(sTabela,sClasse1,sClasse2)
{
  if ( arguments.length < 2 )
  {
     sClasse1 = 'TabelaLinha1';
     sClasse2 = 'TabelaLinha2';
  } else if ( arguments.length < 3 )
  {
     sClasse2 = 'TabelaLinha2';
  }
	
   var oTabela = document.getElementById(sTabela);
   if ( !oTabela ) return;

   var oTRs = oTabela.getElementsByTagName("TR");
   for (var i=0;i<oTRs.length;i++)
   {
      var oTDs = oTRs[i].getElementsByTagName("TD");
      for (var j=0;j<oTDs.length;j++)
      { 
         var oInputs = oTDs[j].getElementsByTagName("INPUT");
         if ( oInputs )
         {
	        for (var k=0;k<oInputs.length;k++)
            { 
	           if ( oInputs[k].getAttribute('type').toUpperCase() == 'CHECKBOX' )
	           {
                  oInputs[k].onclick = function(evento){
	                 if (!evento) var evento = window.event;
                     var oCheckBox = (evento.target) ? evento.target : evento.srcElement;
                     sClass = ( oCheckBox.checked ) ? sClasse2 : sClasse1;
  
                     var oTR = oCheckBox.parentNode.parentNode;
                     oTDs = oTR.getElementsByTagName("TD");
                     for (var i=0;i<oTDs.length;i++)
                     {
                        oTDs[i].className = sClass;
                     }
                  }
               }
            }
         }
      }
   }
}

/**
* Calcula a idade a partir da data informada
* @param sData string A data de aniversario
* @param sDataAtual string A data de referência
* @return void
*/

function calcularIdade(sData,sDataAtual)
{
 aData = sData.split('/');

 nDia = Number(aData[0]);
 nMes = Number(aData[1]);
 nAno = Number(aData[2]);
 
 aData = sDataAtual.split('/');

 nDiaAtual = Number(aData[0]);
 nMesAtual = Number(aData[1]);
 nAnoAtual = Number(aData[2]);
 
 nIdade = nAnoAtual - nAno; 
 
 if ( nMesAtual < nMes || ( nMesAtual==nMes && nDiaAtual<nDia ) )
 {
    nIdade--;
 }

 return nIdade;
}

/**
* Realiza uma operacao XOR com os campos informados
* Retorna verdadeiro se pelo menos um parametro informado tiver valores distintos dos outros
* @return boolean
*/

function XOR()
{
   if ( arguments.length >= 2 )
   {
  	  bTemp1 = false;
  	  bTemp2 = true;
  	  for(var i = 0;i < arguments.length;i++)
  	  {
  	   	bTemp1 = bTemp1 || arguments[i];
  	   	bTemp2 = bTemp2 && arguments[i];
  	  }
  	  return (bTemp1 && !bTemp2);
   }
   return false;
}

