//	Copyright 1998-2010 Ciclo Ltd. All rights reserved.

// ================================================================================
function GotejarFoto(FotoID,AlbumName,DeltaY,Duracao,Aleatorio) {
	// #####	FotoID:		[requerido]	[Texto]			ID da imagem que exibe o conjunto de imagens. ID único no documento.
	// #####	AlbumName:	[requerido]	[Texto]			Nome das imagens que formam o conjunto a ser exibido. Name iguais. Tamanhos iguais a FotoID.
	// #####	DeltaY:		[opcional]	[pixels]		Deslocamento vertical das fotos do álbum.	Padrão = 100 px
	// #####	Duracao:	[opcional]	[milisegundos]	Duração do movimento das fotos do álbum.	Padrão = 1000 ms
	// #####	Aleatorio:	[opcional]	[boolean]		Tipo de seleção das imagens: Seqüencial x Randômica.
	// #####	FPS:		[constante]	[fps]			Quadros exibidos por segundo.				Máximo = 100 fps
	
	// *****	Definir os objetos requeridos e cancelar o comando se não existirem.
	var Foto = document.getElementById(FotoID);
	if (Foto == null) return;
	var Album = document.getElementsByName(AlbumName);
	if (Album.length == 0) return;
	
	// *****	Verificar se a imagem está em movimento e cancelar o comando se constatado.
	var TimerGotejamentoID = Foto.getAttribute('TimerGotejamentoID');
	if (TimerGotejamentoID != null) return;
	
	// *****	Definir as variáveis opcionais.
	var FPS = 50;
	if (isNaN(DeltaY))  DeltaY = 100;
	if (isNaN(Duracao)) Duracao = 1000;
	
	// *****	Definir o índice da nova imagem do álbum a ser exibida.
	if (Aleatorio) {
		// *****	[ Seleção randômica ]
		i = Math.round(Math.random() * (Album.length - 1));
		if (Foto.src == Album[i].src) {
			i = i + 1;
		}
	}
	else {
		// *****	[ Seleção seqüencial ]
		for (i=0; i<Album.length-1; i++) {
			if (Foto.src == Album[i].src) break;
		}
		i = i + 1;
	}
	if (i >= Album.length) i = 0;
	
	// *****	Verificar se a nova imagem está carregada ou em cache e garantir sua exibição.
	// *****	Nota: Isto é fundamental para browsers que não carregam imagens ocultas [Opera].
	if (!Album[i].complete) {
		// *****	Recarregar ou continuar o carregamento da imagem em segundo plano.
		if (!document.NovaGota) document.NovaGota = new Image;
		if (document.NovaGota.src != Album[i].src) document.NovaGota.src = Album[i].src;
		// *****	Reiniciar esta função com um timer de curta duração, cancelando a opção Aleatorio.
		window.setTimeout("GotejarFoto('" + FotoID + "','" + AlbumName + "','" + DeltaY + "','" + Duracao + "')", 100);
		return;
	}
	
	// *****	Colocar a imagem atual como pano de fundo, para a transição com a nova imagem.
	// [Pré-requisito]	A imagem precisa estar posicionada no centro de uma célula ou DIV ou equivalente.
	Foto.offsetParent.style.backgroundImage = "url('" + Foto.src + "')";
	Foto.offsetParent.style.backgroundRepeat = "no-repeat";
	Foto.offsetParent.style.backgroundPosition = "center center";
//	Foto.offsetParent.style.backgroundPosition = Foto.offsetLeft + "px " + Foto.offsetTop + "px";
	
	// *****	Definir a posição de partida e chegada da nova imagem e criar uma referência de movimentação.
	var TopoFinal = 0;
//	var TopoFinal = Foto.offsetTop;
	var TopoInicial = TopoFinal - DeltaY;
	Foto.style.top = TopoInicial + "px";
	Foto.setAttribute('PosicaoGotejamento',0);
	
	// *****	Exibir a nova imagem e definir suas propriedades
	Foto.src = Album[i].src;
	if (Album[i].alt != "") Foto.alt = Album[i].alt;
	if (Album[i].title != "") Foto.title = Album[i].title;
	
	// *****	Vincular o ID do timer à imagem e iniciar a animação.
	TimerGotejamentoID = window.setInterval("AnimarGotejamento('" + FotoID + "','" + TopoInicial + "','" + TopoFinal + "','" + 1/(FPS*Duracao/1000) + "')", 1000/FPS);
	Foto.setAttribute('TimerGotejamentoID',TimerGotejamentoID);
}
// ================================================================================

// ================================================================================
function AnimarGotejamento(FotoID,TopoInicial,TopoFinal,Incremento) {
	// *****	PRÉ-REQUISITOS:
	//			1) Foto existe.
	//			2) Foto teve o atributo "TimerGotejamentoID" previamente criado/setado.
	//			3) Foto teve o atributo "PosicaoGotejamento" previamente criado/setado.
	//			4) Movimento = Senoidal com variação angular de 0 a 120°.
	//			5) PosicaoGotejamento = ângulo de referência.
	var Foto = document.getElementById(FotoID);
	var Angulo = Foto.getAttribute('PosicaoGotejamento');
	
	// *****	Incrementar percentualmente o ângulo de referência e Mover a foto
	Angulo = parseFloat(Angulo) + Incremento * 120;
	Angulo = Math.round(Angulo * 1000) / 1000;
	if (Angulo > 120) Angulo = 120;
	var Topo =  Math.round((TopoInicial * 1) + (TopoFinal - TopoInicial) * (Math.sin(Angulo * Math.PI / 180) / Math.sin(120 * Math.PI / 180)));
	Foto.setAttribute('PosicaoGotejamento',Angulo);
	Foto.style.top = Topo + "px";
	
	// *****	Terminar a animação
	if (Angulo >= 120) {
		// *****	Garantir o posicionamento final da Foto.
		Foto.style.top = TopoFinal + "px";
		// *****	Deletar o timer que dispara esta função.
		var TimerGotejamentoID = Foto.getAttribute('TimerGotejamentoID');
		window.clearInterval(TimerGotejamentoID);
		Foto.removeAttribute('TimerGotejamentoID');
	}
}
// ================================================================================

// ================================================================================
function TrocarFoto(FotoID,AlbumName,Duracao,Aleatorio) {
	// #####	FotoID:		[requerido]	[Texto]			ID da imagem que exibe o conjunto de imagens. ID único no documento.
	// #####	AlbumName:	[requerido]	[Texto]			Nome das imagens que formam o conjunto a ser exibido. Name iguais. Tamanhos iguais a FotoID.
	// #####	Duracao:	[opcional]	[milisegundos]	Tempo de transição entre as fotos do álbum. Mínimo = 10 ms.
	// #####	Aleatorio:	[opcional]	[boolean]		Tipo de seleção das imagens: Seqüencial x Randômica.
	
	// *****	Definir os objetos requeridos e cancelar o comando se não existirem.
	var Foto = document.getElementById(FotoID);
	if (Foto == null) return;
	var Album = document.getElementsByName(AlbumName);
	if (Album.length == 0) return;
	
	// *****	Verificar a quantidade de imagens do álbum que já estão carregadas ou em cache.
	var Carga = 0;
	for (i=0; i<Album.length; i++) {
		if (Album[i].complete) {
			// *****	Contabilizar a imagem que já está carregada.
			Carga = Carga + 1;
		}
		else {
			// *****	Recarregar ou continuar o carregamento da imagem em segundo plano.
			// *****	Nota: Isto é fundamental para browsers que não carregam imagens ocultas [Opera].
			if (!document.NovoAlbum) document.NovoAlbum = new Array();
			var n = 0;
			if (document.NovoAlbum.length) n = document.NovoAlbum.length;
			var IsNovo = true;
			if (n > 0) {
				for (j=0; j<n; j++) {
					if (document.NovoAlbum[j].src == Album[i].src) IsNovo = false;
				}
			}
			if (IsNovo) {
				document.NovoAlbum[n] = new Image;
				document.NovoAlbum[n].src = Album[i].src;
			}
		}
	}
	
	// *****	Exibir a porcentagem de imagens do álbum que já estão carregadas ou em cache.
	// *****	[Pré-requisito] O ID do objeto rotulador deve ser único e ter a seguinte formatação:
	var Rotulo = document.getElementById("qtd_" + FotoID);
	if (Carga < Album.length) {
		// *****	Exibir ou Atualizar o objeto rotulador que mostra a porcentagem de imagens carregadas.
		if (Rotulo != null) {
			Rotulo.innerHTML = Math.round(Carga * 100 / Album.length) + "%";
			Rotulo.title = Foto.title;
			Rotulo.style.display = "";
		}
		// *****	Reiniciar esta função com um timer de curta duração para:
		//			1) atualizar o objeto rotulador.
		//			2) iniciar a transição da imagem assim que o carregamento do álbum se completar.
		window.setTimeout("TrocarFoto('" + FotoID + "','" + AlbumName + "','" + Duracao + "','" + Aleatorio + "')", 100);
		return;
	}
	else {
		// *****	Ocultar o objeto rotulador ao completar o carregamento do álbum.
		if (Rotulo != null) {
			if (Rotulo.style.display != "none") {
				Rotulo.innerHTML = "";
				Rotulo.title = "";
				Rotulo.style.display = "none";
			}
		}
	}
	
	// *****	Definir o índice da imagem do álbum a ser exibida.
	if (Aleatorio) {
		// *****	[ Seleção randômica ]
		i = Math.round(Math.random() * (Album.length - 1));
		if (Foto.src == Album[i].src) {
			i = i + 1;
		}
	}
	else {
		// *****	[ Seleção seqüencial ]
		for (i=0; i<Album.length-1; i++) {
			if (Foto.src == Album[i].src) break;
		}
		i = i + 1;
	}
	if (i >= Album.length) i = 0;
	
	// *****	Exibir a nova imagem com efeitos de transição, de acordo com o suporte do browser.
	if (Foto.filters && Duracao >= 10) {
		Foto.style.filter = "blendTrans(duration=3)";
		Foto.filters.blendTrans.duration = Duracao / 1000;
		Foto.filters.blendTrans.apply();
		Foto.src = Album[i].src;
		Foto.filters.blendTrans.play();
	}
	else {
		if (Foto.style.opacity != null && Duracao >= 10) {
			// [Pré-requisito]	A foto precisa estar posicionada no centro de uma célula ou DIV ou equivalente.
			// *****	Colocar a foto atual como pano de fundo, para a transição com a nova foto.
			Foto.offsetParent.style.backgroundImage = "url('" + Foto.src + "')";
			Foto.offsetParent.style.backgroundRepeat = "no-repeat";
			Foto.offsetParent.style.backgroundPosition = "center center";
			// *****	Fazer a foto transparente e assumir a nova imagem.
			Foto.style.opacity = 0;
			Foto.src = Album[i].src;
			// *****	Deletar o timer da opacidade vinculado à imagem, que tenha sido criado anteriormente e que ainda esteja ativo.
			var TimerOpacidadeID = Foto.getAttribute('TimerOpacidadeID');
			window.clearInterval(TimerOpacidadeID);
			// *****	Criar um timer para a opacidade da imagem.
			var Intervalo = 10;				// Valor mínimo = 10 ms ou 100 fps (quadros por segundo)
			var Incremento = 1;				// Valor mínimo = 1% ou 1 ponto percentual
			if (Duracao > Intervalo * 100 / Incremento) {
				Intervalo = Duracao * Incremento / 100;
			}
			else {
				Incremento = Intervalo * 100 / Duracao;
			}
			TimerOpacidadeID = window.setInterval("IncrementarOpacidade('" + FotoID + "','" + Incremento + "')", Intervalo);
			// *****	Vincular o ID do timer à imagem. O atributo é criado na primeira troca.
			Foto.setAttribute('TimerOpacidadeID',TimerOpacidadeID);
		}
		else {
			Foto.src = Album[i].src;
		}
	}
	
	// *****	Transferir outras propriedades da imagem do álbum
	if (Album[i].alt != "") Foto.alt = Album[i].alt;
	if (Album[i].title != "") Foto.title = Album[i].title;
}
// ================================================================================

// ================================================================================
function IncrementarOpacidade(FotoID,Incremento) {
	// *****	PRÉ-REQUISITOS:
	//			1) Foto existe.
	//			2) Incremento > 0.
	//			3) Foto suporta a propriedade "style.opacity".
	//			4) Foto teve o atributo "TimerOpacidadeID" previamente criado/setado.
	var Foto = document.getElementById(FotoID);
	var op = Foto.style.opacity * 100;
	// *****	Incrementar a opacidade
	op = op + (Incremento * 1);
	if (op >= 100) {
		op = 100;
		// *****	Deletar o timer que dispara esta função.
		var TimerOpacidadeID = Foto.getAttribute('TimerOpacidadeID');
		window.clearInterval(TimerOpacidadeID);
	}
	Foto.style.opacity = op / 100;
}
// ================================================================================

// ================================================================================
function ExibirMenu(MenuVerticalID,MenuPaiID,event) {
	// *****	Definir os objetos requeridos e cancelar o comando se não existirem.
	var MenuVertical = document.getElementById(MenuVerticalID);
	if (MenuVertical == null) return;
	var MenuPai = document.getElementById(MenuPaiID);
	if (MenuPai == null) return;
	var Objeto = event.srcElement;						// Objeto que ocasionou o evento	[ IE ]
	if (!Objeto) Objeto = event.target;					// Objeto que ocasionou o evento	[ W3C ]
	if (!Objeto) return;
	
	// *****	Determinar a condição inicial de visualização desejada para o MenuVertical
	var DeveExibir = false;
	
	// *****	Alterar a condição de visualização se o objeto que causou o evento pertencer ao MenuVertical
	var Filhos = MenuVertical.getElementsByTagName(Objeto.tagName);
	for (n=0; n<Filhos.length; n++) {
		if (Filhos[n] == Objeto) {
			DeveExibir = true;
		}
	}
	
	// *****	Alterar a condição de visualização se o objeto que causou o evento pertencer ao MenuPai
	Filhos = MenuPai.getElementsByTagName(Objeto.tagName);
	for (n=0; n<Filhos.length; n++) {
		if (Filhos[n] == Objeto) {
			DeveExibir = true;
		}
	}
	
	// *****	Cancelar o comando se o MenuVertical já estiver na condição desejada
	if (DeveExibir == false && MenuVertical.style.display == "none") return;
	if (DeveExibir == true && MenuVertical.style.display == "") return;
	
	// *****	Assumir a condição desejada = OCULTO
	if (DeveExibir == false) {
		MenuVertical.style.display = "none";
		return;
	}
	
	// *****	Assumir a condição desejada = VISÍVEL
	// *****	1) Posicionar o MenuVertical
	Objeto = MenuPai;
	var Esquerda = Objeto.offsetWidth - MenuVertical.width;
	var Topo = Objeto.offsetHeight - 5;
	while (Objeto.tagName != "BODY") {
		Esquerda = Esquerda + Objeto.offsetLeft;
		Topo = Topo + Objeto.offsetTop;
		// *****	Cancelar o comando se o objeto pai não puder ser definido
		if (!Objeto.offsetParent) return;
		Objeto = Objeto.offsetParent;
	}
	// *****	1.1) Ajustar Esquerda para evitar erro de posicionamento do menu = 1/2 pixel. [WORKAROUND provisório para IE8 em páginas sem a declaração !DOCTYPE]
//	if (navigator.userAgent.toLowerCase().indexOf('msie 8') != -1) {
//		var cw = document.body.clientWidth;
//		if ((cw > 760) && (cw - (2 * Math.floor(cw / 2)) > 0)) {
//			Esquerda = Esquerda - 1
//		}
//	}
	MenuVertical.style.position = "absolute";
	MenuVertical.style.left = Esquerda + "px";
	MenuVertical.style.top = Topo + "px";
	
	// *****	2) Exibir o MenuVertical
	if (MenuVertical.filters) {
		MenuVertical.style.filter = "revealTrans(duration=0.2, transition=5)";		// Filtro
		MenuVertical.filters.revealTrans.apply();					// Filtro
		MenuVertical.style.display = "";
		MenuVertical.filters.revealTrans.play();					// Filtro
	}
	else {
		MenuVertical.style.display = "";
	}
}
// ================================================================================

// ================================================================================
function HabilitarForm() {
	var Formulario = document.forms[0];			// Primeiro formulário da página
	var Objeto;									// Elementos do formulário
	
	// *****	Excluir eventual identificação de formulário sendo enviado
	Formulario.style.backgroundImage = "none";
	Formulario.title = "";
	
	// *****	Habilitar os botões Enviar e Limpar (e demais elementos do formulário)
	for(var i=0; i<Formulario.elements.length; i++) {
		Objeto = Formulario.elements[i];
//		alert("Elemento = \t" + (i + 1) + " de " + Formulario.elements.length + "\n" + "tagName = \t" + Objeto.tagName + "\n" + "type = \t\t" + Objeto.type + "\n" + "name = \t\t" + Objeto.name + "\n" + "value = \t\t" + Objeto.value + "\n" + "disabled = \t" + Objeto.disabled);
		if (Objeto.disabled) Objeto.disabled = false;
	}
}
// ================================================================================

// ================================================================================
function ValidarForm() {
	var IsPtb = 0;								// Idioma da página = Inglês
	var Formulario = document.forms[0];			// Primeiro formulário da página
	var Objeto;									// Elementos do formulário
	var Texto;
	var Filtro;
	
	// *****	Verificar se o idioma é Português
	if (location.href.toLowerCase().search('/ptb/') != -1) IsPtb = 1;
	
	// *****	Verificar se o formulário já está sendo enviado, evitando cliques repetidos no botão [Enviar].
//	if (Formulario.title != "") {
//		alert(Formulario.title);
//		return false;
//	}
	
	// *****	Validar os campos do formulário
	for(var i=0; i<Formulario.elements.length; i++) {
		Objeto = Formulario.elements[i];
//		alert("Elemento = \t" + (i + 1) + " de " + Formulario.elements.length + "\n" + "tagName = \t" + Objeto.tagName + "\n" + "type = \t\t" + Objeto.type + "\n" + "name = \t\t" + Objeto.name + "\n" + "value = \t\t" + Objeto.value + "\n" + "disabled = \t" + Objeto.disabled);
		
		// *****	Validar campos de texto
		if (Objeto.tagName.toLowerCase() == "input" || Objeto.tagName.toLowerCase() == "textarea") {
			if (Objeto.type.toLowerCase() == "text" || Objeto.type.toLowerCase() == "textarea") {
				// *****	Eliminar caracteres desnecessários no início e no fim (espaços em branco, tabulação, parágrafo, etc.)
				Filtro = /\s/;
				Texto = Objeto.value;
				while (Filtro.test(Texto.substr(0,1))) Texto = Texto.substr(1);
				while (Filtro.test(Texto.substr(Texto.length-1,Texto.length))) Texto = Texto.substr(0,Texto.length-1);
				Objeto.value = Texto;
				
				// *****	Validar número de série de software
				if (Objeto.name == "serial") if (!IsSerial(Objeto)) return false;
				
				// *****	Validar campos obrigatórios = campos com o atributo id definido
				if (Objeto.id != "" && Objeto.value.length == 0) {
					if (IsPtb) {Texto = "Por favor, preencha todos os campos em negrito."}
						  else {Texto = "Please fill all bold field."}
					alert(Texto);
					Objeto.focus();
					return false;
				}
				
				// *****	Validar endereço de e-mail
				if (Objeto.name == "email") {
					Filtro = /^[\w]([\w]*([\.\-])?[\w])*@([\w\-]+(\.))+([a-zA-Z]{2,4})$/;
					if (!Filtro.test(Objeto.value)) {
						if (IsPtb) {Texto = "E-mail recusado.\nPor favor, digite um endereço de e-mail válido."}
							  else {Texto = "E-mail rejected.\nPlease enter a valid e-mail address."}
						alert(Texto);
						Objeto.focus();
						return false;
					}
				}
			}
		}
		
		// *****	Validar caixas de listagem obrigatórias
		if (Objeto.tagName.toLowerCase() == "select") {
			if (Objeto.id != "" && Objeto.options[Objeto.selectedIndex].value == "") {
				if (IsPtb) {Texto = "Por favor, selecione uma opção."}
					  else {Texto = "Please choose an option."}
				alert(Texto);
				Objeto.focus();
				return false;
			}
		}
	}
	
	// *****	Identificar para o usuário que o formulário está sendo enviado
	Formulario.style.backgroundImage = "url('../images/loading.gif')";
	Formulario.style.backgroundRepeat = "no-repeat";
	Formulario.style.backgroundPosition = "right bottom";
	if (IsPtb) {Texto = "Enviando dados. Por favor, aguarde..."}
		  else {Texto = "Sending data. Please wait..."}
	Formulario.title = Texto;
	
	// *****	Ativar o formulário
	Formulario.action = "http://www.ciclosoft.com/ciclosoft_form.aspx";
	Formulario.method = "post";
}
// ================================================================================

// ================================================================================
function IsSerial(Campo) {
	var IsPtb = 0;								// Idioma da página = Inglês
	var Texto = Campo.value;
	var Filtro;
	var DDD,i,j;
	
	// *****	Verificar se o idioma é Português
	if (location.href.toLowerCase().search('/ptb/') != -1) IsPtb = 1;
	
	// *****	Eliminar caracteres inválidos (espaços em branco, tabulação, parágrafo, etc.)
	Filtro = /\s/;
	while (Filtro.test(Texto)) Texto = Texto.replace(Filtro, "");
	
	// *****	Invalidar campo vazio
	if (Texto.length == 0) {
		Campo.value = Texto;
		if (IsPtb) {Texto = "Por favor, digite ou cole o número de série de seu software neste campo.\n\nPara maiores informações, clique no botão de Ajuda ao lado do campo."}
			  else {Texto = "Please type or paste the serial number of your software product in this field.\n\nFor more information, click the Help button beside the field."}
		alert(Texto);
		Campo.focus();
		return false;
	}
	
	// *****	Aceitar apenas algarismos e o caracter "-", excluindo-o da variável Texto
	Filtro = /[-]/;
	while (Filtro.test(Texto)) Texto = Texto.replace(Filtro, "");
	Filtro = /\D/;
	if (Filtro.test(Texto)) Texto = "";
	
	// *****	Validar o comprimento do Número de Série do Software
	if (Texto.length != 33) Texto = "";
	// *****	Validar ID do Software
	if (Texto.substr(0,1) != "2") Texto = "";
	// *****	Validar Construção do Software
	if ((Texto.substr(3,5) != "38780") && (Texto.substr(3,5) != "39831") && (Texto.substr(3,5) != "39952")) Texto = "";
	// *****	Validar Número de Série do Software
	if (Texto != "") for(j=1; j<=2; j++) {
		DDD = 0;
		for(i=1; i<=(29 + j); i++) DDD = DDD + Texto.substr(Texto.length - (29 + j)).substr(i-1,1) * (9 - ((i - 1) % 9));
		i = 11 - (DDD % 11);
		if (i > 9) i = 0;
		if (i != Texto.substr(Texto.length - (30 + j)).substr(0,1)) {Texto = ""; break;}
	}
	
	// *****	Recusar o Número de Série do Software
	if (Texto == "") {
		if (IsPtb) {Texto = "Número de Série inválido.\nPor favor, verifique o número de série de seu software.\n\nPara maiores informações, clique no botão de Ajuda ao lado do campo."}
			  else {Texto = "Invalid Serial Number.\nPlease check the serial number of your software product.\n\nFor more information, click the Help button beside the field."}
		alert(Texto);
		Campo.focus();
		return false;
	}
	
	// *****	Aceitar e formatar o Número de Série do Software (Número de Série OK)
	Campo.value = Texto.substr(0,3) + "-" + Texto.substr(3,5) + "-" + Texto.substr(8,5) + "-" + Texto.substr(13,5) + "-" + Texto.substr(18,5) + "-" + Texto.substr(23,5) + "-" + Texto.substr(28,5);
	return true;
}
// ================================================================================
