
	//esta funcao apenas faz um back, porem, deve ser chamada dentro do
	//onClick.
	function Voltar(piDistance)
	{
		event.cancelBubble = true;
		event.returnValue = false;
		self.history.go(piDistance);
	}

	function JustChars(psValidChars)
	{
		event.cancelBubble = true;
		event.returnValue = (psValidChars.indexOf(String.fromCharCode(event.keyCode)) >= 0);
		return event.returnValue;
	}
	//esta funcao abre uma janela com os parametros especificados, posicionando
	//a janela no centro da tela ou da janela que a abriu
	function myWindowOpen (pWindow, pScreenCenter, pURL, pName, pWidth, pHeight, pOptions)
	{
		var iLeft, iTop, sTemp;

		sTemp = 'width=' + pWidth + ', height=' + pHeight;

		if (pScreenCenter == 1)
		{
			iLeft = parseInt((screen.availWidth - pWidth) / 2);
			iTop = parseInt((screen.availHeight - pHeight) / 2);
			sTemp += ', left=' + iLeft + ', top=' + iTop;
		}

		if (pOptions.length > 0)
			sTemp += ',';

		pWindow.open (pURL, pName, (sTemp + pOptions));
	}

	//esta funcao busca por uma string dentro de outra e a troca
	//pela string determinada
	function myReplace(psString, psSearch, psReplacement)
	{
		var sTemp, i;

		sTemp = psString;

		//enquanto houver a string procurada
		i = psString.indexOf(psSearch);
		while (i >= 0)
		{
			if ((i == 0) && (i + psSearch.length <= sTemp.length))
			{
				sTemp = psReplacement + sTemp.substring((i + psSearch.length), sTemp.length);
			}

			if ((i > 0) && (i + psSearch.length <= sTemp.length))
			{
				sTemp = sTemp.substring(0, i) + psReplacement + sTemp.substring((i + psSearch.length), sTemp.length);
			}

			i = sTemp.indexOf(psSearch);
		}

		return sTemp;
	}

	//esta funcao verifica se o campo poField contem uma data valida.
	//-se pbAcceptYY for verdadeiro, a funcao verifica a data apenas com 2 digitos.
	// Se o usuario preencher o ano com 4 digitos, a funcao valida tambem;
	//-se pbChangeFieldValue for verdadeiro, entao a funcao troca o conteudo do
	// campo com a data formatada, senao, apenas valida a data;
	//-se pbOnErrorSetFocus for verdadeiro, caso a data nao seja valida, o campo
	// recebera o foco novamente;
	//-se pbOnErrorAlert for verdadeira, caso a data nao seja valida, uma mensagem
	// eh exibida informando o erro. Para isso utiliza o atributo "title" do campo.
	//-se pbTodayMinimum for verdadeiro, entao a data so sera valida se for maior
	// ou igual a data atual;
	//Funciona em qualquer lugar.
	function DateValid(poField, pbAcceptYY, pbChangeFieldValue, pbOnErrorSetFocus, pbOnErrorAlert, pbTodayMinimum,pStat)
	{
		var sTemp, sTemp2, bReturn, i, bOk, bTest, dTemp, dNow;
		var iYear, iMonth, iDay;

		bReturn = false;

		//se o campo estiver vazio e nao houver tecla pressionada, ou seja, a
		//funcao foi chamada por uma outra funcao de um evento onClick, por exemplo,
		//nao ha o que verificar.
		if ((poField.value.length === 0) && (event.keyCode === 0)) return true;

		//se ja atingi o limite de tamanho do campo, troco o caractere para 0 de
		//modo que nao seja incluido mais nenhuma letra.
		if (poField.value.length === poField.maxLength) event.keyCode = 0;

		//verifico se o caractere eh valido
		if ((event.keyCode !== 0) && (!(JustChars('0123456789/')))) return false;

		//agora, cancelo o evento do click pois ja o tranto internamente.
		//a funcao JustChars faz isso tambem, entao tenho de fazer o cancelamento
		//depois dela.
		event.cancelBubble = true;
		event.returnValue = false;

		//obtenho o que ja existe no campo e adiciono o caratere novo
		if (event.keyCode !== 0)
			sTemp = myReplace(poField.value + String.fromCharCode(event.keyCode), '/', '');
		else
			sTemp = myReplace(poField.value, '/', '');

		//descubro se devo ou nao fazer os testes
		//se o ano nao comecar com 19 ou 20, faco a alteracao, senao,
		//acredito que o usuario esta digitando o ano com 4 digitos
		bTest =
			(
				(sTemp.length === 8) ||
				(
					(sTemp.length === 6) &&
					(pbAcceptYY) &&
					('|19|20|'.indexOf(sTemp.substr(4, 2)) < 0)
				)
			);

		if (bTest)
		{
			//como a funcao Date espera os meses e os dias comecando em 0, subtraio 1
			//dTemp = new Date(sTemp.substr(4, 4), (sTemp.substr(2, 2) - 1), (sTemp.substr(0, 2) - 1));

			//se aceito anos com 2 digitos, entao verifico se tenho de completar.

			//if implementado por RJSJ dia 27/09/2002 para brecar quem
			//digita o ano com 2 digitos

			if ((pbAcceptYY) && (sTemp.length === 6))
			{
				alert('O campo ANO deve ser com 4 Digitos');
				return false;
			}

			if ((pbAcceptYY) && (sTemp.length === 6))
			{
				if (parseInt(parseFloat(sTemp.substr(4, 2))) < 50)
					iYear = parseInt('20' + sTemp.substr(4, 2));
				else
					iYear = parseInt('19' + sTemp.substr(4, 2));
			}
			//senao, apenas atribuo o ano
			else
			{
				iYear = parseInt(parseFloat(sTemp.substr(4, 4)));
			}
			iMonth = parseInt(parseFloat(sTemp.substr(2, 2)));
			iDay = parseInt(parseFloat(sTemp.substr(0, 2)));

			//verifico o mes
			bOk = ((iMonth >= 1) && (iMonth <= 12));


			//verifico o dia
			bOk = ((bOk) && (iDay >= 1) && (iDay <= 31));

			//verifico o ano
			if (pStat == "N")
				{
					bOk = ((bOk) && (iYear >= 1900) && (iYear < 2002));
				}
			else
				{
					bOk = ((bOk) && (iYear >= 1900) && (iYear <= 2050));
				}


			//agora verifico o dia de acordo com o mes
			if (bOk)
			{
				//neste case, testo apenas os meses que tem de ter dias menores do que
				//31, que ja foi consistido.
				switch (iMonth)
				{
					case  2://feb
						//verifico se o ano eh bissexto. Para tal, o ano tem de ser:
						// - divisivel por 4
						// - nao divisivel por 100
						// - divisivel por 400
						if (((iYear % 4) === 0) && (((iYear % 100) !== 0) || ((iYear % 400) === 0)))
							bOk = (iDay <= 29);
						else
							bOk = (iDay <= 28);
						break;
					case  4://apr
					case  6://jun
					case  9://sep
					case 11://nov
						bOk = (iDay <= 30);
						break;
					/*
					case  1://jan
					case  3://mar
					case  5://may
					case  7://jul
					case  8://aug
					case 10://oct
					case 12://dec
					*/
				}

				//se a data eh valida, entao so falta verificar se ela eh maior ou igual
				//a data atual

				if ((bOk) && (!pbTodayMinimum))
				{
					dTemp = new Date(iYear, (iMonth - 1), iDay);

					dNow = new Date();
					dNow = new Date(dNow.getFullYear(), dNow.getMonth(), dNow.getDate());

					bOk = (dTemp >= dNow);

					//if implementado por RJSJ em 11/10/02 para consistir
					//o campo de data de admissao, que não pode ser maior que hoje,
					//se for, ele da a mensagem de data inválida
					if (pStat == "A")
					{
						bOk = (dTemp <= dNow);
					}

				}

			}
		}

		//verifico se devo fazer a atualizacao do valor do campo
		if (pbChangeFieldValue)
		{
			//pego a string de numeros e faco a formatacao em data para devolver
			//ao campo
			sTemp2 = '';
			for (i = 0; i < sTemp.length; i++)
			{
				sTemp2 += sTemp.charAt(i);
				if ((i === 1) || (i === 3))
					sTemp2 += '/';
			}

			poField.value = sTemp2;
		}

		if (bTest)
		{
			if (!(bOk))
			{
				if (pbOnErrorAlert)
					alert('A data "' + poField.value + '" fornecida no campo "' + poField.title + '" não é uma data válida ou não é permitida para este campo.');
				if (pbOnErrorSetFocus)
					poField.focus();
			}
			else
				bReturn = true;
		}

		return bReturn;
	}

	//esta funcao verifica se o periodo fornecido eh valido, ou seja, se a data
	//inicial eh menor ou igual a data final. Para isso, tenho de testar os dois
	//campos e depois comparalos.
	//-se poFieldB ou poFieldE for nulo, entao apenas verifico se a data do
	// campo nao nulo eh valida. se os dois campos forem nao nulos, faco a
	// validacao do periodo;
	//-se pbAcceptYY for verdadeiro, a funcao verifica a data apenas com 2 digitos.
	// Se o usuario preencher o ano com 4 digitos, a funcao valida tambem;
	//-se pbOnErrorSetFocus for verdadeiro, caso a data nao seja valida, o campo
	// recebera o foco novamente;
	//-se pbOnErrorAlert for verdadeira, caso a data nao seja valida, uma mensagem
	// eh exibida informando o erro. Para isso utiliza o atributo "title" do campo.
	//Funciona em qualquer lugar.
	function PeriodValid(poFieldB, poFieldE, pbAcceptYY, pbOnErrorSetFocus, pbOnErrorAlert)
	{
		var dBegin, dEnd;
		var bReturn, bBegin, bEnd;

		bReturn = false;
		bBegin = false;
		bEnd = false;

		//troco o numero da tecla para cancelar qualquer adicao pelas funcoes
		event.keyCode = 0;

		//se o campo de inicio for nao nulo entao verifico-o
		if (poFieldB !== null)
		{
			if (poFieldB.value.length > 0)
			{
				//verifico se o campo tem uma data valida.
				bBegin = DateValid(poFieldB, pbAcceptYY, false, false, false, false);
				if (!(bBegin)) return false;
			}
			else
			{
				return true;
			}
		}

		//se o campo de fim for nao nulo entao verifico-o
		if (poFieldE !== null)
		{
			if (poFieldE.value.length > 0)
			{
				//verifico se o campo tem uma data valida
				bEnd = DateValid(poFieldE, pbAcceptYY, false, false, false, false);
				if (!(bEnd)) return false;
			}
			else
			{
				return true;
			}
		}

		//se os dois campos estao validos, entao verifico se as datas formam um
		//periodo
		if ((bBegin) && (bEnd))
		{
			if (toDate(poFieldB.value) > toDate(poFieldE.value))
			{
				//verifico se tenho de mostrar a mensagem de alerta
				if (pbOnErrorAlert)
				{
					alert('O período informado nos campos "' +
						poFieldB.title + '" e "' + poFieldE.title + '" ' +
						'é inválido.\nA data inicial do período não pode ser maior do ' +
						'que a data final do período.');
				}

				//verifico se tenho de voltar o foco para o campo
				if (pbOnErrorSetFocus)
				{
					poFieldB.focus();
				}

				return false;
			}
			else
			{
				return true;
			}
		}

		return false;
	}

	//esta fucao pega uma string no formato 'dd/mm/yy' ou 'dd/mm/yyyy' e converte
	//para data
	function toDate(psDate)
	{
		var iYear, iMonth, iDay;
		var sTemp, dTemp;

		//retiro todas as barras
		sTemp = myReplace(psDate, '/', '');

		//se nao tenho 6 ou 8 digitos, nao pode ser uma data
		if ((sTemp.length !== 6) && (sTemp.length !== 8)) return null;

		//obtenho o numero do ano, mes e dia
		if (sTemp.length === 6)
		{
			iYear = parseInt(parseFloat(sTemp.substr(4, 2)));
			if (iYear < 50)
				iYear += 2000;
			else
				iYear += 1900;
		}
		else
		{
			iYear = parseInt(parseFloat(sTemp.substr(4, 4)));
		}
		iMonth = parseInt(parseFloat(sTemp.substr(2, 2)));
		iDay = parseInt(parseFloat(sTemp.substr(0, 2)));

		//crio as duas datas
		dTemp = new Date(iYear, (iMonth - 1), iDay);

		return dTemp;

	}

	//esta funcao apenas simplifica a utilizacao das funcoes de data para
	//fazer a validacao de um periodo. Esta funcao chama as funcoes DateValid
	//e PeriodValid, que utilizam os atributos maxlength e title dos inputs.
	//-poField: campo que esta sendo editado
	//-poFieldB: campo inicial do periodo
	//-poFieldE: campo final do periodo
	function PeriodValidSimple(poField, poFieldB, poFieldE,pStat)
	{
		var bReturn;

		bReturn = false;

		if (DateValid(poField, true, true, true, true, false))
			if (PeriodValid(poFieldB, poFieldE, true, true, true))
				bReturn = true;

		return bReturn;
	}

	//funcao que valida as datas - inicio, necessário na página usar
	// <body onKeyDown="cancelRefresh();">

	function cancelRefresh()
	{
			// Cancela a funcao F5
			if (window.event && window.event.keyCode == 116)
			{
				window.event.keyCode = 8;
			}

		// Cancela o BackSpace
		//if (window.event && window.event.keyCode == 8)
		//{
		//	window.event.cancelBubble = true;
		//	window.event.returnValue = false;
		//return false;
		//}
	}

	function ValiDate(pDate)
	{
		var iMes;
		var iAno;
		var dNow;
		var YearNow;
		var MonthNow;

		dNow = new Date()
		YearNow = dNow.getFullYear();
		MonthNow = dNow.getMonth();

		iMes = pDate.substring(0,2);
		iAno = pDate.substring(3,7);

		if ((iMes >= 1) && (iMes <= 12))
		{
			bMes = true;
		}
		else
		{
			alert('Mes inválido');
			document.frmMain.cClieDesd.focus();
		}

		if ((iAno >= 1950) && (iAno <= 2020))
		{
			bAno = true;
		}
		else
		{
			alert('Ano inválido');
			document.frmMain.cClieDesd.focus();
		}

		return true;

	}
	
	function JustCharsEx(psValidChars)
	{
		var k  = event.keyCode;
		var vk = ((k==1) || (k==231) || (k==2) || (k==58) || (k==13))?false:true;
		if ((k==8) || (k==9) || (k==37) || (k==38) || (k==39) || (k==40) || (k==46) || (k==35) || (k==36) || ((k>=96) && (k<=105)))
			event.returnValue	= true;
		else
			event.returnValue	= (vk)?(psValidChars.indexOf(String.fromCharCode(k)) >= 0):0;
		
		event.cancelBubble 	= true;		
		return event.returnValue;						
	}
	
	function getWindowHeight() {
		  var ie4 = (document.all!=null)
		  var ie4Mac = ie4 && navigator.platform.indexOf("Mac")>=0
		  var ns4 = (document.layers!=null)

		 // Initialize Properties
		    var clientHeight = clientWidth = docHeight = docWidth = 0
		    // Initialize browser differences
		    if (ie4) {
		      clientHeight = document.body.clientHeight
		      clientWidth = document.body.clientWidth
		      docTop = document.body.scrollTop
		      docLeft = document.body.scrollLeft
		      document.height = ie4Mac ? document.body.offsetHeight : document.body.scrollHeight
		    } else
		    {
		      // Fudge for the scrollbars
		      clientHeight = window.innerHeight -20
		      clientWidth = window.innerWidth - 20
		      docTop = window.pageYOffset      
		      docLeft = window.pageXOffset
		    }
 		   
 		    return docTop + clientHeight;
		
	}