/**
 * Resolve um problema nas tabelas quando algumas colunas são escondidas ao redimensionar horizontalmente a janela.
 */
var updateColspan = function (index, element) {
	var el = $(element),
	cols = el.closest("table").find("> thead th:hidden").map(function (i, v) {
		return v.cellIndex;
	}),
	oldColSpan = parseInt(el.data("oldcolspan"), 10);

	if (!oldColSpan) {
		el.data("oldcolspan", oldColSpan = (parseInt(el.attr("colspan"), 10) || 1));
	}

	el.attr("colspan", oldColSpan - cols.filter(function (i, v) {
		return (element.cellIndex <= v && v < oldColSpan);
	}).length);
};
$(window).resize(function () {
	$("td[colspan]").each(updateColspan);
});
//Pode não ser a melhor estratégia, mas é a melhor que conheço
//Resolve problema do toggler do DataTable
$(document).bind("DOMNodeInserted", function (e) {
	var list = $("td[colspan]", e.target);
	if (list.length) {
		setTimeout(function () {
			list.each(updateColspan);
		}, 0);
	}
});
/**
 * FUNCOES CNIS (LEGADO)
 */
function limparFormulario(){
	var input       = document.getElementsByTagName('input');
	var select      = document.getElementsByTagName('select');
	var textarea    = document.getElementsByTagName('textarea');    
	for (var i=0; i<select.length; i++) {
		if (select[i].disabled == false) {
			select[i].selectedIndex = 0;
		}
	}
	for(var i=0; i<textarea.length; i++) {
		if (textarea[i].disabled == false) {
			textarea[i].value = '';
		}
	}
	for(var i=0; i<input.length; i++)
		if (input[i].disabled == false) {
			switch (input[i].type){
			case 'text'     :   input[i].value      = ''; break;
			case 'radio'    :   input[i].checked    = ''; break;
			case 'checkbox' :   input[i].checked    = ''; break;                
			}
		}
}
function checkUncheckAll(theElement, formName, fieldName) {
	if (!document.forms[formName]) {
		return;
	}
	var objCheckBoxes = document.forms[formName].elements[fieldName];
	if (!objCheckBoxes) {
		return;
	}
	var countCheckBoxes = objCheckBoxes.length;
	for (var i = 0; i < countCheckBoxes; i++) {
		objCheckBoxes[i].checked = theElement.checked;
	}
}
function uncheckMarcarTodos(theElement, formName, fieldName) {
	if (!theElement.checked) {
		var objCheckBox = document.forms[formName].elements[fieldName];
		objCheckBox.checked = false; 
	}
}
/**
 * GERAL
 */
/*
 * Ignora acento na filtragem
 * Utilizado no PickList
 * 
 * Exemplo de uso:
 *  
 * filterMatchMode="custom" filterFunction="ignoraAcentoFilter"
 */
function escapeRegExp (str) {
	return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
};
function removeAcentoLowerCase (str) {
	return str.toLowerCase().replace(/[\u00E0-\u00E5\u00E7-\u00EF\u00F1-\u00F6\u00F9-\u00FC]/gi, function (match) {
		return "aaaaaaceeeeiiiinooooouuuu".charAt("\u00E0\u00E1\u00E2\u00E3\u00E4\u00E5\u00E7\u00E8\u00E9\u00EA\u00EB\u00EC\u00ED\u00EE\u00EF\u00F1\u00F2\u00F3\u00F4\u00F5\u00F6\u00F9\u00FA\u00FB\u00FC".indexOf(match));
	});
};
function ignoraAcentoFilter(itemLabel, filterValue) {
	//return (0 <= removeAcentoLowerCase(itemLabel).indexOf(removeAcentoLowerCase(filterValue)));
	var re = new RegExp(escapeRegExp(removeAcentoLowerCase(filterValue)).replace(/\\([\*\?])/g, ".$1"));
	return re.test(removeAcentoLowerCase(itemLabel));
};
/*
 * [Esta funï¿½ï¿½o reenvia o formulï¿½rio atual dados os valores de method e action]
 * [O parametro action ï¿½ opicional]
 *
 * @param method [String de identificaï¿½ï¿½o do method]
 * @param [action] [String de identificaï¿½ï¿½o do action]
 *
 */
var submit = false;
function verificarSubmit() {
	if (submit) {
		return false;
	}
	submit = true;
	return true;
};
function goMethod(method, action) {
	frm = document.forms[0];
	frm.target = "_self";
	if (method == 'default')
		frm.removeChild(frm.method);
	else
		frm.method.value = method;
	if(action != undefined)
		frm.action = action;
	frm.submit();
};
function PFbyId (id) {
	if (id) {
		for (var propertyName in PrimeFaces.widgets) {
			var wdgt = PrimeFaces.widgets[propertyName];
			if (wdgt && wdgt.id === id) {
				return wdgt;
			}
		}
	}
}

//Quando o contador alcançar zero, ai sim o componente deve ser habilitado.
//Utilizado no preenchimento de remunerações (Requerimento Atualização Remuneração) 
function ToggleCounter (selector) {
	var counter = 0,
	_this = this,
	components = $(selector || "button").map(function (index, node) {
		return node.id && PFbyId(node.id);
	}).filter(function (index, value) {
		return value;
	});

	components.each(function (index, node) {
		var jq = node.getJQ(); 
		jq.data("onclick", jq.attr("onclick") || "")
			.on("click", function (ev) {
			return _this.process($(this).data("onclick"), this, ev);
		}).attr("onclick", "");
	});

	this.enable = function () {
		if (0 >= --counter) {
			counter = 0;

			if (this.action) {
				PF('bloquearTelaWidget').unblock();
				this.action.trigger("click");
				delete this.action;
			}
		}
	}.bind(this);

	this.disable = function () {
		++counter;
	}.bind(this);
	
	this.process = function (cb, t, e) {
		if (0 >= counter) {
			return eval("(function () {" + cb + "}())");
		} else {
			e.preventDefault();
			_this.action = $(t);
			PF('bloquearTelaWidget').block();
			return true;
		}
	}.bind(this);

}
/*
 * [Esta funï¿½ï¿½o abre uma action em uma popup]
 *
 * @param action [Action a ser aberta]
 *
 */
function popupPesquisa(campo, action) {
	aux = window.open('about:blank','auxiliar','width=500, height=360, top=200, left=200, resize=yes');
	window.document.forms[0].target = 'auxiliar';
	window.document.forms[0].submit();
	varcampo = campo;
	window.document.forms[0].target = 'auxiliar';
	window.document.forms[0].method.value = 'unspecified';
	window.document.forms[0].action = action;
	var popup = document.createElement('input');
	popup.name = 'popup';
	popup.type = 'hidden';
	popup.value = 'S';
	window.document.forms[0].appendChild(popup);
	window.document.forms[0].submit();
	varcampo = campo;
}
/*
 * [ Esta funï¿½ï¿½o retorna o valor contido no objeto 'campo' para uma ]
 * [ variï¿½vel 'varcampo' da janela que a abriu. A janela atual ï¿½ fechada ]
 *
 * @param retornar [campo a ser retornado]
 *
 */
function retornar(campo) {
	opener.document.getElementById(opener.varcampo).value = document.getElementById(campo).value;
	window.close();
} 
/*
 * [ Esta funï¿½ï¿½o destaca os inputs ativos ]
 * [ O destaque ï¿½ feito atravï¿½s das classes de estilos campo e campoEmFoco]
 *
 *
 */
function inputfocus() {
	if (!document.getElementsByTagName) { return; }
	var inputs = document.getElementsByTagName("input");
	for(var i=0;i<inputs.length;i++) {
		var input = inputs[i];
		if(input.getAttribute("type")=="text") {
			input.onfocus=function onfocus() { this.className = "campoEmFoco"; };
			if(input.className=="campo")
				input.onblur=function onblur() { this.className = "campo"; };
				else
					input.onblur=function onblur() { this.className = "campoObrigatorio"; };
		} 
	}
}
/*
 * [Obtï¿½m um array com as medidas de tamanho da janela]
 * return [larguraPagina, alturaPagina, larguraJanela, alturaJanela]
 */
function obterTamanhoJanela() {
	var xScroll, yScroll;
	if (window.innerHeight && window.scrollMaxY) {	
		xScroll = document.body.scrollWidth;
		yScroll = window.innerHeight + window.scrollMaxY;
	} else if (document.body.scrollHeight > document.body.offsetHeight){ // Todos os browsers exceto Explorer Mac
		xScroll = document.body.scrollWidth;
		yScroll = document.body.scrollHeight;
	} else { // Explorer Mac... tambï¿½m funcionaria em Explorer 6 Strict, Mozilla e Safari
		xScroll = document.body.offsetWidth;
		yScroll = document.body.offsetHeight;
	}
	if (self.innerHeight) {	// Todos os browsers exceto Explorer
		larguraJanela = self.innerWidth;
		alturaJanela = self.innerHeight;
	} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict
		larguraJanela = document.documentElement.clientWidth;
		alturaJanela = document.documentElement.clientHeight;
	} else if (document.body) { // outros Explorers
		larguraJanela = document.body.clientWidth;
		alturaJanela = document.body.clientHeight;
	}	
	// para pï¿½ginas pequenas com altura total menor do que a janela 
	if(yScroll < alturaJanela){
		alturaPagina = alturaJanela;
	} else { 
		alturaPagina = yScroll;
	}
	// para pï¿½ginas pequenas com a largura menos do que a janela 
	if(xScroll < larguraJanela){	
		larguraPagina = larguraJanela;
	} else {
		larguraPagina = xScroll;
	}
	tamanhoJanela = new Array(larguraPagina,alturaPagina,larguraJanela,alturaJanela); 
	return tamanhoJanela;
}
/*
 * [ Mostra uma DIV representando uma Popup no centro da tela]
 *
 */
function mostrarDiv() {
	var tamanhoJanela = obterTamanhoJanela();
	document.getElementById('overlay').style.height = (tamanhoJanela[1] + 'px');
	document.getElementById('popup').style.display = 'block';
	document.getElementById('sombra').style.display = 'block';
	document.getElementById('overlay').style.display = 'block';
	document.getElementById('apopup').focus();
}
/*
 * [ Esconde a DIV representando uma Popup no centro da tela]
 *
 */
function esconderDiv() {
	window.top.document.getElementById('popup').style.display = 'none';
	window.top.document.getElementById('sombra').style.display = 'none';
	window.top.document.getElementById('overlay').style.display = 'none';
}
/*
 * [Esta funï¿½ï¿½o abre uma action em uma div]
 *
 * @param action [Action a ser aberta]
 *
 */
function abrirPopup(campo, action) {
	mostrarDiv();
	window.document.forms[0].target = 'frameCentral';
	window.document.forms[0].method.value = 'unspecified';
	window.document.forms[0].action = action;
	var popup = document.createElement('input'); 
	popup.name = 'popup';
	popup.type = 'hidden'; 
	popup.value = 'S'; 
	window.document.forms[0].appendChild(popup);
	window.document.forms[0].submit();
	varcampo = campo;
	// Focando o iframe
	document.getElementById("frameCentral").contentWindow.focus();
}
/*
 * [ Esta funï¿½ï¿½o retorna o valor contido no objeto 'campo' para uma ]
 * [ variï¿½vel 'varcampo' da janela que a abriu. A janela atual ï¿½ fechada ]
 *
 * @param retornar [campo a ser retornado]
 *
 */
function retornarValor(valor) {
	top.document.getElementById(top.varcampo).value = valor;
	esconderDiv();
}
function filtraNumeros(campo,tamMax,e) {
	if (isIE) {
		var tecla = e.keyCode;
		if (FiltraCampo(campo.value).length>=tamMax || (tecla < 48 || tecla > 57)) window.event.keyCode=0;
	} else {
		if (e.keyCode==0) {
			var tecla = e.which;
			if (FiltraCampo(campo.value).length>=tamMax || (tecla < 48 || tecla > 57)) {
				e.preventDefault();
			}
		}
	}
}
function FiltraCampo(valor) {//elimina todo caractere nï¿½o numï¿½rico
	var validos="0123456789";
	var s = "";
	for (var i=0; i<valor.length; i++) {  
		if (validos.indexOf(valor.substring(i,i + 1))>=0){
			s = s + valor.substring(i,i + 1);
		}
	}
	return s;
}

function formataData(campo, e) {
	var tecla = e? e.keyCode: 0;
	var s = FiltraCampo(campo.value);
	if (s.length>8) s=s.substr(0,8); //limita a 8 digitos
	var valido = false; //valida sÃ³ o tamanho
	if (s.length >= 2 && s.length <= 4) {
		s = s.substr(0, 2) + '/' + s.substr(2, 2);
	}else if (s.length >4) {
		s = s.substr(0, 2) + '/' + s.substr(2, 2) + '/' + s.substr(4, 4);
	}
	var formata = (tecla!=8);
	if (formata) campo.value = s;
	return valido;
}

/*
 * Função utilizada para trocar o enter por tab
 * Solucao temporaria para o problema de muliplos botoes nas telas porem o Enter aciona apenas
 * o primeiro botao.
 */
function handleEnter(buttonId, event) {
	var keyCode = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
	if (keyCode == 13) {
		var botao = document.getElementById(buttonId);
		botao.click();
		return false;
	}
	else
		return true;
} 
function disableEnter(event) {
	var keyCode = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
	if (keyCode == 13) {
		return false;
	}
	else
		return true;
} 
function adicionarLoadEvent(funcaoAdicionada) { 
	var funcaoExistente = window.onload;

	if (typeof window.onload != 'function') { 
		window.onload = funcaoAdicionada; 
	} else { 
		window.onload = function() {
			funcaoExistente(); 
			funcaoAdicionada(); 
		}; 
	} 
}
function enviarAbrangencia() {
	var selectTag = document.getElementById("domains");
	var abrangencia = selectTag.options[selectTag.selectedIndex].value;
	$('#domains').val(abrangencia);
	$('#formAbrangencia').submit();
}

function TimerMonitor (obj) {
	var timerMain,
	timerCountDown,
	startedAt,
	_this = this,
	mouseMove = function () {
		$(this).off("mousemove", mouseMove);
		_this.success();
	},
	zPad = function (v, n) {
		return (new Array(parseInt(n, 10)).join("0") + Math.floor(v)).slice(-n);
	};
	if (!obj.delay) {
		obj.delay = 0;
	}
	if (!obj.timeout) {
		obj.timeout = 0;
	}

	this.restart = function () {
		this.stop();
		startedAt = new Date();
		timerMain = setTimeout(function () {
			obj.mouse && obj.success && $(document).on("mousemove", mouseMove);
			(function countDown () {
				var t = _this.remainingTime();
				obj.counter && obj.counter(t, _this); 
				if (0 <= t) {
					if (obj.timer) {
						t /= 1000;
						$(obj.timer).text(zPad(t / 60, 2) + ":" + zPad(t % 60, 2));
					}
					timerCountDown = setTimeout(countDown, 1000);
				} else {
					$(document).off("mousemove", mouseMove);
					obj.failure && obj.failure(_this);
				}
			}());
			obj.start && obj.start(_this);
		}, obj.delay);
	};
	this.stop = function () {
		$(document).off("mousemove", mouseMove);
		clearTimeout(timerMain);
		clearTimeout(timerCountDown);
	};
	this.success = function () {
		obj.success(_this);
	};
	this.remainingTime = function () {
		return obj.timeout + obj.delay - (new Date() - startedAt);
	};
	
	this.restart();
};