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 = dtMaxcpAnt?dtMin:cpAnt else if (cpAnt) dtMin=cpAnt; if (dtMax&&cpSeg) dtMax = dtMax= 0) && (ano > 0)) { diaActual = new Date(ano, mes, 1); } else { dia = diaActual.getDate(); diaActual.setDate(1); } var anoActual = diaActual.getFullYear(); if (diaActual.lastDay()dataMax){ refreshCalendario(nomeCampoData,anoMax,mesMax,dia,anoMin,mesMin,diaMin,anoMax,mesMax,diaMax); return; } // Cria a tabela com o calendário var html = ""; // Ano corrente html += ""; if ( !dataMin || anoActual > dataMin.getFullYear() ) html += ""; else html += ""; html += ""; if ( !dataMax || anoActual < dataMax.getFullYear() ) html += ""; else html += ""; html += ""; // Mês corrente html += ""; if ( diaActual <= dataMin ) html += ""; else html += ""; html += ""; if ( diaActual.lastDay() >= dataMax ) html += ""; else html += ""; html += ""; // Linha com os dias da semana html += ""; for(i = 0; i < diasArrayPeq.length; i++) html += ""; html += ""; // Dias do mês html += ""; for (i = 0; i < diaActual.getDay(); i++) html += ""; do { numDia = diaActual.getDate(); if (numDia == dia) html += ""; else if ( (diaActual < dataMin) || (diaActual > dataMax) ) html += ""; else html += ""; if (diaActual.getDay() == 6) html += ""; diaActual.setDate(diaActual.getDate() + 1); } while (diaActual.getDate() > 1) if (diaActual.getDay() > 0) { for (i = 7; i > diaActual.getDay(); i--) html += ""; } html += "
" + botoesAntSeg(nomeCampoData, diaActual, -12, "<",anoMin,mesMin,diaMin,anoMax,mesMax,diaMax) + "
"; html += "
" + botoesAntSeg(nomeCampoData, diaActual, 12, ">", anoMin,mesMin,diaMin,anoMax,mesMax,diaMax) + "
" + botoesAntSeg(nomeCampoData, diaActual, -1, "<",anoMin,mesMin,diaMin,anoMax,mesMax,diaMax) + "
"; html += "
" + botoesAntSeg(nomeCampoData, diaActual, 1, ">",anoMin,mesMin,diaMin,anoMax,mesMax,diaMax) + "
" + diasArrayPeq[i] + "
"+numDia+"
"+numDia+""+numDia+"
"; // Botões para o mês actual e para fechar o calendário html += "

"; html += " "; html += ""; html += "

"; if (ret) return html; else $(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 "Seta Esquerda"; } /** * 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 = $(floatDiv); 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(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 **/ 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 floatDiv = document.getElementById(floatDiv); if(floatDiv) { floatDiv.style.visibility = "hidden"; floatDiv.style.display = "none"; campoAntigo = ''; floatDiv.innerHTML = ''; } } /** * Esconde a div após uma quantidade definida de tempo (ms) **/ function hideDivT(tempo) { timerIDHide=setTimeout('hideDiv();', tempo); } /** * **/ function refreshFloatDiv() { var html = "

"; html += "

"; 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); } }