JSNewsletter = new Class({

	// ----------------------------------------------------------------------------------------------------
	initialize: function() {

		$('newsletter_nome').virgem = true;
		$('newsletter_nome').addEvent(
			'focus',
			function() {
				if(this.virgem) {
					this.value = '';
					this.virgem = false;
				}
			}
		);

		$('newsletter_email').virgem = true;
		$('newsletter_email').addEvent(
			'focus',
			function() {
				if(this.virgem) {
					this.value = '';
					this.virgem = false;
				}
			}
		);

	},

	// ----------------------------------------------------------------------------------------------------
	validaInscricao: function() {

		var nome = $('newsletter_nome').value = $('newsletter_nome').value.clean().capitalize();
		var email = $('newsletter_email').value = $('newsletter_email').value.clean().toLowerCase();
		if(!this.emailCheck(email)) {
			msgr.show({
				tipo: 'error',
				html: 'O e-mail que indicou n&atilde;o &eacute; v&aacute;lido.'
			});
			return
		}

		new Request.HTML({
			url: 'modulos/newsletter/inscrever.ajax.php',
			onSuccess: function(responseTree, responseElements, responseHTML, responseJavaScript) {
				if(responseHTML.clean() == '') {
					msgr.show({
						tipo: 'info',
						html: 'Obrigado por se inscrever na nossa newsletter.'
					});
				} else {
					msgr.show({
						tipo: 'error',
						html: responseHTML
					});
				}
			}
		}).get({nome: nome, email: email});

	},

	// ----------------------------------------------------------------------------------------------------
	buscaContactosLetra: function(letra) {

		if($('letra_' + letra).getStyle('display') == 'none') {
			$('letra_' + letra).innerHTML = "Aguarde...";
			$('letra_' + letra).setStyle('display', 'block');
			new Request.HTML({
				url: 'modulos/newsletter/buscar_contactos_letra.ajax.php',
				onSuccess: function(responseTree, responseElements, responseHTML, responseJavaScript) {
					$('letra_' + letra).innerHTML = responseHTML;
				}
			}).get({letra: letra});
		} else {
			$('letra_' + letra).setStyle('display', 'none');
			$('letra_' + letra).innerHTML = '';
		}

	},

	// ----------------------------------------------------------------------------------------------------
	buscaContactosLetraProcura: function(letra, id) {

		if($('letra_' + letra).getStyle('display') == 'none') {
			$('letra_' + letra).innerHTML = "Aguarde...";
			$('letra_' + letra).setStyle('display', 'block');
		}
		new Request.HTML({
			url: 'modulos/newsletter/buscar_contactos_letra.ajax.php',
			onSuccess: function(responseTree, responseElements, responseHTML, responseJavaScript) {
				$('letra_' + letra).innerHTML = responseHTML;
				new Fx.Scroll(window).toElement('div_contacto_' + id);
			}
		}).get({letra: letra});

	},

	// ----------------------------------------------------------------------------------------------------
	editaNome: function(id) {

		if($chk(this.idSeleccionado) && this.idSeleccionado != id) {
			this.cancelaNome(this.idSeleccionado);
			this.cancelaEmail(this.idSeleccionado);
		}

		if(id != -1) {
			var form = $('form_editar_contacto_' + id);
			form.nomeUndo = form.nome.value;
			form.emailUndo = form.email.value;
			$('div_nome_' + id).setStyle('display', 'block');
			this.idSeleccionado = id;
		} else {
			var form = $('form_novo_contacto');
			this.idSeleccionado = null;
		}
		form.nome.setStyles({
			border: '1px solid #9D8B00',
			background: 'url(imagens/fundo_textbox.gif)'
		});

	},

	// ----------------------------------------------------------------------------------------------------
	onKeyDownNome: function(event, id) {

		if(event.keyCode == 13) this.salvaNome(id);
		else if(event.keyCode == 27) {
			this.cancelaNome(id);
			$('ghost').focus();
		}

	},

	// ----------------------------------------------------------------------------------------------------
	cancelaNome: function(id) {

		var form = $('form_editar_contacto_' + id);
		form.nome.value = form.nomeUndo;
		form.nome.setStyles({
			border: 'none',
			background: 'none'
		});
		$('div_nome_' + id).setStyle('display', 'none');

	},

	// ----------------------------------------------------------------------------------------------------
	salvaNome: function(id) {

		// Buscar valores
		var form = $('form_editar_contacto_' + id);
		var nome = form.nome.value = form.nome.value.clean();

		new Request.HTML({
			url: 'modulos/newsletter/salvar_nome.ajax.php',
			onSuccess: function(responseTree, responseElements, responseHTML, responseJavaScript) {

				newsletter.idSeleccionado = null;

				// Estilos
				form.nome.setStyles({
					border: 'none',
					background: 'none'
				});
				$('div_nome_' + id).setStyle('display', 'none');

				// Se a primeira letra do nome mudar, tira-lo da letra onde esta e passa-lo para a respectiva letra
				var letraOriginal = form.nomeUndo.substr(0, 1).capitalize();
				var letra = nome.substr(0, 1).capitalize();
				form.nomeUndo = nome;
				if(letra != letraOriginal) {
					if($chk($('letra_' + letra))) {								// Se a nova letra existir
						if($('letra_' + letra).getStyle('display') == 'block') {
							$('letra_' + letra).setStyle('display', 'none');
							newsletter.buscaContactosLetra(letra);
						}
					} else if(nome == '') {										// Se o nome for vazio, tira-lo da letra onde esta e passa-lo para o 'Sem nome'
						if($('letra_Sem nome').getStyle('display') == 'block') {
							$('letra_Sem nome').setStyle('display', 'none');
							newsletter.buscaContactosLetra('Sem nome');
						}
					} else {													// ... caso contrario criar a nova letra
						// Criar o novo contentor
						var novoContentor = new Element('div', {
							id: 'contentor_' + letra,
							html:	'<table width="100%" border="0" cellspacing="0" cellpadding="1">' +
									'<tr onmouseover="this.style.background = \'#DDD6A6\';" onmouseout="this.style.background = \'none\';">' +
									'<td style="border-bottom:1px solid #FD7A13; cursor:pointer;" onclick="newsletter.buscaContactosLetra(\'' + letra + '\');" title="Carregue para abrir/fechar">' +
									'<label style="font-size:16px;">' + letra + '</label>' +
									'</td>' +
									'</tr>' +
									'</table>' +
									'<div id="letra_' + letra + '">' +
									'</div>' +
									'<br />'

						});
						novoContentor.letra = letra;
						// Buscar todos os contentores e ordena-los
						var letras = $('letras').getChildren();
						var semNome = letras.pop();		// Tirar o 'Sem nome'
						letras.push(novoContentor);
						function compFn(a, b) {
							if(a.letra < b.letra) return -1;
							if(a.letra > b.letra) return 1;
							return 0;
						}
						letras.sort(compFn);
						letras.each(function(item, index) {
							$('letras').grab(item);
						});
						$('letras').grab(semNome);
						newsletter.buscaContactosLetra(letra);
					}
					$('div_contacto_' + id).dispose();	// Remover
					if($chk($('letra_' + letraOriginal)) && $('letra_' + letraOriginal).getChildren().length == 1) $('contentor_' + letraOriginal).dispose();
				}

				// Aviso
				utils.mostraAviso('O nome foi salvo');

			}
		}).get({id: id, nome: nome});

		$('ghost').focus();

	},

	// ----------------------------------------------------------------------------------------------------
	editaEmail: function(id) {

		if($chk(this.idSeleccionado) && this.idSeleccionado != id) {
			this.cancelaNome(this.idSeleccionado);
			this.cancelaEmail(this.idSeleccionado);
		}

		if(id != -1) {
			var form = $('form_editar_contacto_' + id);
			form.nomeUndo = form.nome.value;
			form.emailUndo = form.email.value;
			$('div_email_' + id).setStyle('display', 'block');
			this.idSeleccionado = id;
		} else {
			var form = $('form_novo_contacto');
			this.idSeleccionado = null;
		}
		form.email.setStyles({
			border: '1px solid #9D8B00',
			background: 'url(imagens/fundo_textbox.gif)'
		});

	},

	// ----------------------------------------------------------------------------------------------------
	onKeyDownEmail: function(event, id) {

		if(event.keyCode == 13) this.salvaEmail(id);
		else if(event.keyCode == 27) {
			this.cancelaEmail(id);
			$('ghost').focus();
		}

	},

	// ----------------------------------------------------------------------------------------------------
	cancelaEmail: function(id) {

		var form = $('form_editar_contacto_' + id);
		form.email.value = form.emailUndo;
		form.email.setStyles({
			border: 'none',
			background: 'none'
		});
		$('div_email_' + id).setStyle('display', 'none');

	},

	// ----------------------------------------------------------------------------------------------------
	salvaEmail: function(id) {

		// Buscar valores
		var form = $('form_editar_contacto_' + id);
		var email = form.email.value = form.email.value.clean();

		// Validar
		if(!this.emailCheck(email)) {
			msgr.show({
				tipo: 'error',
				html: 'O e-mail n&atilde;o &eacute; v&aacute;lido.'
			});
			return;
		}

		new Request.HTML({
			url: 'modulos/newsletter/salvar_email.ajax.php',
			onSuccess: function(responseTree, responseElements, responseHTML, responseJavaScript) {
				utils.mostraAviso('O e-mail foi salvo');
				form.email.setStyles({
					border: 'none',
					background: 'none'
				});
				$('div_email_' + id).setStyle('display', 'none');
				$('ghost').focus();
			}
		}).get({id: id, email: email});

	},

	// ----------------------------------------------------------------------------------------------------
	salvaNovo: function() {

		var nome = $('novo_nome').value = $('novo_nome').value.clean();
		var email = $('novo_email').value = $('novo_email').value.clean();

		// Validar
		if(!this.emailCheck(email)) {
			msgr.show({
				tipo: 'error',
				html: 'O e-mail n&atilde;o &eacute; v&aacute;lido.'
			});
			return;
		}
		new Request.HTML({
			url: 'modulos/newsletter/validar_novo.ajax.php',
			onSuccess: function(responseTree, responseElements, responseHTML, responseJavaScript) {
				if(responseHTML.clean() != '0') {
					msgr.show({
						tipo: 'error',
						html: 'J&aacute; existe um contacto com esse e-mail.'
					});
				} else {
					new Request.HTML({
						url: 'modulos/newsletter/salvar_novo.ajax.php',
						onSuccess: function(responseTree, responseElements, responseHTML, responseJavaScript) {
							utils.mostraAviso('O contacto foi salvo');
							var letra = nome.substr(0, 1).capitalize();console.log(letra);
							if($chk($('letra_' + letra))) {								// Se a nova letra existir
								if($('letra_' + letra).getStyle('display') == 'block') {
									$('letra_' + letra).setStyle('display', 'none');
									newsletter.buscaContactosLetra(letra);
								}
							} else if(nome == '') {										// Se o nome for vazio, tira-lo da letra onde esta e passa-lo para o 'Sem nome'
								if($('letra_Sem nome').getStyle('display') == 'block') {
									$('letra_Sem nome').setStyle('display', 'none');
									newsletter.buscaContactosLetra('Sem nome');
								}
							} else {													// ... caso contrario criar a nova letra
								// Criar o novo contentor
								var novoContentor = new Element('div', {
									id: 'contentor_' + letra,
									html:	'<table width="100%" border="0" cellspacing="0" cellpadding="1">' +
											'<tr onmouseover="this.style.background = \'#DDD6A6\';" onmouseout="this.style.background = \'none\';">' +
											'<td style="border-bottom:1px solid #FD7A13; cursor:pointer;" onclick="newsletter.buscaContactosLetra(\'' + letra + '\');" title="Carregue para abrir/fechar">' +
											'<label style="font-size:16px;">' + letra + '</label>' +
											'</td>' +
											'</tr>' +
											'</table>' +
											'<div id="letra_' + letra + '">' +
											'</div>' +
											'<br />'
								});
								novoContentor.letra = letra;
								// Buscar todos os contentores e ordena-los
								var letras = $('letras').getChildren();
								var semNome = letras.pop();		// Tirar o 'Sem nome'
								letras.push(novoContentor);
								function compFn(a, b) {
									if(a.letra < b.letra) return -1;
									if(a.letra > b.letra) return 1;
									return 0;
								}
								letras.sort(compFn);
								letras.each(function(item, index) {
									$('letras').grab(item);
								});
								$('letras').grab(semNome);
								newsletter.buscaContactosLetra(letra);
							}
						}
					}).get({nome: nome, email: email});
				}
			}
		}).get({email: email});

	},

	// ----------------------------------------------------------------------------------------------------
	onKeyDownNovo: function(event) {

		if(event.keyCode == 13) this.salvaNovo();

	},

	// ----------------------------------------------------------------------------------------------------
	apagaContacto: function(id, nome, email) {

		var letra = nome.substr(0, 1).capitalize();

		msgr.show({
			tipo: 'confirm',
			html: 'Apagar o contacto com o e-mail <strong>' + email + '</strong> ?',
			onComplete: function(ok) {
				if(!ok) return;
				new Request.HTML({
					url: 'modulos/newsletter/apagar_contacto.ajax.php',
					onSuccess: function(responseTree, responseElements, responseHTML, responseJavaScript) {
						$('div_contacto_' + id).dispose();
						if($chk($('letra_' + letra)) && $('letra_' + letra).getChildren().length == 1) $('contentor_' + letra).dispose();
						utils.mostraAviso('O contacto foi apagado');
						$('ghost').focus();
					}
				}).get({id: id});
			}
		});

	},

	// ----------------------------------------------------------------------------------------------------
	apagaSeleccionados: function() {
	
		var idArray = new Array();
		for(var n = 0; n < document.forms.length; n++) {
			for(var m = 0; m < document.forms[n].length; m++) {
				if(document.forms[n][m].type == "checkbox" && document.forms[n][m].checked) {
					idArray.push(document.forms[n][m].value);
				}
			}
		}

		if(idArray.length > 0) {
			var idSet = "(";
			for(var n = 0; n < idArray.length; n++) {
				if(n < idArray.length - 1) idSet += idArray[n] + ", ";
				else idSet += idArray[n] + ")";
			}
			var confirmStr = idArray.length > 1 ? "Apagar os contactos seleccionados?" : "Apagar o contacto seleccionado?";
			msgr.show({
				tipo: 'confirm',
				html: confirmStr,
				onComplete: function(ok) {
					if(!ok) return;
					new Request.HTML({
						url: 'modulos/newsletter/apagar_seleccionados.ajax.php',
						onSuccess: function(responseTree, responseElements, responseHTML, responseJavaScript) {
							idArray.each(function(id, index) {
								var divLetra = $('div_contacto_' + id).getParent();
								var divContentor = divLetra.getParent();
								$('div_contacto_' + id).dispose();
								if(divLetra.getChildren().length == 1) divContentor.dispose();
							});
							utils.mostraAviso('Os contactos foram apagados');
							$('ghost').focus();
						}
					}).get({id_set: idSet});
				}
			});
		} else msgr.show({
			tipo: 'info',
			html: 'N&atilde;o seleccionou contactos.<br /><span class="nota">Seleccione os contactos que quer apagar e tente novamente.</span>'
		});

	},

	// ----------------------------------------------------------------------------------------------------
	seleccionaTodos: function(checked) {
	
		for(var n = 0; n < document.forms.length; n++) {
			for(var m = 0; m < document.forms[n].length; m++) {
				if(document.forms[n][m].type == "checkbox") document.forms[n][m].checked = checked;
			}
		}

	},

	// ----------------------------------------------------------------------------------------------------
	procura: function(q) {

		$('div_resultados').empty();

		var q = $('nome_email').value;
		if(q.length < 2) {
			$('label_resultados').setStyle('display', 'none');
			$('div_resultados').innerHTML = '';
			$('div_resultados').setStyle('display', 'none');
			return;
		}

		$('nome_email').setStyle('cursor', 'wait');
		$('div_resultados').innerHTML = 'Aguarde...';
		$('div_resultados').setStyle('display', 'block');

		if(!$chk(this.procuraRequest)) {
			this.procuraRequest = new Request.HTML({
				url: 'modulos/newsletter/procurar.ajax.php',
				noCache: true,
				link: 'cancel',
				onSuccess: function(responseTree, responseElements, responseHTML, responseJavaScript) {
					$('label_resultados').setStyle('display', 'block');
					$('div_resultados').innerHTML = responseHTML;
					$('div_resultados').setStyle('display', 'block');
					$('nome_email').setStyle('cursor', 'text');
				}
			});
		}
		this.procuraRequest.get({q: q});

	},


	// ----------------------------------------------------------------------------------------------------
	enviaTeste: function() {

		// Verificar
		var errorArray = new Array();
		var remetente = $('remetente').value.clean();
		if(!this.emailCheck(remetente)) errorArray.push('O remetente n&atilde;o &eacute; v&aacute;lido');
		var titulo = $('titulo').value.clean();
		if(titulo.length < 1) errorArray.push('O t&iacute;tulo n&atilde;o &eacute; v&aacute;lido');
		var emailTeste = $('email_teste').value.clean();
		if(!this.emailCheck(emailTeste)) errorArray.push('O e-mail para teste n&atilde;o &eacute; v&aacute;lido');
		if(errorArray.length > 0) utils.mostraErrorArray(errorArray, 'testar');
		else {
			new Request.HTML({
				url: 'modulos/newsletter/testar.ajax.php',
				onSuccess: function(responseTree, responseElements, responseHTML, responseJavaScript) {
					if(responseHTML.length == 0) msgr.show({
						tipo: 'info',
						html: 'A newsletter foi enviada para o e-mail de teste'
					});
					else msgr.show({
						tipo: 'error',
						html: responseHTML
					});

				}
			}).post({
				l: $('l').value,
				remetente: remetente,
				email_teste: emailTeste,
				titulo: titulo,
				texto: __xinhas[0].getEditorContent()
			});
		}

	},

	// ----------------------------------------------------------------------------------------------------
	enviaGrupo: function(grupo) {

		// Verificar
		var errorArray = new Array();
		var remetente = $('remetente').value.clean();
		if(!this.emailCheck(remetente)) errorArray.push('O remetente n&atilde;o &eacute; v&aacute;lido');
		var titulo = $('titulo').value.clean();
		if(titulo.length < 1) errorArray.push('O t&iacute;tulo n&atilde;o &eacute; v&aacute;lido');
		var emailTeste = $('email_teste').value.clean();
		if(!this.emailCheck(emailTeste)) errorArray.push('O e-mail para teste n&atilde;o &eacute; v&aacute;lido');
		if(errorArray.length > 0) utils.mostraErrorArray(errorArray, 'testar');
		else {
			$('grupo').value = grupo;
			new Request.HTML({
				url: 'modulos/newsletter/enviar.ajax.php',
				onSuccess: function(responseTree, responseElements, responseHTML, responseJavaScript) {
					if(responseHTML.length == 0) msgr.show({
						tipo: 'info',
						html: 'A newsletter foi enviada para o ' + (grupo + 1) + '&ordm; grupo'
					});
					else msgr.show({
						tipo: 'error',
						html: 'A newsletter foi enviada para o ' + (grupo + 1) + '&ordm; grupo<br />' + responseHTML
					});

				}
			}).post($('form_enviar_newsletter'));
		}

	},

	// ----------------------------------------------------------------------------------------------------
	emailCheck: function(emailStr) {

		var emailPat = /^(.+)@(.+)$/;
		var specialChars = "\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";
		var validChars = "\[^\\s" + specialChars + "\]";
		var quotedUser = "(\"[^\"]*\")";
		var ipDomainPat = /^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
		var atom = validChars + '+';
		var word = "(" + atom + "|" + quotedUser + ")";
		var userPat = new RegExp("^" + word + "(\\." + word + ")*$");
		var domainPat = new RegExp("^" + atom + "(\\." + atom + ")*$");
		var matchArray = emailStr.match(emailPat);

		if(matchArray == null) return false;
		var user = matchArray[1];
		var domain = matchArray[2];

		if(user.match(userPat) == null) return false;

		var IPArray = domain.match(ipDomainPat);
		if(IPArray != null) {
			// this is an IP address;
			for(var i = 1;i <= 4; i++) {
				if(IPArray[i] > 255) return false;
			}
			return true;
		}

		var domainArray = domain.match(domainPat);
		if(domainArray == null) return false;

		var atomPat = new RegExp(atom, "g");
		var domArr = domain.match(atomPat);
		var len = domArr.length;
		if(domArr[domArr.length-1].length < 2 || domArr[domArr.length-1].length > 3) return false;

		if(len < 2) return false;

		return true;

	}

});
