/* +++++++ CREDITOS & COPYRIGHT +++++++ 

Funções de Javascript para controlar o Front-End do portal e-commerce da minfo [www.minfo.pt]
Criadas e adaptadas por alvaro Saraiva @ glups.pt @ agosto 2006

Glups - Atelier de Novas Tecnologias, Lda
Rua Jaime Campos, Bloco D, Piso 3 Esq., 5000-431 Vila Real | Portugal
Tel. [351] 259 322 183 | E-mail: info@glups.pt | URL: www.glups.pt

Se utilizarem estas funções para os vossos trabalhos,
a Glups agradece que ao menos no retirem estas linhas de cdigo,
por respeito e agradecimento ao trabalho das pessoas que a criaram
e ao trabalho que vocs pouparam. Keep Cool. Peace ;)

*/

//+++++++++++++++++++++++++++++++++++++++++++++++
//+++++++ DECLARAÇÃO DE VARIÁVEIS GERAIS ++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++

var urlBaseSite				= 'http://' + document.location.host;				// host do site
var nomeSite				= 'Minfo.pt';			// Nome do site
var urlImgsSite				= 'http://' + document.location.host +'/_imagens';	// Pasta das imagens usadas nos templates base do site
var urlImgsTmplSite			= urlImgsSite + '/_tmpl/';
var urlImgsConteudoSite		= urlImgsSite;										// Pasta das imagens para o conteúdo do site
var srcImgPreloader			= urlImgsTmplSite + 'tmpl_fe_icone_preloader.gif';	// Img (gif' por defeito para os preloaders do AJAX
var srcImgBtnEliminarOpcao	= urlImgsTmplSite + 'tmpl_admin_icone_admin_eliminar_opcao.gif';	// Img (gif' por defeito para os preloaders do AJAX
var canalDefault			= 'homepage';										// Canal por defeito, caso não venha nenhum canal
var idiomaDefault			= 'pt';												// Idioma por defeito

//Controlo das classes de css dos campos dos Formulários
var cssFormInputErro='formInputErro'; //Controla a class de CSS que é aplicada ao um campo do formulario qd dá erro no preenchimento
var cssFormInputFocus='formInputFocus'; //Controla a class de CSS que é aplicada ao um campo do formulario qd recebe focus no preenchimento
var cssFormInput='formInput'; //Controla a class de CSS que é aplicada normalmente um campo do formulario

//Formatos de ficheiros permitidos nos inputs dos formulários
var formatosImagem=new Array('jpg','gif','png');
var formatosAnexos=new Array('doc','xls','pdf','pps','zip','rar');
var formatosSom=new Array('mp3');

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++ FUNÇÕES PARA CONTROLAR A APRESENTAÇÃO DAS PÁGINAS, NAVEGAÇÃO, ETC ++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

/* @desc Para dar focus aos inputs */
function ganharFocusPesquisa(){
	document.pesq.pesquisa.focus();
}

function pesquisar(){
	var palavra=document.pesq.pesquisa.value;
	if(palavra!=''){
		document.pesq.submit();
	}
	ganharFocusPesquisa();
	return false;
}

/* @desc Para dar focus a um elemento no html (flash) */
function flashFocus(obj){
	$(obj).focus();
}

/* @desc Para saber o ano actual e apresentar no rodapé */
function anoActual(){
	var tempo = new Date();
	var ano=tempo.getFullYear();
	return ano;
}

/* @desc Para um campo ganhar focus numa página */
function ganharFocus(obj){
	document.getElementById(obj).focus();
}

/* @desc Para abrir as janelas */
function abrirJanela(URL,nomeJanela,propriedades) { 
	window.open(URL,nomeJanela,propriedades);
}

/**
 * @desc Para submeter a combo da loja por marca, sempre k se escolhe uma marca
 * @params Number	Id da marca
 * @return Void		Não devolve nada... faz submit a um formulário
 * @access public
*/
function getTmplLojaMarca(marcaId){
	if(marcaId>0){
		document.loja_marca.submit();
	}
}

/**
 * @desc Mostrar ou esconder a opção de mostrar os divs dos grupos e famílias
 					Altera tb a classe de CSS do TR
 * @params String	ID do TR para controlar
 * @params String	Nome do div para mostrar ou esconder
 * @return Void		Não devolve nada... muda as visibilidades de div's
 * @access public
*/
function expandirOpcao(objTr,objDiv){
	var div = $(objDiv);
	var tr = $(objTr);
	var nomeTr = tr.id.substring(tr.id.indexOf('_')+1,tr.id.length);
	//alert(tr.id + '- ' +tr.className);

	if(div.className=='opcaoInvisivel'){
		div.className='opcaoVisivel';
		tr.className= (tr.className=='listagemGrupoMenos')?'listagemGrupoMenos':'listagemGrupoMenosOn';
		tr.title = 'Ocultar famílias do grupo "'+nomeTr+'"';		
	}
	else{
		div.className='opcaoInvisivel';
		tr.className= (tr.className=='listagemGrupoMais')?'listagemGrupoMais':'listagemGrupoMaisOn';
		tr.title = 'Ver famílias do grupo "'+nomeTr+'"';
	}
}

/**
 * @desc Mudar a classe de CSS e o atributo 'title' dos TR's dos grupos de produtos
		 É activado nos eventos onMouseOver e onMouseOut nos TR's
 * @params String	ID do TR para controlar
 * @params String	Nome do TR para controlar
 * @return Void		Não devolve nada
 * @access public
*/
function controlaOverTr(objTr,nomeTr){
	var tr = $(objTr);

	//alert(tr.className);
	switch(tr.className){
		case 'listagemGrupoMenos':
			tr.className='listagemGrupoMenosOn';
			tr.title='Ocultar famílias do grupo "'+nomeTr+'"';
		break;
		case 'listagemGrupoMenosOn':
			tr.className='listagemGrupoMenos';
			tr.title='Ocultar famílias do grupo "'+nomeTr+'"';
		break;
		case 'listagemGrupoMais':
			tr.className='listagemGrupoMaisOn';
			tr.title='Ver famílias do grupo "'+nomeTr+'"';
		break;
		case 'listagemGrupoMaisOn':
			tr.className='listagemGrupoMais';
			tr.title='Ver famílias do grupo "'+nomeTr+'"';
		break;
	}
}

/**
 * @desc Para abrir o formulário de registo de novo utilizador
 * @return Void		Não devolve nada 	
 * @access public
*/
function getFichaRegistoCliente(){
	window.location.href = 'http://' + document.location.host+'/clientes/novo.php';
}

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++ FUNÇÕES PARA VERIFICAR A ENTRADA DE INFORMAÇÃO (TEXTOS, IMAGENS E ANEXOS NO BACK-OFFICE ++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

/* @desc Para verificar o formato do campo da data */
function verificaData(campo){
	var data=campo;
	dataElementos=new Array(data.substring(0,2),data.substring(3,5),data.substring(6,10)); //Extrair os valores do dia, mês e ano
	dataSeparador=new Array(data.substring(2,3),data.substring(5,6)); //Extrair os separadores para um array

	var verificacaoData=document.verificacaoData=false;
	var msgData=document.msgData=-1; //Esta vai ser a msg personalizada k vai ser devolvida (no caso de ser necessário) com o erro de preenchimento dos campos
	var separadorCorrecto='-';
	var primeiroSeparador=dataSeparador[0];
	var segundoSeparador=dataSeparador[1];
	var dia=parseFloat(dataElementos[0]);
	var mes=parseFloat(dataElementos[1]);
	var ano=parseFloat(dataElementos[2]);
	var anoBissexto=ano%4;

	if((primeiroSeparador==separadorCorrecto)&&(segundoSeparador==separadorCorrecto)){ //Se os separadores estão correctos
		if ((!isNaN(dia))&&(!isNaN(mes))&&(!isNaN(ano))){ //Se os valores inseridos são números
			if (((dia>=1)&&(dia<=31))&&((mes>=1)&&(mes<=12))&&((ano>=1700)&&(ano<=9999))){ //Verifico se o dia está entre 1 e 31, se o mês está entre 1 e 12 e se o ano está entre 2000 e 2050
				//Começa aki o controlo EXTRA dos dias e meses
				if(((mes==1)||(mes==3)||(mes==5)||(mes==7)||(mes==8)||(mes==10)||(mes==12))&&(dia<=31)){ // Verifico que estes meses só podem ter 31 dias
					document.verificacaoData=true;
				}
				else if(((mes==4)||(mes==6)||(mes==9)||(mes==11))&&(dia<=30)){ //Verifico que estes meses só podem ter 30 dias
					document.verificacaoData=true;
				}
				else if(((mes==2)&&(anoBissexto==0))&&(dia<=29)){ //Verifico que em fevereiro dos anos bissextos só pode ter 29 dias
					document.verificacaoData=true;
				}
				else if(((mes==2)&&(anoBissexto!=0))&&(dia<=28)){ //Verifico que em fevereiro anos normais (não bissextos) só pode ter 28 dias
					document.verificacaoData=true;
				}
				else{
					document.verificacaoData=false;
					document.msgData='o mês "'+mes+'" no ano de "'+ano+'" não pode ter "'+dia+'" dias. Corrija os valores por favor!';
				} //fim do controlo EXTRA
			}
			else {
				document.verificacaoData=false;
			};
		}
		else {
			document.verificacaoData=false;
		}
	} //Fim de verificação dos campos
	else {
		document.verificacaoData=false;
	}
	if (document.verificacaoData){ 
		return document.msgData;
		return document.verificacaoData;
	}
}

/* @desc Método 1 (de 2) de verificação do preenchimento dos campos dos formulários */
function MM_findObj(n, d) { //v4.0
	var p,i,x;
	if(!d) d=document;
	if((p=n.indexOf("?"))>0&&parent.frames.length) {
		d=parent.frames[n.substring(p+1)].document;
		n=n.substring(0,p);
	}
	if(!(x=d[n])&&d.all) x=d.all[n];
	for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
	for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
	if(!x && document.getElementById) x=document.getElementById(n);
	return x;
}

/* @desc Método 2 (de 2) de verificação do preenchimento dos campos dos formulários */
function verificarCampos() { //v5.0
	var i,p,q,nomeCampo,tipoVerificacao,num,min,max,msgErro='',argumentos=verificarCampos.arguments;
	msgAlerta=verificarCampos.arguments[0]; //Serve para verificar se a verificação vai ter 'alerts' ou n. Ã‰ o primeiro parÃ¢metro da função
	for (i=1; i<(argumentos.length-1); i+=3) {
		campo=MM_findObj(argumentos[i]); //Campo para verificar o preenchimento
		tipoVerificacao=argumentos[i+1]; //parametro onde se indica qual o tipo de verificação a efectuar
		nomeCampoListagem=argumentos[i+2]; //parametro onde se indica qual o o nome do campo para aparecer nas listagens de erros
		//alert(campo.id+' - ' +campo.value); 
		if (campo) {
			nomeCampo=campo.id;
			if ((campo=campo.value)!="") { //Caso o campo tenha informação é obrigatório verificar o tipo de informação
				if(tipoVerificacao.indexOf('isData')!=-1){ //Caso seja obrigatório inserir uma data
					verificaData(campo); //Verifica de a data foi bem inserida e devolve o valor da variável verificacaoData
					/*if(document.verificacaoData){ //Se estiver tudo ok devolve true
						inverterData(nomeCampo,campo); //Inverto o formato da data para o script inserir na BD
					}*/
					if ((document.verificacaoData==false)&&(document.msgData!=-1)) { //Se houver problemas com os dias, meses e anos
						document.getElementById(nomeCampo).className=cssFormInputErro;
						msgErro+='- No campo "'+nomeCampoListagem+'", '+document.msgData+'\n';
					}
					else if ((document.verificacaoData==false)&&(document.msgData==-1)){ //Se houver problemas de caracteres ou formatos inválidos
						document.getElementById(nomeCampo).className=cssFormInputErro;
						msgErro+='- O campo "'+nomeCampoListagem+'" não tem um formato de data válido (dd-mm-aaaa).\n';
					}
				}// fim de verificacao de data
				if (tipoVerificacao.indexOf('isEmail')!=-1) { //Caso seja obrigatório um endereço de e-mail
					p=campo.indexOf('@');
					if (p<1 || p==(campo.length-1)) {
						document.getElementById(nomeCampo).className=cssFormInputErro;
						msgErro+='- O campo "'+nomeCampoListagem+'" não tem um endereço de e-mail válido.\n';
					}
				}
				if (tipoVerificacao.indexOf('isNum')!=-1){ //Caso seja obrigatório um número
					if (isNaN(campo)) { 
						document.getElementById(nomeCampo).className=cssFormInputErro;
						msgErro+='- O campo "'+nomeCampoListagem+'" deve conter um número.\n';
					}
				}
				if (tipoVerificacao.indexOf('inRange')!=-1){ //Caso seja obrigatório um número entre x e y. Ex. de sintax verificarCampos('quantidade_campos','NinRange1:4');
					num = parseFloat(campo.length);
					p=tipoVerificacao.indexOf(':');
					min=tipoVerificacao.substring(7,p);
					max=tipoVerificacao.substring(p+1);
					if (num<min || max<num) {
						document.getElementById(nomeCampo).className=cssFormInputErro;
						msgErro+='- O campo "'+nomeCampoListagem+'" deve conter um número entre "'+min+'" e "'+max+'".\n';
					}
				}
				if (tipoVerificacao.indexOf('isContacto')!=-1){ //Caso seja obrigatório um número de telefone ou fax
					regraValidacaoContacto=/[^0-9+ ]/g;//Expressão regular que vai controlar a entrada no campo a todos os caracteres k n sejam de '1' a '9', '+' e ' '
					if(campo.search(regraValidacaoContacto)!=-1){
						document.getElementById(nomeCampo).className=cssFormInputErro;
						msgErro+='- O campo "'+nomeCampoListagem+'" deve conter um número de contacto válido.\n';
					}
				}
				if(tipoVerificacao.indexOf('isURL')!=-1){ // Caso seja obrigatório um URL
					campoLowerCase=campo.toLowerCase();
					enderecoURL=campoLowerCase.substring(0,7);
					if (enderecoURL.indexOf('http:\/\/')==-1){
						document.getElementById(nomeCampo).className=cssFormInputErro;
						msgErro += '- O campo "'+nomeCampoListagem+'" tem que começar com "http://".\n';
					}
				}
				if(tipoVerificacao.indexOf('checkCombo')!=-1){ // Caso seja obrigatório o preenchimento de uma comboBox
					separador=tipoVerificacao.indexOf(':')+1;
					var valorProibido=tipoVerificacao.substring(separador,tipoVerificacao.length);
					if(campo==valorProibido){
						document.getElementById(nomeCampo).className=cssFormInputErro;
						msgErro += '- Tem que escolher uma das opções no campo "'+nomeCampoListagem+'".\n';
					}
				}
				if(tipoVerificacao.indexOf('isImage')!=-1){ // Caso seja obrigatório verificar o tipo de imagem
					var verificacaoImagem=false;
					comprimentoCampo=campo.length;
					extensaoFicheiro=campo.substring(comprimentoCampo-3,comprimentoCampo);
					extensaoFicheiro=extensaoFicheiro.toLowerCase();
					for(j=0;j<formatosImagem.length;j++){
						if(extensaoFicheiro==formatosImagem[j]){
							verificacaoImagem=true;
						}
					}
					if(verificacaoImagem==false){
						document.getElementById(nomeCampo).className=cssFormInputErro;
						msgErro += '- O campo "'+nomeCampoListagem+'" não tem um formato de imagem válido ('+formatosImagem.toString()+').\n';
					}
				}
				if(tipoVerificacao.indexOf('isFile')!=-1){ // Caso seja obrigatório verificar o tipo de ficheiro anexo
					var verificacaoFicheiro=false;
					comprimentoCampo=campo.length;
					extensaoFicheiro=campo.substring(comprimentoCampo-3,comprimentoCampo);
					extensaoFicheiro=extensaoFicheiro.toLowerCase();
					for(k=0;k<formatosAnexos.length;k++){
						if(extensaoFicheiro==formatosAnexos[k]){
							verificacaoFicheiro=true;
						}
					}
					if(verificacaoFicheiro==false){
						document.getElementById(nomeCampo).className=cssFormInputErro;
						msgErro += '- O campo "'+nomeCampoListagem+'" não tem um formato de ficheiro válido ('+formatosAnexos.toString()+').\n';
					}
				}
				if(tipoVerificacao.indexOf('isSom')!=-1){ // Caso seja obrigatório verificar o tipo de ficheiro anexo
					var verificacaoFicheiro=false;
					comprimentoCampo=campo.length;
					extensaoFicheiro=campo.substring(comprimentoCampo-3,comprimentoCampo);
					extensaoFicheiro=extensaoFicheiro.toLowerCase();
					for(m=0;m<formatosSom.length;m++){
						if(extensaoFicheiro==formatosSom[m]){
							verificacaoFicheiro=true;
						}
					}
					if(verificacaoFicheiro==false){
						document.getElementById(nomeCampo).className=cssFormInputErro;
						msgErro += '- O campo "'+nomeCampoListagem+'" não tem um formato de ficheiro válido ('+formatosSom.toString()+').\n';
					}
				}
				if(tipoVerificacao.indexOf('isTxt')!=-1){ // Caso seja obrigatório verificar o tipo de ficheiro anexo para a importação de dados
					var verificacaoFicheiro=false;
					comprimentoCampo=campo.length;
					extensaoFicheiro=campo.substring(comprimentoCampo-3,comprimentoCampo);
					extensaoFicheiro=extensaoFicheiro.toLowerCase();
					if(extensaoFicheiro=='txt'){
						verificacaoFicheiro=true;
					}
					else {
						document.getElementById(nomeCampo).className=cssFormInputErro;
						msgErro += '- O campo "'+nomeCampoListagem+'" não tem um formato de ficheiro válido (txt).\n';
					}
				}
				if(tipoVerificacao.indexOf('noSpaces')!=-1){ // Caso o campo não possa conter espaços
					regraValidacao=/[^A-Za-z0-9_]/g;//Expressão regular que vai controlar a entrada no campo a todos os caracteres k n sejam de 'A' a 'Z', de 'a' a 'z', de '1' a '9' e '_'
					if(campo.search(regraValidacao)!=-1){
						novoValorCampo=campo.replace(regraValidacao,'_');
						document.getElementById(nomeCampo).value=novoValorCampo;
						document.getElementById(nomeCampo).className=cssFormInputErro;
						msgErro += '- O campo "'+nomeCampoListagem+'" não pode conter espaços entre os caracteres nem caracteres acentuados.\n   Por conveniência o valor "'+campo+'" inserido, foi alterado para "'+novoValorCampo+'".\n';
					}
				}
				if(tipoVerificacao.indexOf('isPrice')!=-1){ // Caso seja obrigatório verificar se é um preço
					var precoTotal=campo;
					var precoDecimas=precoTotal.substring(precoTotal.lastIndexOf(',')+1,precoTotal.length);
					var precoEuros=precoTotal.substring(0,precoTotal.lastIndexOf(','));
					if(precoTotal.indexOf(',')==-1){
						msgErro += '- O campo do preço "'+nomeCampoListagem+'" não estão no formato correcto! Insira duas casas decimais. Ex.: 12,50\n';
						document.getElementById(nomeCampo).className=cssFormInputErro;
					}
					else if((precoTotal.indexOf(',')!=1) && (isNaN(precoEuros) || isNaN(precoDecimas))){
						msgErro += '- O campo do preço "'+nomeCampoListagem+'" só pode conter números e uma vírgula para separar as casas decimais!\n';
						document.getElementById(nomeCampo).className=cssFormInputErro;  
					}
					else if(precoDecimas.length!=2){
						msgErro += '- O campo do preço "'+nomeCampoListagem+'" deve ter duas casas decimais!\n';
						document.getElementById(nomeCampo).className=cssFormInputErro;
					}
				}
				if(tipoVerificacao.indexOf('isPeso')!=-1){ // Caso seja obrigatório verificar se é um peso em Kg's
					var pesoTotal=campo;
					var pesoDecimas=pesoTotal.substring(pesoTotal.lastIndexOf(',')+1,pesoTotal.length);
					var pesoKilos=pesoTotal.substring(0,pesoTotal.lastIndexOf(','));
					if(pesoTotal.indexOf(',')==-1){
						msgErro += '- O campo do peso "'+nomeCampoListagem+'" não está no formato correcto! Insira 3 casas decimais. Ex.: 0,215\n';
						document.getElementById(nomeCampo).className=cssFormInputErro;
					}
					else if((pesoTotal.indexOf(',')!=1) && (isNaN(pesoKilos) || isNaN(pesoDecimas))){
						msgErro += '- O campo do peso "'+nomeCampoListagem+'" só pode conter números e uma vírgula para separar as casas decimais!\n';
						document.getElementById(nomeCampo).className=cssFormInputErro;  
					}
					else if(pesoDecimas.length!=3){
						msgErro += '- O campo do peso "'+nomeCampoListagem+'" deve ter 3 casas decimais!\n';
						document.getElementById(nomeCampo).className=cssFormInputErro;
					}
				}				
				if(tipoVerificacao.indexOf('isEqual')!=-1){ // Caso seja obrigatório verificar se dois campos têm o mesmo valor
					var segundoValor =campo;
					separador = tipoVerificacao.indexOf(':')+1;
					separador2 = tipoVerificacao.indexOf('|')+1;
					var nomeCampo2=tipoVerificacao.substring(separador,separador2-1);
					var nomeCampoListagem2 = tipoVerificacao.substring(separador2,tipoVerificacao.length);
					var primeiroValor=document.getElementById(nomeCampo2).value;
					if(primeiroValor!=segundoValor){
						msgErro += '- Os campos "'+ nomeCampoListagem +'" e "'+ nomeCampoListagem2 +'" não são iguais. Corrija por favor!\n';
						document.getElementById(nomeCampo).className=cssFormInputErro;
						document.getElementById(nomeCampo2).className=cssFormInputErro;
					}
				}
				if(tipoVerificacao.indexOf('isBiggerThan')!=-1){ // Caso seja obrigatório verificar se um campo tem mais do que 'x' caracteres
					separador=tipoVerificacao.indexOf(':')+1;
					var valorCampo=campo.length;
					var limite=parseFloat(tipoVerificacao.substring(separador,tipoVerificacao.length));
					if(valorCampo < limite){
						msgErro += '- O campo "'+ nomeCampoListagem +'" tem que ter no mínimo "'+ limite +'" caracteres. Corrija por favor!\n';
						document.getElementById(nomeCampo).className=cssFormInputErro;
					}
				}
				if(tipoVerificacao.indexOf('comparaData')!=-1){ // Caso seja obrigatório verificar duas datas: data 1 mais antiga que data 2
					// EX: 'data_publicacao','comparaData:data_fim_publicacao|Data Fim Publicação','Data Início Publicação'
					var compararDatas=false;
					var segundaData=campo;

					separador=tipoVerificacao.indexOf(':')+1;
					separador2 = tipoVerificacao.indexOf('|')+1;

					var nomeCampo2=tipoVerificacao.substring(separador,separador2-1);
					var nomeCampoListagem2 = tipoVerificacao.substring(separador2,tipoVerificacao.length);
					var primeiraData=document.getElementById(nomeCampo2).value;

					if (verificaData(primeiraData) && verificaData(segundaData)){
						var diaPrimeiraData=primeiraData.substring(0,2);
						var mesPrimeiraData=primeiraData.substring(3,5);
						var anoPrimeiraData=primeiraData.substring(6,10);
						var diaSegundaData=segundaData.substring(0,2);
						var mesSegundaData=segundaData.substring(3,5);
						var anoSegundaData=segundaData.substring(6,10);
						if(anoSegundaData == anoPrimeiraData){
							if(mesSegundaData == mesPrimeiraData){
								if((diaSegundaData > diaPrimeiraData)||(diaSegundaData == diaPrimeiraData)){
									compararDatas=true;
								}
							}
							else if(mesSegundaData > mesPrimeiraData){
								compararDatas=true;
							}
						}
						else if (anoSegundaData > anoPrimeiraData){
							compararDatas=true;
						}
					}
					if(!compararDatas){
						msgErro += '- O campo "'+ nomeCampoListagem +'" tem que ter sempre uma data superior à do campo "'+ nomeCampoListagem2 +'". Corrija por favor!\n';
						document.getElementById(nomeCampo).className=cssFormInputErro;
						document.getElementById(nomeCampo2).className=cssFormInputErro;
					}
				}
			}
			else {
				if (tipoVerificacao.charAt(0) == 'R') { //Caso o preenchimento seja obrigatório e não tenha sido inserida nenhuma informação no campo
					document.getElementById(nomeCampo).className=cssFormInputErro;
					msgErro += '- O campo "'+nomeCampoListagem+'" é de preenchimento obrigatório.\n';
				}
			}
		}
	}
	if (msgErro && (msgAlerta=='alert')) { //Despeja todos os erros cá para fora e apresenta a msg de alerta
		alert('Ocorreram alguns erros no preenchimento do formulário.\nOs campos assinalados com cor diferente precisam de ser corrigidos e/ou preenchidos.\n\nLista de Erros:\n' + msgErro);
	}
	return (msgErro == '');
}

/* @desc Limita o tamanho de um campo de texto (text area, por exemplo) */
function limitarCaracteres(obj, limiteMaximo) {
	conteudo=obj.value;
	if (conteudo.length > limiteMaximo) {
		alert('Alerta: o campo "'+obj.name+'" não pode exceder os '+limiteMaximo+' caracteres, incluíndo espaços e pontuação!');
		novoConteudo=conteudo.substr(0, limiteMaximo);
		obj.value=novoConteudo;
	}
}

/* @desc Para verificar se existem ', <, >, %  na text area */
function verificastring(campo,nome) {
	var p=0;
	var resultado=true;
	var str=(campo.value);
	var ult=str.length;
	while((p < ult)&&(resultado)) {
		car=str.substring(p,p+1);
		if ((car=='\'')||(car=='%')||(car=='>')||(car=='<')) {
			alert('O campo "'+nome+'" tem caracteres inválidos! Corrija por favor.');
			document.getElementById(campo).className=cssFormInputErro;
			resultado=false;
		}
		p++;
	} 
	return resultado;
}

/*	+++++++++++++++++++++++++++++++++++++++++++++++
					CLASSE TOOLS
	+++++++++++++++++++++++++++++++++++++++++++++++ */

var coreTools = Class.create();

/*
*	@desc Método 'prototype' da classe coreTools que define quais os métodos que torna público e disponíveis a quem instanciar esta classe
*	@retutn void
*/
coreTools.prototype = {

	/*
	*	@desc Método constructor 'prototype' da classe coreTools
	*	@retutn void
	*/
	initialize: function(){ },
	
	/*
	*	@desc Método que devolve o ano actual
	*	@return	String	Ano no formato aaaa
	*/
	getAnoActual: function(){
		var tempo	= new Date();
		var ano		= tempo.getFullYear();
		return ano;
	},

	/*
	*	@desc Método que devolve a data actual
	*	@return	String	Ano no formato aaaa
	*/
	getDataActual: function(){
		var tempo		= new Date();

		// array com os meses e dias da semana em vários idiomas
		var diasSemana	= {
			'pt' : ['Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'],
			'en' : ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],
			'es' : ['Domingo','Lunes','Martes','Miércoles','Jueves','Viernes','Sábado']
		};
		var meses		= {
			'pt' : ['Janeiro','Fevereiro','Março','Abril','Maio','Junho','Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
			'en' : ['January','February','March','April','May','Juin','July','August','September','October','November','December'],
			'es' : ['Enero','Febrero','Marzo','Abril','Mayo','Junio','Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre']
		};
		var dataActual	= diasSemana[tmpl.getIdioma()][tempo.getDay()]+', ' + tempo.getDate()+ ' de ' + meses[tmpl.getIdioma()][tempo.getMonth()] + ' de ' + tempo.getFullYear();
		return dataActual;
	},

	/*
	*	@desc Método para dar foco a um campo no template de HTML
	*	@param nomeObj (String) nome do elemento de HTML para dar focus
	*	@retun void	Não devolve nada
	*/
	setFocusCampo: function(nomeObj){
		$(nomeObj).focus();
	},

	/*
	*	@desc Método para adicionar o site aos favoritos. Funciona com IE, Firefox, Opera 
	*	@return void
	*/
	addFavoritos: function(){
		// apanhamos as variáveis definidas no _init_JS_minfo.js
		var URLSite 	= urlBaseSite;
		var tituloSite 	= nomeSite;
		if(window.sidebar){
			window.sidebar.addPanel(tituloSite, URLSite,"");
		}
		else if( window.opera && window.print ){
			var mbm = document.createElement('a');
			mbm.setAttribute('rel','sidebar');
			mbm.setAttribute('href',URLSite);
			mbm.setAttribute('title',tituloSite);
			mbm.click();
		}
		else if(document.all){
			window.external.AddFavorite(URLSite, tituloSite);
		}
	},

	/*
	*	@desc Método para abrir pop-ups
	*	@param URL (String) Endereço para abrir na janelas
	*	@param nomeJanela (String) Nome para dar à Janela de HTML
	*	@param propriedades (Object) Objecto com várias propriedades para definir o pop-up
		@retun void
	*/
	abrirJanela: function(URL,nomeJanela,propriedades) { 
		window.open(URL,nomeJanela,propriedades);
	},

	/*
	*	@desc Método para limpar um campo de texto qd tem um texto por defeito
	*	@param obj (Mixed) Tanto pode ser referencia ao obj, como o id do elemento
	*	@param txt (String) Texto para verificar se é igual. Se for, limpa o campo
	*	@retun void
	*/
	_limpaCampo: function(obj,txt){
		$(obj).value = ($(obj).value==txt) ? '' : $(obj).value; 
	},

	/*
	*	@desc Método para o texto de um campo para o outro
	*	@param campoDestino (String) campo de origem do texto
	*	@param campoOrigem (String) campo para clonar o texto
	*	@retun void
	*/
	copiaValorCampo: function(campoOrigem, campoDestino){
		if($(campoOrigem).value!=null && $(campoDestino)!=null){
			$(campoDestino).value = $F(campoOrigem);
		}
	},

	/*	+++++++++++++++++++++++++++++++++++++++++++++++
				MÉTODOS PÚBLICOS PARA FORMS 
		+++++++++++++++++++++++++++++++++++++++++++++++*/

	formCombo_add: function(comboObj,txtLabel,valorOpcao){
		if($(comboObj)!=null){
			var  nova_opcao = document.createElement("option");
			nova_opcao.appendChild(document.createTextNode(txtLabel));

			// so colocamos valor na combo se trouxer o parametro do valor
			if(arguments.length==3){	
				nova_opcao.setAttribute("value",valorOpcao);
			}
			$(comboObj).appendChild(nova_opcao);
		}
	},

	formCombo_remove: function(comboObj,indexOpcaoRemover){
		if($(comboObj)!=null){
			$(comboObj).options[indexOpcaoRemover] = null;
		}
	},

	formCombo_limpa: function(comboObj){
		if($(comboObj)!=null){
			for(var i=$(comboObj).options.length-1; i>=0; i--){
				tmpl.tools.formCombo_remove(comboObj,i);
			}
		}
	},

	formCombo_selectFirstOption: function(comboObj){
		if($(comboObj)!=null){
			optionActiva = false;
			for(var i=$(comboObj).options.length-1; i>=0 && !optionActiva; i--){
				if($(comboObj).options[i].selected){
					$(comboObj).options[i].selected = false;
					optionActiva = true;
				}
			}
			$(comboObj).options[0].selected = true;
		}
	}
}

/*	+++++++++++++++++++++++++++++++++++++++++++++++
				CLASSE CORE TMPL 
	+++++++++++++++++++++++++++++++++++++++++++++++*/

var coreTmpl = Class.create();

/*
*	@desc Método 'prototype' da classe coreTmpl que define quais os Métodos que torna público e disponíveis a quem instanciar esta classe
*			- Esta classe serve para controlar a apresentação de parte do interface do portal.
*			- É responsável por receber pedidos do front-end (navegação, chamadas aos scripts via AJAX e receber respostas do AJAX;
*			- Usa classes/Métodos da superClasse Prototype.js
*	@retutn void
*/
coreTmpl.prototype = {

	/*
	*	@desc Método constructor 'prototype' da classe coreTmpl
	*		  Define logo por defeito algumas variáveis privadas da classe
	*	@param canal (string) nome do canal onde estamos a executar a classe
	*	@param idioma (string) código do idioma do user, qd se inicializa a clase
	*	@retutn void
	*/
	initialize: function(canal,idioma){ 
		this.canalDefault		= canalDefault;
		this.urlBase			= urlBaseSite;
		this.srcImgPreloader	= srcImgPreloader;
		this.setNomeCanal(canal);
		this.setIdioma(idioma);
		this.tools				= this._initTools();
		//this.msgStatusConfig	= new Object();
		//this._initMsgBrowserStatus();

		this.SIRFConfigActivo = false;
		this._activaSIRFConfig();
	},

	/*	++++++++++++++++++++++++++++++++++++++++++++++++++++
				SETTERS E GETTERS DE CONFIGS DA CLASSE 
		++++++++++++++++++++++++++++++++++++++++++++++++++++ */

	/*
	*	@desc Método para setar o nome do canal em que estamos na variável da classe 'canal'
	*		  Caso venha vazia, coloca o canal por defeito que é a homepage
	*	@param nomeCanal (string)	
	*	@return void
	*/
	setNomeCanal: function(nomeCanal){
		this.canal = (nomeCanal.length >0) ? nomeCanal : canalDefault;	
	},

	/*
	*	@desc Método para devolver o nome do canal em que estamos
	*	@return string	nomeCanal
	*/
	getNomeCanal: function(){
		return this.canal;	
	},

	/*
	*	@desc Método para setar o código do idioma em que estamos
	*		  Caso venha vazia, coloca o idioma por defeito que é 'PT'
	*	@param idioma (string)
	*	@return void
	*/
	setIdioma: function(idioma){
		this.idioma = (idioma.length >0) ? idioma : idiomaDefault;	
	},

	/*
	*	@desc Método para devolver o codigo do idioma em que estamos
	*	@return string	idioma
	*/
	getIdioma: function(){
		return this.idioma;	
	},

	/*
	*	@desc Método instanciar a classe _coreTools.js
	*	@return object	Devolve ums instÃ¢ncia da classe Tools
	*/
	_initTools: function(){
		return new coreTools();
	},

	/*
	*	@desc Método para setar as propriedades para a msg no rodapé do browser (Status). Só funciona no IE
			  Só é chamada uma vez cada vez que é instanciada a classe
	*	@return object	Boolean
	*/
	_initMsgBrowserStatus: function(){
		window.onerror = null;
		this.msgStatusConfig['browser_ok'] = (((navigator.appName == 'Netscape') && (parseInt(navigator.appVersion) >= 3)) || ((navigator.appName == 'Microsoft Internet Explorer') && (parseInt(navigator.appVersion) >= 4)));
		if (this.msgStatusConfig['browser_ok']){
			this.msgStatusConfig['espaco']		= "                                        "; // 40 espaços
			this.msgStatusConfig['mensagem']	= "www.minfo.pt - a sua loja a um clique";
			this.msgStatusConfig['tempString']	= this.msgStatusConfig['espaco'] + this.msgStatusConfig['espaco'] + this.msgStatusConfig['espaco'] + this.msgStatusConfig['mensagem'] + this.msgStatusConfig['espaco'] + this.msgStatusConfig['espaco'] + this.msgStatusConfig['espaco'];
			this.msgStatusConfig['base']		= 0;
			this.msgStatusConfig['browser_ok'];
		}
		this.msgStatusConfig['browser_ok'];
	},

	/*
	*	@desc Método para activar a msg no rodapé do browser (Status). Só funciona no IE
	*	@return object	Boolean
	*/
	_activaMsgBrowserStatus: function(){
		if (this.msgStatusConfig['browser_ok']){
			window.status = this.msgStatusConfig['tempString'].substring(this.msgStatusConfig['base'], this.msgStatusConfig['base'] + 110);
			this.msgStatusConfig['base']++;
			if (this.msgStatusConfig['base'] > this.msgStatusConfig['tempString'].length - 110){
				this.msgStatusConfig['base'] = 0;
				setTimeout('tmpl._activaMsgBrowserStatus()', 0);
			}
			else{
				setTimeout('tmpl._activaMsgBrowserStatus()', 95);
			}
		}
	},

	/*
	*	@desc Método para dar focus ao campo da Pesquisa
	*	@return object	Void
	*/
	_ganharFocusPesquisa: function(){
		$('pesquisa').focus();
	},

	_pesquisar: function(){
		var palavra=$('pesquisa').value;
		if(palavra!=''){
			$('pesq').submit();
		}
		tmpl._ganharFocusPesquisa();
		return false;
	},

	/*
	*	@desc Método para validar o formulario da pesquisa no tmpl global
	*	@return mixed	Ou devolve boolean (falso) caso esteja vazio o campo, ou submete o formulario
	*/
	_pesquisarTopo: function(){
		if (verificarCampos('alert','_pesquisaInput','R','Palavra para Pesquisar')){
			var palavra = $('_pesquisaInput').value;
			$('pesquisaTopo').action += '&gwf_pesquisa='+ palavra;
			$('pesquisaTopo').submit();
		}
		return false;
	},

	/*
	*	@desc			Método para validar o formulario de inscricao nas Newsletters no tmpl global HTML
	*	@return mixed	Ou devolve boolean (falso) caso esteja vazio o campo, ou submete o formulario
	*/
	_inscreverNewsletter: function(){
		tmpl.tools._limpaCampo('nome','Insira nome');
		tmpl.tools._limpaCampo('mail','Insira e-mail');
		if (verificarCampos('alert',
			'nome','R','Nome',
			'mail','RisEmail','Endereço de E-mail',
			'data_nascimento','isData','Data de Nascimento',
			'telefone','isContacto','Telefone',
			'site','isURL','Site'
			)){
			$('registoNewsletters').submit();
		}
		return false;
	},

	/*	++++++++++++++++++++++++++++++++++++++++++++++++++++
		  MÉTODOS PARA TRABALHAR COM DIVS E O SCRIPTACULOUS 
		++++++++++++++++++++++++++++++++++++++++++++++++++++ */
	
	/**
	 * @description	Mostra ou esconde a opção de mostrar os divs dos grupos e famílias
					Altera tb a classe de CSS do TR
	 * @params objTr (String) ID do TR para controlar
	 * @params objDiv (String) Nome do div para mostrar ou esconder
	 * @return Void		Não devolve nada... muda as visibilidades de div's	
	 * @access public
	*/
	_expandirOpcao: function(objTr, objDiv){
		var div = $(objDiv);
		var tr = $(objTr);
		var nomeTr = tr.id.substring(tr.id.indexOf('_')+1,tr.id.length);
		//alert(tr.id + '- ' +tr.className);
	
		if(div.className=='opcaoInvisivel'){
			div.className='opcaoVisivel';
			tr.className= (tr.className=='listagemGrupoMenos')?'listGrupoFamiliasFechar':'listGrupoFamiliasFechar_on';
			tr.title = 'Ocultar famílias do grupo "'+nomeTr+'"';		
		}
		else{
			div.className='opcaoInvisivel';
			tr.className= (tr.className=='listagemGrupoMais')?'listGrupoFamiliasAbrir':'listGrupoFamiliasAbrir_on';
			tr.title = 'Ver famílias do grupo "'+nomeTr+'"';
		}
	},
	
	/**
	 * @desc Mudar a classe de CSS e o atributo 'title' dos TR's dos grupos de produtos. É activado nos eventos onMouseOver e onMouseOut nos TR's
	 * @params objTr (String) ID do obj para controlar
	 * @params nomeTr (String)	Nome do obj para controlar
	 * @return Void		Não devolve nada	
	 * @access public
	*/
	_controlaOverTr: function(objTr, nomeTr){
		var tr = $(objTr);
	
		//alert(tr.className);
		switch(tr.className){
			case 'listGrupoFamiliasFechar':
				tr.className='listGrupoFamiliasFechar_on';
				tr.title='Ocultar famílias do grupo "'+nomeTr+'"';
			break;
			case 'listGrupoFamiliasFechar_on':
				tr.className='listGrupoFamiliasFechar';
				tr.title='Ocultar famílias do grupo "'+nomeTr+'"';
			break;
			case 'listGrupoFamiliasAbrir':
				tr.className='listGrupoFamiliasAbrir_on';
				tr.title='Ver famílias do grupo "'+nomeTr+'"';
			break;
			case 'listGrupoFamiliasAbrir_on':
				tr.className='listGrupoFamiliasAbrir';
				tr.title='Ver famílias do grupo "'+nomeTr+'"';
			break;
		}
	},
	
	/*
	* @desc	Metodo publico que permite expandir e mostrar uma série de DIvs no template
	*		Muda ainda o texto da Label de acordo com a acção que efectuou
	*		Para que funcione, ele verifica a acção pelo sinal '+', que deve estar por defeito no texto da Label
	* @param objArray (Array) Array com os Divs para manipular
	* @param camposArray (Array) Array com os Divs com o titulos para manipular
	* @param txtLabel (String) Div com a Label de texto para alterar
	* @return void
	*/
	mostraEscondeTudo: function(objArray,camposArray,txtLabel){
		campoTxt	= $(txtLabel);
		accao 		= (campoTxt.innerHTML.indexOf('+')==-1) ? 'esconder' : 'mostrar';
		// mandamos abrir ou fechar os Divs
		this.fechaDivs(objArray,camposArray);
		// trocamos o texto
		switch(accao){
			case 'esconder':
				campoTxt.innerHTML = 'Expandir Tudo [+]';
			break;
			case 'mostrar':
				campoTxt.innerHTML = 'Esconder Tudo [-]';
			break;
		}
	},

	/*
	* @desc	Metodo que serve de handler para fechar todos os divs duma página, qd ela arranca, e usa o mostraDiv pra tratar do assunto
	* @param objArray (Array) array com os id's dos objectos para fechar ;)
	* @param camposArray (Array) array com os id's dos campos para fechar ;)
	* @return Void
	*/
	fechaDivs: function(objArray, camposArray){
		for(var i=0; i < objArray.length; i++){
			var obj = $(objArray[i]);
			if(obj != undefined){
				obj.estado = true;
				this.slideDiv(obj.id,camposArray[i])
			}
		}
	},

	/*
	* @desc	Metodo que serve de handler para tornar invisíveis um array de objectos
	* @param objArray (Array) array com os id's dos objectos para fechar ;)
	* @return Void
	*/
	escondeDivs: function(objArray){
		for(var i=0; i < objArray.length; i++){
			var obj = $(objArray[i]);
			if(obj != undefined){
				$(obj).hide();
				obj.aberto = false;
			}
		}
	},

	/*
	* @desc	Método que serve de handler todas as funções que queiram alterar a visibilidade de divs com slides
	* @param nomeDiv (String) nome do objecto para 'slidar' ;)
	* @param nomeLabel (String) nome da label de texto ou imagem para alterar ;)
	* @return Void
	*/
	slideDiv: function(nomeDiv, nomeLabel){
		//alert(arguments.length);
		var obj = $(nomeDiv);
		var tipoCampo;
		var campoObj = $(nomeLabel);
		//alert(typeof($(nomeLabel)));

		if(nomeLabel!='' && nomeLabel != undefined){
			if(campoObj.src){	
				tipoCampo = 'img'; 
				var caminhoImgs = (campoObj != undefined) ? campoObj.src.substring(0,campoObj.src.lastIndexOf('/')+1) : null ;
			}
			else if(campoObj.innerHTML != undefined){	
				tipoCampo = 'txtLabel';
				txtLabel_Original = campoObj.innerHTML;
				if(txtLabel_Original.indexOf('[+]')!=-1){
					regra = new RegExp("(\\[\\+\\])");	// sempre que se usa uma expressão com o obj de regExp, tem que se escapar com 2 \\ os caracteres textuais que queremos verificar
					//regra = /(\[\+\])/;
					txtLabel = txtLabel_Original.replace(regra, '[-]');
				}
				else if(txtLabel_Original.indexOf('[-]')!=-1){
					regra = new RegExp("(\\[-\\])");
					txtLabel = txtLabel_Original.replace(regra, '[+]');
				}
				else{
					txtLabel = txtLabel_Original;
				}
			}
		}

		obj.aberto = (obj.aberto == undefined || obj.aberto == true) ? true : false ;
		if(!obj.aberto){		
			Effect.SlideDown(obj, {
				duration:.50
			});

			if(tipoCampo != undefined){
				switch(tipoCampo){
					case 'img':
						//campoObj.src = caminhoImgs + 'tmpl_admin_fundotd_erro_btn_fechar.gif';
					break;
					case 'txtLabel':
						campoObj.innerHTML = txtLabel;
					break;

					default:
					break;
				}
			}	
		}

		else{						
			Effect.SlideUp(obj,{
				duration:.48
			});

			if(tipoCampo != undefined){
				switch(tipoCampo){
					case 'img':
						//campoObj.src = caminhoImgs + 'tmpl_admin_fundotd_erro_btn_abrir.gif';
					break;

					case 'txtLabel':
						campoObj.innerHTML = txtLabel;
					break;

					default:
					break;
				}
			}
		}
		obj.aberto = !obj.aberto;
	},

	/*
	* 	@desc Objecto/Método que esconde os divs
	*
	* 	@param divEsconder (String) o id do div para eliminar
	* 	@param efeitoClass (String) o efeito/acção para aplicar
	* 	@return Void
	*/
	escondeDiv: function(divEsconder, efeitoClass){
		if($(divEsconder)!=null){
			switch(efeitoClass){
				case 'SlideUp':
					Effect.SlideUp(divEsconder,{
						duration:.48,
						afterFinish: tmpl.eliminaDiv
						});
				break;

				case 'SwitchOff':
					Effect.SwitchOff(divEsconder,{
						duration:.48,
						afterFinish: callback
					});
				break;
			}
		}
	},

	/*
	* 	@desc Objecto/Método que elimina os divs
	*
	* 	@param divEliminar (String) o id do div para eliminar
	* 	@return Void
	*/
	eliminaDiv: function(divEliminar){
		if($(divEliminar)!=null){
			new Element.remove($(divEliminar.element.id));
		}
	},

	/*	++++++++++++++++++++++++++++++++++++++++++++++++++++
				Metodos PARA TRABALHAR COM O sIRF
		++++++++++++++++++++++++++++++++++++++++++++++++++++ */

	/*
	* @desc Metodo para activar o sIRF no template. Chamado quando o template arranca
	*
	* @return Void
	*/
	_activaSIRFConfig: function(){

		if(typeof(sIFR)=='undefined')
			return;

		if(!this.SIRFConfigActivo)
			this._initSIRFConfig();

		window.geometric231 = {src: urlBaseSite + '/_include/flash/sIRF_geometric231.swf'};
		sIFR.activate(window.geometric231);
		this._replaceSIRFBulk(['titCanal', 'titCanal_2','titSeccao_1','titSeccao_2']);
	},


	/*
	* @desc		Metodo para definir as classes de css para substituir com o sIRF
	*
	* @return Void
	*/
	_initSIRFConfig: function(){

		this.SIRFConfig = {		titCanal	: [	'.sIFR-root {font-size: 20; color: #297ECB; leading: -16 }',
												'a { font-size: 20; text-decoration: none; leading: -16 }',
												'a:link { color: #297ECB; }',
												'a:hover { color: #2B86D5; }'
												],
								titCanal_2	: [	'.sIFR-root {font-size: 20; color: #297ECB; leading: -16 }',
												'a { font-size: 20; text-decoration: none; leading: -16 }',
												'a:link { color: #297ECB; }',
												'a:hover { color: #2B86D5; }'
												],
								titSeccao_1	: [	'.sIFR-root {font-size: 17; color: #9C3434; leading: -9 }',
												'a { font-size: 17; text-decoration: none; leading: -9 }',
												'a:link { color: #9C3434; }',
												'a:hover { color: #CC3300; }'
												],
								titSeccao_2	: [	'.sIFR-root {font-size: 17; color: #297ECB; leading: -9 }',
												'a { font-size: 17; text-decoration: none; leading: -9 }',
												'a:link { color: #297ECB; }',
												'a:hover { color: #2B86D5; }'
												],
								titSeccao_3 : [	'.sIFR-root {font-size: 24; color: #337FB5; leading: -9 }',
												'a { font-size: 24; text-decoration: none; leading: -9 }',
												'a:link { color: #337FB5; }',
												'a:hover { color: #337FB5; }'
												]
							};
		this.SIRFConfigActivo = true;
	},

	/*
	* @desc		Metodo para reactivar os titulos em flash via javascript (Depois de serem carregados via AJAX por exemplo)
	*
	* @param tipos (Array) Um array com os tipos/classes de css de titulo que queremos activar
	* @return Void
	*/
	_replaceSIRFBulk: function(tipos){

		if(typeof(tipos)=='object' && tipos.length >0){
			for(var i=0, c=tipos.length; i<c; i++){
				if(this.SIRFConfig[tipos[i]]){
					sIFR.replace(window.geometric231, {	selector	: '.'+tipos[i],
														css			: this.SIRFConfig[tipos[i]],
														wmode		: 'transparent'
													}
							);
				}
			}
		}
	},

	/*	++++++++++++++++++++++++++++++++++++++++++++++++++++
					MAPAS DO GOOGLE (API GOOGLE MAPS)
		++++++++++++++++++++++++++++++++++++++++++++++++++++ */

	/*
	* @desc				Método para implementar a API do Google Maps
	*					Basta ser chamado num template que tenha o respectivo DIV, com um objecto com várias propriedades para desenhar o mapa:
						Para que a API funcione o site tem que estar registado no Google. Fazer registo em http://www.google.com/apis/maps/signup.html
	* @access			public
	* @param dadosMapa (Array) Um array/objecto com as seguintes props:
						- icones: Array (Array com a localização de cada icone para desenhar no mapa)
						- div_mapa: String (O id do div no template que vai albergar o mapa)
						- centro_mapa: Object (Objecto com 2 props para a localização do centro do mapa (Normalmente é o local para assinalar):
								- lat		: Inteiro (Latitude)
								- long 		: Inteiro (Longitude) 
						- zoom: Inteiro (O factor de zoom com que vai carregar o mapa: quanto mais alto, mais perto.
						- icone: Objecto com as seguintes props: 
								- imagem	: String (Nome do ficheiro da imagem),
								- largura	: Inteiro (largura da img em pixeis),	
								- altura	: Inteiro (altura da img em pixeis),
								- lat		: Inteiro (desvio HZ do centro do mapa em pixeis),	
								- long		: Inteiro (desvio VT do centro do mapa em pixeis)
						- icone_sombra: Objecto com as seguintes props: 
								- imagem	: String (Nome do ficheiro da imagem),
								- largura	: Inteiro (largura da img em pixeis),	
								- altura	: Inteiro (altura da img em pixeis),
								- lat		: Inteiro (desvio HZ do centro do mapa em pixeis),	
								- long		: Inteiro (desvio VT do centro do mapa em pixeis)
	* @return 			void
	*/
	getMapaGoogle: function(dadosMapa) {
		if (GBrowserIsCompatible()) {
			// criação do obj para o mapa			
			var map = new GMap2($(dadosMapa['div_mapa']));

			// colocamos o controle para o zoom e o tipo de mapa
			map.addControl(new GLargeMapControl());
			map.addControl(new GMapTypeControl());

			// Posição central do mapa
			map.setCenter(new GLatLng(dadosMapa['centro_mapa']['lat'], -dadosMapa['centro_mapa']['long']), dadosMapa['zoom']);		

			// Retiramos o 2, no caso de vir com www2, uma vez que o google precisa de aceder às imagens dos icones para as representar
			var regraValidacao = new RegExp("(www2)","g");
			urlImgsTmplSite = urlImgsTmplSite.replace(regraValidacao,'www');
			
			// vamos colocar icones no mapa
			for(i=0; i < dadosMapa['icones'].length; i++){
				var icon 			= new GIcon();
				icon.image 			= urlImgsTmplSite + dadosMapa['icone']['imagem'];
				icon.shadow 		= urlImgsTmplSite + dadosMapa['icone_sombra']['imagem'];
				icon.iconSize 		= new GSize(dadosMapa['icone']['largura'], dadosMapa['icone']['altura']);
				icon.shadowSize 	= new GSize(dadosMapa['icone_sombra']['largura'], dadosMapa['icone_sombra']['altura']);
				icon.iconAnchor 	= new GPoint(dadosMapa['icone']['lat'], dadosMapa['icone']['long']);
				//icon.infoWindowAnchor = new GPoint(5, 1);
				//adicionamos o icone e a sombra ao layout
				map.addOverlay(	new GMarker(new GLatLng(dadosMapa['icones'][i]['lat'],-dadosMapa['icones'][i]['long'] ), icon));
			}
		}
	}
}