function apaga_registo(){
var confirma=confirm('Tem a certeza que pretende apagar este registo?');
if (confirma)
return true;
else
return false;
}
function showhide(qual,grupo)
{
if (document.getElementById){
// é DOM compativel
document.getElementById(grupo).style.display = (document.getElementById(grupo).style.display == "block") ? "none" : "block";
document.getElementById(qual).className = (document.getElementById(qual).className == "mais") ? "menos" : "mais";
} else {
if (document.layers){
// é communicator
document.layers[grupo].style.visibility    = (document.layers[grupo].style.visibility  == "hide") ? "show" : "hide";
qual.className= (qual.className == "mais") ? "menos" : "mais";
} else {
if (document.all){
// é IE 4 pelo menos
document.all(grupo).style.visibility  = (document.all(grupo).style.visibility  == "hidden") ? "visible" : "hidden";
qual.className= (qual.className == "mais") ? "menos" : "mais";
}
}
}
}
var contador = 1;
var floatDiv = 'floatDiv';
var timerID;
var campoAntigo;
var elementosDiv;
var indiceSelect=-1;
var nomeTagSel;
function abre_calendario(form_name,field,data_type,ano,mes) {
open("web_util.calendario?p_mes="+mes+"&p_ano="+ano+"&p_data_type="+data_type+"&p_form_name="+form_name+"&p_field="+field,"Calendario","scrollbars=no,resizable=no,width=200,height=250")};
function toggleAjuda(lado, html){
if(!($("ifrAjuda").getAttribute($))){
$("ifrAjuda").setAttribute("src", html);}
$("divAjuda").style.display = ($("divAjuda").style.display=="none"?"":"none");
$("divAjuda").className = "ajuda" + (lado?lado:"Dir");
$("principal").className = ($("principal").className=="principal"?"principalPeq"+(lado?lado:"Dir"):"principal");
$("linkFechaAjuda").href="javascript:toggleAjuda('"+lado+"');";
}
function checkAll(elem) {
var elementos = document.getElementsByName(elem);
for (var i = 0, elems = elementos.length; i < elems; i++)
if (elementos[i].checked == false) elementos[i].checked = true;
}
function uncheckAll(elem) {
var elementos = document.getElementsByName(elem);
for (var i = 0, elems = elementos.length; i < elems; i++)
if (elementos[i].checked == true) elementos[i].checked = false;
}
function switchAll(elem) {
var elementos = document.getElementsByName(elem);
for (var i = 0, elems = elementos.length; i < elems; i++)
elementos[i].checked = !elementos[i].checked;
}
function ajudaContexto(elem, texto, posicao, classOrig){
elemento = $(elem);
if(elemento.getAttribute("id")){
if($("ajuda_"+elemento.getAttribute("id").substr(elemento.getAttribute("id").indexOf("_")+1))){
var popup = $("ajuda_"+elemento.getAttribute("id").substr(elemento.getAttribute("id").indexOf("_")+1));
popup.parentNode.removeChild(popup);
elemento.parentNode.className = (classOrig);
return;
} 
}
contador++;
var divAjuda = document.createElement("DIV");
// DEFINIR ISTO PELA CSS !!!!!
if (posicao)
if (posicao!=0)
divAjuda.setAttribute("style", "float:right;");
divAjuda.setAttribute("id","ajuda_"+contador);
divAjuda.innerHTML = texto;
elemento.setAttribute("id", "img_"+contador);
elemento.parentNode.appendChild(divAjuda);
elemento.setAttribute("onclick", elemento.getAttribute("onclick").substr(0, elemento.getAttribute("onclick").length-2));
elemento.setAttribute("onclick", elemento.getAttribute("onclick") + (posicao?",'":",null,'") + elemento.parentNode.className + "');");
elemento.parentNode.className = "ajudaContextual";
}
var diasArrayPeq = new Array('D', 'S', 'T', 'Q', 'Q', 'S', 'S');
var diasArrayGr = new Array('Domingo', 'Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta', 'Sábado');
var mesesArrayPeq = new Array('Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez');
var mesesArrayGr = new Array('Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro');
var formatoData = "DD-MM-YYYY";
var formatoData, campoAntigo, posCal;
var dataMinAbs = new Date(1000,1,1);
var dataMaxAbs = new Date(3000,11,31);
/**
 * Função principal, chamada pelo utilizador
**/
function abreCalendario(nomeCampoData, formatoDataRes, dataMin, dataMax, campoAnt, campoSeg, posCalend)
{
  posCal = posCalend;
  var campoDestino = (posCal?$n(nomeCampoData, posCal):$(nomeCampoData));

  if (formatoDataRes) formatoData = formatoDataRes
  else formatoData = "DD-MM-YYYY";

  var posX = campoDestino.offsetLeft;
  var posY = campoDestino.offsetTop + campoDestino.offsetHeight ;

  // Posiciona o calendário quando o form se encontra dentro de um tabela
  var campoPai = campoDestino;
  while (campoPai.offsetParent) {
     campoPai = campoPai.offsetParent;
     posX += campoPai.offsetLeft;
     posY += campoPai.offsetTop ;
  }

  desenhaCalendario(campoDestino, posX, posY, dataMin, dataMax, campoAnt, campoSeg);
}

/*desenhaCalendario()
abreFloatDiv('pv_calendario', 'refreshCalendario(\'pv_calendario\', \'\')')*/


/**
 * Coloca o calendário na página
**/
function desenhaCalendario(campoDestino, posX, posY, dataMin, dataMax, campoAnt, campoSeg)
{
  var dtMin, dtMax, cpAnt, cpSeg;
  var dt = getDataCampo(campoDestino.value);

  if (dataMin) dtMin = getDataCampo(dataMin);
  if (dataMax) dtMax = getDataCampo(dataMax);
  if (campoAnt){
     var valAnt = $(campoAnt).value;
     if (valAnt){
          cpAnt = getDataCampo(valAnt);
          if (!campoDestino.value) dt = cpAnt;}}
  if (campoSeg){
     var valSeg = $(campoSeg).value;
     if (valSeg){
          cpSeg = getDataCampo(valSeg);
          if (!campoDestino.value) dt = cpSeg;}}

  if (dtMin&&cpAnt) dtMin = dtMin>cpAnt?dtMin:cpAnt
  else if (cpAnt) dtMin=cpAnt;
  if (dtMax&&cpSeg) dtMax = dtMax<cpSeg?dtMax:cpSeg;
  else if (cpSeg) dtMax=cpSeg;


  // Cria um DIV que vai conter o calendário
  if (!$('divCalendario')) {
     var novoNo = document.createElement("div");
     novoNo.setAttribute("id", 'divCalendario');
     novoNo.className = "brancob";       // Não usar setAttribute. Mais um bug do IE...
     novoNo.setAttribute("style", "visibility: hidden;");
     document.body.appendChild(novoNo);
  }

  // Posiciona o DIV
  var pickerDiv = $('divCalendario');
  pickerDiv.style.position = "absolute";
  pickerDiv.style.left = posX + "px";
  pickerDiv.style.top = posY + "px";
  pickerDiv.style.visibility = (pickerDiv.style.visibility == "visible" ? (campoAntigo==campoDestino ? "hidden" : "visible") : "visible");
  pickerDiv.style.display = (pickerDiv.style.display == "block" ? (campoAntigo==campoDestino ? "none" : "block") : "block");
  pickerDiv.style.zIndex = 1000;
  campoAntigo = campoDestino;

  if (!dtMin) dtMin = dataMinAbs;
  if (!dtMax) dtMax = dataMaxAbs;

  // Cria a tabela de selecção da data
  refreshCalendario(campoDestino.name, dt.getFullYear(),dt.getMonth(),dt.getDate(),dtMin.getFullYear(),dtMin.getMonth(),dtMin.getDate(),dtMax.getFullYear(),dtMax.getMonth(),dtMax.getDate());
}

function conteudoCalendario(nomeCampoData, formatoDataRes, dataMin, dataMax, campoAnt, campoSeg, posCalend) {
  posCal = posCalend;
  var campoDestino = (posCal?$n(nomeCampoData, posCal):$(nomeCampoData));

  if (formatoDataRes) formatoData = formatoDataRes
  else formatoData = "DD-MM-YYYY";

    var dtMin, dtMax, cpAnt, cpSeg;
  var dt = getDataCampo(campoDestino.value);

  if (dataMin) dtMin = getDataCampo(dataMin);
  if (dataMax) dtMax = getDataCampo(dataMax);
  if (campoAnt){
     var valAnt = $(campoAnt).value;
     if (valAnt){
          cpAnt = getDataCampo(valAnt);
          if (!campoDestino.value) dt = cpAnt;}}
  if (campoSeg){
     var valSeg = $(campoSeg).value;
     if (valSeg){
          cpSeg = getDataCampo(valSeg);
          if (!campoDestino.value) dt = cpSeg;}}

  if (dtMin&&cpAnt) dtMin = dtMin>cpAnt?dtMin:cpAnt
  else if (cpAnt) dtMin=cpAnt;
  if (dtMax&&cpSeg) dtMax = dtMax<cpSeg?dtMax:cpSeg;
  else if (cpSeg) dtMax=cpSeg;

  campoAntigo = campoDestino;

  if (!dtMin) dtMin = dataMinAbs;
  if (!dtMax) dtMax = dataMaxAbs;

  // Cria a tabela de selecção da data
  return refreshCalendario(campoDestino.name, dt.getFullYear(),dt.getMonth(),dt.getDate(),dtMin.getFullYear(),dtMin.getMonth(),dtMin.getDate(),dtMax.getFullYear(),dtMax.getMonth(),dtMax.getDate(), 1);
}

/**
 * Desenha a tabela com o calendário
**/
function refreshCalendario(nomeCampoData,ano,mes,dia,anoMin,mesMin,diaMin,anoMax,mesMax,diaMax,ret)
{
  var dataMin, dataMax;
  if(anoMin&&diaMin&&(mesMin||mesMin==0))
     dataMin = new Date(anoMin, mesMin, diaMin);
  if(anoMax&&diaMax&&(mesMax||mesMax==0))
     dataMax = new Date(anoMax, mesMax, diaMax);

  // Se não forem passados argumentos, usa o dia corrente
  var diaActual = new Date();

  if ((mes >= 0) && (ano > 0)) {
     diaActual = new Date(ano, mes, 1);
  } else {
     dia = diaActual.getDate();
     diaActual.setDate(1);
  }
  var anoActual = diaActual.getFullYear();

  if (diaActual.lastDay()<dataMin){
     refreshCalendario(nomeCampoData,anoMin,mesMin,dia,anoMin,mesMin,diaMin,anoMax,mesMax,diaMax);
     return;
  }
  if (diaActual>dataMax){
     refreshCalendario(nomeCampoData,anoMax,mesMax,dia,anoMin,mesMin,diaMin,anoMax,mesMax,diaMax);
     return;
  }

  // Cria a tabela com o calendário
  var html = "<table class='tabela'>";

  // Ano corrente
  html += "<tr>";
  if ( !dataMin || anoActual > dataMin.getFullYear() )
     html += "<td class='brancod'>" + botoesAntSeg(nomeCampoData, diaActual, -12, "&lt;",anoMin,mesMin,diaMin,anoMax,mesMax,diaMax) + "</td>";
  else
     html += "<td class='brancod'></td>";
  html += "<td colspan=5 class='brancoc'><div>";
  html += "<select id='p_ano' name='p_ano' onchange=\"refreshCalendario('"+nomeCampoData+"',this.value,"+mes+","+dia+","+anoMin+","+mesMin+","+diaMin+","+anoMax+","+mesMax+","+diaMax+")\">";
  var anoMinimo = (anoActual-100>anoMin?anoActual-100:anoMin);
  for (var i = anoMinimo ; i < anoActual; i++)
     html += "<option value='"+i+"'>"+i+"</option>";
  html += "<option value='"+anoActual+"' selected='selected'>"+anoActual+"</option>";
  var anoMaximo= (anoActual+30<anoMax?anoActual+30:anoMax);
  for (i = anoActual+1; i <= anoMaximo; i++)
     html += "<option value='"+i+"'>"+i+"</option>";
  html += "</select></div></td>";
  if ( !dataMax || anoActual < dataMax.getFullYear() )
     html += "<td class='branco'>" + botoesAntSeg(nomeCampoData, diaActual, 12, "&gt;", anoMin,mesMin,diaMin,anoMax,mesMax,diaMax) + "</td>";
  else
     html += "<td class='brancod'></td>";
  html += "</tr>";

  // Mês corrente
  html += "<tr>";
  if ( diaActual <= dataMin )
     html += "<td class='brancod'></td>";
  else
     html += "<td class='brancod'>" + botoesAntSeg(nomeCampoData, diaActual, -1, "&lt;",anoMin,mesMin,diaMin,anoMax,mesMax,diaMax) + "</td>";
  html += "<td colspan=5 class='brancoc'><div>";
  html += "<select id='p_mes' name='p_mes' onchange=\"refreshCalendario('"+nomeCampoData+"',"+anoActual+",this.value,"+dia+","+anoMin+","+mesMin+","+diaMin+","+anoMax+","+mesMax+","+diaMax+")\">";
  for (i = 0; i<12; i++) {
     if (!((anoActual == dataMin.getFullYear() && i<mesMin) || (anoActual == dataMax.getFullYear() && i>mesMax))){
          if (i==diaActual.getMonth()) html += "<option value='"+i+"' selected='selected'>"+mesesArrayGr[i]+"</option>";
          else html += "<option value='"+i+"'>"+mesesArrayGr[i]+"</option>";
     }
  }
  html += "</select></div></td>";
  if ( diaActual.lastDay() >= dataMax )
     html += "<td class='brancod'></td>";
  else
     html += "<td class='branco'>" + botoesAntSeg(nomeCampoData, diaActual, 1, "&gt;",anoMin,mesMin,diaMin,anoMax,mesMax,diaMax) + "</td>";
  html += "</tr>";

  // Linha com os dias da semana
  html += "<tr>";
  for(i = 0; i < diasArrayPeq.length; i++)
     html += "<th>" + diasArrayPeq[i] + "</th>";
  html += "</tr>";

  // Dias do mês
  html += "<tr>";
  for (i = 0; i < diaActual.getDay(); i++)
     html += "<td class='escuro'></td>";

  do {
     numDia = diaActual.getDate();

     if (numDia == dia)
        html += "<td class='calendsel' style='cursor:pointer; cursor:hand;' onMouseOut='this.className=\"calendsel\";' onMouseOver='this.className=\"calendeventsel\";' onclick=\"preencheCampoForm('"+nomeCampoData+"', '"+getDateString(diaActual)+"');\"><div>"+numDia+"</div></td>";
     else if ( (diaActual < dataMin) || (diaActual > dataMax) )
        html += "<td class='escuroc'><span class='cinzento'>"+numDia+"</span></td>";
     else
        html += "<td class='claroc' style='cursor:pointer; cursor:hand;' onMouseOut='this.className=\"claroc\";' onMouseOver='this.className=\"calendevent\";' " + " onclick=\"preencheCampoForm('"+nomeCampoData+"', '"+getDateString(diaActual)+"');\">"+numDia+"</td>";

     if (diaActual.getDay() == 6)
        html += "</tr><tr>";

     diaActual.setDate(diaActual.getDate() + 1);
  } while (diaActual.getDate() > 1)

  if (diaActual.getDay() > 0) {
     for (i = 7; i > diaActual.getDay(); i--)
        html += "<td class='escuro'></td>";
  }
  html += "</tr></table>";

  // Botões para o mês actual e para fechar o calendário
  html += "<p class='formulariobotoes'>";
  html += "<button onClick='refreshCalendario(\"" + nomeCampoData + "\",null,null,null,"+anoMin+","+mesMin+","+diaMin+","+anoMax+","+mesMax+","+diaMax+");'><img src='imagens/BotaoHoje' alt=''  title=''   class='border0'> <span class='textopequeno'>Hoje</span></button> ";
  html += "<button onClick='preencheCampoForm(\"" + nomeCampoData + "\");'><img src='imagens/BotaoApagar' alt=''  title=''   class='border0'> <span class='textopequeno'>Fechar</span></button>";
  html += "</p>";
  if (ret)
  return html;
  else
     $('divCalendario').innerHTML = html;
//  $(floatDiv).innerHTML = html;
}

/**
 * Botões para o mês anterior/seguinte
**/
function botoesAntSeg(nomeCampoData,valorData,dif,label,anoMin,mesMin,diaMin,anoMax,mesMax,diaMax)
{
  var novoMes = (valorData.getMonth () + dif) % 12;
  var novoAno = valorData.getFullYear() + parseInt((valorData.getMonth() + dif) / 12);
  if (novoMes < 0) { novoMes += 12; novoAno += -1; }

  // **************************************** //
  // TROCAR POR UM URL DINÂMICO OU WEB.IMAGEM //
  // **************************************** //
  return "<img src='/gessi/imagens/" + (dif<0?'Seta_Esquerda':'Seta_Direita') + "' style='cursor: pointer; cursor: hand;' alt='Seta Esquerda' title='' class='border0' width='11' height='11' onClick='refreshCalendario(\""+nomeCampoData+"\","+novoAno+","+novoMes+",null,"+anoMin+","+mesMin+","+diaMin+","+anoMax+","+mesMax+","+diaMax+");' >";
}

/**
 * Converte um objecto Date numa string, a partir das variáveis
**/
function getDateString(valorData)
{
  var stringData = formatoData;
  var stringDia = "00" + valorData.getDate();
  var stringMes = "00" + (valorData.getMonth()+1);
  stringDia = stringDia.substring(stringDia.length - 2);
  stringMes = stringMes.substring(stringMes.length - 2);
  stringData = stringData.toLowerCase().replace('dd', stringDia);
  stringData = stringData.toLowerCase().replace('mm', stringMes);
  stringData = stringData.toLowerCase().replace('yyyy', valorData.getFullYear());
  stringData = stringData.toLowerCase().replace('rrrr', valorData.getFullYear());
  return stringData;
}

/**
 * Converte uma string num objecto Date
**/
function getDataCampo(stringData)
{
  var valorData;
  var dArray;
  var d, m, y;

  try {
     dArray = separaData(stringData);
     if (dArray) {
     if (formatoData.toLowerCase().match("d.*m.*[yr].*")){
                  d = parseInt(dArray[0]);
                  m = parseInt(dArray[1]) - 1;
                  y = parseInt(dArray[2]);
     } else if (formatoData.toLowerCase().match("m.*d.*[yr].*")){
                  d = parseInt(dArray[1]);
                  m = parseInt(dArray[0]) - 1;
                  y = parseInt(dArray[2]);
     } else if (formatoData.toLowerCase().match("[yr].*m.*d.*")){
                  d = parseInt(dArray[2]);
                  m = parseInt(dArray[1]) - 1;
                  y = parseInt(dArray[0]);
     } else {
                  d = parseInt(dArray[0]);
                  m = parseInt(dArray[1]) - 1;
                  y = parseInt(dArray[2]);
     }
        valorData = new Date(y, m, d);
     } else if (stringData) {
        valorData = new Date(stringData);
     } else {
        valorData = new Date();
     }
  } catch(e) {
     valorData = new Date();
  }
  return valorData;
}

/**
 * Separa a data em partes, procurando os separadores {/.-\}
**/
function separaData(stringData)
{
  var dArray;
  if (stringData.indexOf("/") >= 0)
     dArray = stringData.split("/");
  else if (stringData.indexOf(".") >= 0)
     dArray = stringData.split(".");
  else if (stringData.indexOf("-") >= 0)
     dArray = stringData.split("-");
  else if (stringData.indexOf("\\") >= 0)
     dArray = stringData.split("\\");
  else
     dArray = false;
  return dArray;
}

/**
 * Passa os valores para o campo do form
**/
function preencheCampoForm(nomeCampoData, stringData)
{
  var campoDestino = (posCal?$n(nomeCampoData, posCal):$(nomeCampoData));
  if (stringData) campoDestino.value = stringData;
  var divCalendario = $('divCalendario');
  divCalendario.style.visibility = "hidden";
  divCalendario.style.display = "none";
  campoDestino.focus();
}

/**
 * Retorna o último dia do mês
**/
Date.prototype.lastDay = function () {
  var dataTemp = new Date(this.getTime());
  dataTemp.setMonth(dataTemp.getMonth()+1);
  dataTemp.setDate(0);
  return dataTemp;
}


/**
 * Retorna um array com um ou mais elementos,
 * chamados a partir do id, nome ou do próprio objecto
**/
function $() {
     var elements = new Array();
     for (var i = 0; i < arguments.length; i++) {
          var element = arguments[i];
          if (typeof element == 'string'){
                if (document.getElementById(element))
                     element = document.getElementById(element);
                else
                     element = document.getElementsByName(element)[0];
          }
          if (arguments.length == 1){
                return element;}
          elements.push(element);
     }
     return elements;
}

/**
 * Retorna o n-ésimo elemento com o nome indicado
**/
function $n(elem, pos) {
     return document.getElementsByName(elem)[pos-1];
}


     function showhide(qual,grupo)
                          {
                                 if (document.getElementById){
                                 // é DOM compativel
//                               document.getElementById(grupo).style.display = (document.getElementById(grupo).style.display == "block") ? "none" : "block";
                                  document.getElementById(grupo).style.display = (document.getElementById(grupo).style.display == "none") ? "" : "none";
                                  document.getElementById(qual).className = (document.getElementById(qual).className == "mais") ? "menos" : "mais";
                            } else {
                                 if (document.layers){
                                 // é communicator
                                 document.layers[grupo].style.visibility    = (document.layers[grupo].style.visibility  == "hide") ? "show" : "hide";
                                  qual.className= (qual.className == "mais") ? "menos" : "mais";
                                  } else {
                                     if (document.all){
                                          // é IE 4 pelo menos
                                  document.all(grupo).style.visibility  = (document.all(grupo).style.visibility == "hidden") ? "visible" : "hidden";
                                  qual.className= (qual.className == "mais") ? "menos" : "mais";
                                  }
                                }
                            }
                          }

// Adicionado agora:: Adriano

function inicializaXmlReq() {
     try {
          return new XMLHttpRequest();
     } catch (microsoft1) {
          try {
                return ActiveXObject("Msxml2.XMLHTTP");
          } catch (microsoft2) {
                try {
                     return new ActiveXObject("Microsoft.XMLHTTP");
                } catch (falhou) {
                     return false;
                }
          }
     }
}


var xmlReq = inicializaXmlReq();

function enviaPedidoAjax(url, parametros, funcActualizacao) {
    /* Se existir algum pedido configurado, cancela-o para poder fazer
        um novo. */
    if (xmlReq) {
         xmlReq.abort();
    }
    xmlReq = inicializaXmlReq(xmlReq);
    // Envia o pedido ao servidor.
    xmlReq.open("POST", url, true);
    xmlReq.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    xmlReq.send(parametros);
    xmlReq.onreadystatechange = funcActualizacao;
}

/**
 * Função principal, chamada pelo utilizador
 *
 * @param altura Parametro deprecated. Só aqui deve estar por motivos
                      de retrocompatibilidade. Se vais usar agora a função, evita-o!
**/
function abreFloatDiv(nomeCampoData, funcao, classe, altura)
{
     // Se houver um timer associado a timerID, elimina-o.
     try {
          clearTimeout(timerID);
     }
     catch(e) {}
     try {
          clearTimeout(timerIDHide);
     }
     catch(e) {}
     // Se houver pedidos pendentes, elimina-os.
     if (xmlReq) {
          xmlReq.abort();
     }
     var campoDestino = document.getElementsByName (nomeCampoData).item(0);
     var posX = campoDestino.offsetLeft;
     var posY = campoDestino.offsetTop + campoDestino.offsetHeight;
     /*var idDiv = (idDivT ? idDivT : 'floatDiv');*/
     // Posiciona o calendário quando o form se encontra dentro de um tabela
     var campoPai = campoDestino;
     while (campoPai.offsetParent) {
          campoPai = campoPai.offsetParent;
          posX += campoPai.offsetLeft;
          posY += campoPai.offsetTop;
     }

     desenhaFloatDiv(campoDestino, posX, posY, funcao, classe);
}

/**
 * Coloca uma div na página
**/
function desenhaFloatDiv(campoDestino, posX, posY, funcao, classe, altura)
{
     var dt = campoDestino.value;
     // Cria um DIV que vai conter o calendário
     if (!document.getElementById(floatDiv)) {
          var novoNo = document.createElement("div");
          novoNo.setAttribute("id", floatDiv);
          novoNo.className = "brancob";       // Não usar setAttribute. Mais um bug do IE...
          novoNo.setAttribute("style", "visibility: hidden;");
          document.body.appendChild(novoNo);
     }

     // Posiciona o DIV
     var pickerDiv = document.getElementById(floatDiv);
     pickerDiv.style.position = "absolute";
     pickerDiv.style.left = posX + "px";
     pickerDiv.style.top = posY + "px";
     //pickerDiv.setAttribute("style", "min-width: " + 150 + "px;");
     pickerDiv.className = classe;
     pickerDiv.style.visibility = (pickerDiv.style.visibility == "visible" ? (campoAntigo==campoDestino ? "hidden" : "visible") : "visible");
     pickerDiv.style.display = (pickerDiv.style.display == "block" ? (campoAntigo==campoDestino ? "none" : "block") : "block");
     pickerDiv.style.zIndex = 1000;
     campoAntigo = campoDestino;

     // Chamada para o procedimento dinâmico invocado
     if(funcao) {
          html = eval(funcao);
          document.getElementById(floatDiv).innerHTML = html;
     }
}

/**
 * Esconde a div
**/
function hideDiv() {
     var floatDivT = document.getElementById(floatDiv);
     if(floatDivT) {
          floatDivT.style.visibility = "hidden";
          floatDivT.style.display = "none";
          campoAntigo = '';
          floatDivT.innerHTML = '';
     }
}

/**
 * Esconde a div após uma quantidade definida de tempo (ms)
**/
function hideDivT(tempo) {
     timerIDHide=setTimeout('hideDiv();', tempo);
}

/**
 *
**/
function refreshFloatDiv() {
     var html = "<p>";
     html += "</p>";
     return html;
}

/**
 * Faz o pedido ao servidor
**/
function enviaPedidoDiv(url, parametros, funcActualizacao) {
     enviaPedidoAjax(url, parametros, funcActualizacao);
}

/**
 * Gere cada pedido a fazer ao servidor
**/
function getConteudoDivSug(evento, tempo, url, aceitaCampo, tag, campoID, nomeCampo, classe, altura) {
    var keyCode = evento.keyCode;
    nomeTagSel = tag;
    verificaDivAberta(nomeCampo, classe, altura);
    if(keyCode==40 || keyCode==38) {
          activaLinha(indiceSelect+(keyCode==40?1:elementosDiv.length-1));
          indiceSelect+=(keyCode==40?1:elementosDiv.length-1);
          return true;
    }
    if(keyCode == 13 || keyCode == 9) {
     return true;
    }
    document.getElementById(campoID).value='';
    indiceSelect=-1;
    // Limpa o timer se este estiver activo
    if(timerID) {
         clearTimeout(timerID);
    }
    /* Com o aceita campo, pode enviar-se na função um teste lógico
        de preenchimento do campo de origem, como parametro. */
    if(aceitaCampo) {
     // Se for enviado um tempo x, o pedido só deve ser feito após x ms.
     if (tempo > 0) {
          timerID=setTimeout('enviaPedidoDiv("'+url+'", "", actualizaDiv);', tempo);
     }
     // Se o tempo for 0, então o pedido é feito imediatamente.
     else {
          enviaPedidoDiv(url, "", actualizaDiv);
     }
    }
}

/**
 * Gere a saida da caixa de sugestoes se for detectacta pressao nas teclas [enter] ou [tab]
**/
function trataSeleccaoTeclado(evento) {
     var keyCode = evento.keyCode;
     if(keyCode == 13 || keyCode == 9) {
          if(indiceSelect!=-1) {
                elementosDiv[Math.abs(indiceSelect%elementosDiv.length)].onclick();
          }
          else {
                if (elementosDiv.length==1)
                     elementosDiv[0].onclick();
          }
     }
}

/**
 * Activa uma determinada linha, desactivando a anteriormente activada
**/
function activaLinha(indiceNova) {
     try {
          var old;
          try {
                old = elementosDiv[Math.abs(indiceSelect%elementosDiv.length)].classNameOld;
          } catch(e) {}
          elementosDiv[Math.abs(indiceSelect%elementosDiv.length)].className=old;
     } catch (e) {}
     elementosDiv[Math.abs(indiceNova%elementosDiv.length)].classNameOld=elementosDiv[Math.abs(indiceNova%elementosDiv.length)].className;
     elementosDiv[Math.abs(indiceNova%elementosDiv.length)].className="lovlistaitemselec";
     return false;
}

/**
 * Gere a linha seleccionada de acordo com a deteccao do rato sobre uma linha
**/
function detectaRatoLista(e) {
     var elementoEventoID = (this.posicao?this.posicao:(e.srcElement?e.srcElement.posicao:(e.target?e.target.posicao:"")));
     activaLinha(elementoEventoID-1);
     indiceSelect = elementoEventoID-1;
}

/**
 * Recebe a resposta do servidor, actualizando a div
**/
function actualizaDiv() {
    if (xmlReq.readyState == 4) {
     try {
          if (xmlReq.status == 200) {
                var resp = xmlReq.responseText.replace("\n","");
                if (resp == "") {
                     document.getElementById(floatDiv).innerHTML = "Não existem moradas correspondentes aos valores introduzidos.";
                } else {
                     document.getElementById(floatDiv).innerHTML = resp;
                     elementosDiv = document.getElementById(floatDiv).getElementsByTagName(nomeTagSel);

                     for (var i = 0; i < elementosDiv.length; i++) {
                          if(elementosDiv[i].addEventListener) {
                                elementosDiv[i].addEventListener('mouseover',detectaRatoLista,false);
                          }
                          if(elementosDiv[i].attachEvent) {
                                elementosDiv[i].attachEvent('onmouseover',detectaRatoLista);
                          }
                          elementosDiv[i].posicao=i+1;
                     }
                }
          }
     }
     catch(e) {
          xmlReq.abort();
          xmlReq = inicializaXmlReq(xmlReq);
     }
    }
}

function verificaDivAberta(nomeCampo, classe, altura) {
     var pickerDiv = document.getElementById(floatDiv);
     try {
          if(pickerDiv.style.visibility != "visible" || pickerDiv.style.display != "block")
                abreFloatDiv(nomeCampo, '', classe, altura);
     } catch(e) {
          abreFloatDiv(nomeCampo, '', classe, altura);
     }
}

function AddToFavorites()
{
     var title = document.title; var url = location.href;
     if (window.sidebar){ // Firefox
          window.sidebar.addPanel(title, url, '');
      }
     else if(window.opera && window.print) // Opera
     {
          var elem = document.createElement('a');
          elem.setAttribute('href',url);
          elem.setAttribute('title',title);
          elem.setAttribute('rel','sidebar'); // required to work in opera 7+
          elem.click();
     }
     else if(document.all) // IE
          window.external.AddFavorite(url, title);
}

contadorAjuda=0;
imgHtmlLoadAjuda='<img src="imagens/loading_ajax" alt="A Carregar..." title="A Carregar..." class="border0">';

function getAjudaContexto(elem, procedimento){
elemento = $(elem);
contadorAjuda++;
divAjuda =$('<div class="ajudaContextual">'+imgHtmlLoadAjuda+'</div>');
divAjuda.attr("id","ajuda_"+contadorAjuda);
elemento.prev().prev().before(divAjuda);
elemento.setAttribute("onclick","ajudaContextoToggle("+contadorAjuda+")");
divAjuda.ajaxError(function (event, XMLHttpRequest, ajaxOptions, thrownError) {
   $("div#ajuda_"+contadorAjuda).next().next().attr("onclick","getAjudaContexto(this,'"+procedimento+"')");
  $("div#ajuda_"+contadorAjuda).remove();
});
divAjuda.load(procedimento);
}
function ajudaContextoToggle(ajudaid){
$("div#ajuda_"+ajudaid).toggle();
}
