/**
 * Projeto: SisTributacao
 *
 * @author Rômulo Augusto 
 */

/**
 * Substitui todas as ocorrências da String especificada pelo novo valor.
 * A propriedade é atribuída diretamente ao objeto String e deve ser usada
 * dessa forma:
 * Ex.: minhaString.replaceAll(oldString, newString);
 *
 * @param oldString: String a ser substituida.
 * @param newString: String que substituirá a antiga. 
 */
String.prototype.replaceAll = function(oldString, newString)
{
    var str = this;
    var pos = str.indexOf(oldString);
    
    while (pos > -1)
    {
		str = str.replace(oldString, newString);
		pos = str.indexOf(oldString);
	}
	
    return (str);
}

/**
 * Retira espaços em branco no início e no final da String.
 * A propriedade é atribuída diretamente ao objeto String e deve ser usada
 * dessa forma:
 * Ex.: minhaString.trim(); 
 */
String.prototype.trim = function()
{
	return this.replace(/^\s+|\s+$/g, "");
}

/**
 * Submete o formulário com a ação especificada.
 *
 * @param formName: nome do formulário a ser submetido.
 * @param action: ação que será executada no servidor. 
 * @param task: tarefa que será executada no servidor.
 */
function doPost(formName, action, task)
{
	var form = document.getElementById(formName);
	
	var formAction = document.createElement("input");
	formAction.name = "action";
	formAction.value = action;
	formAction.type = "hidden";
	
	var formTask = document.createElement("input");
	formTask.name = "task";
	formTask.value = task;
	formTask.type = "hidden";
	
	form.appendChild(formAction);
	form.appendChild(formTask);
	
	form.submit();
}

/**
 * Reseta o formulário.
 * 
 * @param formName: nome do formulário. 
 */
function resetForm(formName)
{
	var form = document.getElementById(formName);
	var divMsg = document.getElementById("msg");
	
	if(divMsg)
	{
		divMsg.innerHTML = "";
		divMsg.style.visibility = "hidden";
	}
	
	form.reset();
}

/**
 * Redireciona para a página especificada.
 * 
 * @param page: página alvo. 
 */
function redirect(page)
{
	var separator = page.indexOf("?") > -1 ? "&" : "?";
	window.location.href = page + separator + "t=" + getTime();
}

/**
 * Retorna o tempo atual da seguinte forma: yyyyMMddHHmmss;
 */
function getTime()
{
	var time = new Date();
	
	return time.getYear() + "" + time.getMonth() + "" + time.getDay() + "" + time.getHours() + "" + time.getMinutes() + "" + time.getSeconds();
}

/**
 * Verifica se a tecla digitada é uma tecla padrão válida, como "setas" ou "backspace".
 * 
 * @param key: tecla digitada.
 * @return
 * 		booleano indicando se a tecla é ou não válida.
 */
function isValidKey(key)
{
	var retorno = false;
	var teclas = new Array(0, 8, 9, 13, 16, 17, 18, 20, 27, 28, 29, 30, 31, 35, 36, 37, 39, 46);

	for (var i = 0; i < teclas.length; i++)
	{
		if(teclas[i] == key)
		{
			retorno = true;
			break;
		}
	}
	
	return retorno;
}

/**
 * Verifica se a tecla digitada é um dígito.
 * 
 * @param keyCode: tecla digitada.
 * @return
 * 		booleano indicando se a tecla é ou não um dígito.
 *
 * Obs.: As teclas padrões válidas não são consideradas para validação.
 */
function isDigit(keyCode)
{
	return ("0123456789".indexOf(String.fromCharCode(keyCode)) > -1) || (isValidKey(keyCode));
}

/**
 * Recupera a tecla que foi digitada de acordo com o browser utilizado.
 * 
 * @param event: evento disparado.
 * @return
 * 		código da tecla. 
 */
function getKeyCode(event)
{
	var key;
	
	if (event.which)
		key = event.which;

	else
		key = event.keyCode;
	
	return key;
}

/**
 * Formata um campo de texto com a máscara especificada.
 * Utilizado com o evento "onkeypress".
 *
 * Tipos de formatação:
 *	- '#': Aceita apenas números.
 *	- '$': Aceita apenas letras.
 *	- '?': Aceita números e letras.
 *
 * @param field: campo que será formatado.
 * @param mask: máscara que será aplicada ao campo.
 *
 * Obs.: O campo só aceitará o número de caracteres especificados na máscara.
 */
function formatMask(field, mask, event)
{
	var retorno = false;
	var ntecla = getKeyCode(event);
	
	var tecla = String.fromCharCode(ntecla);

	var size = mask.charAt(field.value.length);

	if(isValidKey(ntecla))
	{
		retorno = true;
	}
	else if ((size == "?") || (size == "#") || (size == "$"))
	{
		retorno = verifyMask(tecla, size);
	}
	else
	{
		field.value += mask.charAt(field.value.length);
		size = mask.charAt(field.value.length);
		
		if(mask.charAt(field.value.length - 1) == tecla)
			retorno = false;
		else
			retorno = verifyMask(tecla, size);
	}
	
	return retorno;
}

/**
 * Verifica qual a máscara que está sendo utilizada.
 *
 * Tipos de máscara: 
 *	- '#': Aceita apenas números.
 *	- '$': Aceita apenas letras.
 *	- '?': Aceita números e letras.
 * 
 * @param key: chave a ser analisada.
 * @param maskType: tipo da máscara.
 *
 * @return
 * 		boolean indicando se a chave foi encontrada para ser substituída de acordo 
 * 		com o tipo de máscara especificado. 
 */
function verifyMask(key, maskType)
{
	var retorno = false;
	
	switch(maskType)
	{
		case "?":
			retorno = ("0123456789ABCDEFGHIJKLMNOPQRSTUVXWYZÇÁÀÉÈÃÕÏÖÜÄ".toLowerCase().indexOf(key.toLowerCase()) > -1);
			break;
			
		case "#":
			retorno = ("0123456789".indexOf(key) > -1);
			break;
			
		case "$":
			retorno = ("ABCDEFGHIJKLMNOPQRSTUVXWYZÇÁÀÉÈÃÕÏÖÜÄ".toLowerCase().indexOf(key.toLowerCase()) > -1);
			break;
			
		default:
			retorno = false;
			break;
	}
	
	return retorno;
}

/**
 * Formata o campo de texto para apresentação de números decimais.
 * Utilizado com o evento "onkeypress".
 * 
 * @param field: campo que será formatado.
 * @param maxLength: número máximo de caracteres que o campo deverá ter.
 */
function formatDecimalValue(field, maxLength, event)
{
	var retorno = false;
	var tecla = getKeyCode(event);

	vr = field.value;
	vr = vr.replaceAll("/", "");
	vr = vr.replaceAll(",", "");
	vr = vr.replaceAll(".", "");

	var tam = vr.length;
	
	if (tam < maxLength && tecla != 8 && tecla != 13 && tecla != 9)
	{
		tam = vr.length + 1;
	}
	
	if (tecla == 8)
	{
		tam -= 1;
	}

	if (isDigit(tecla))
	{
		retorno = true;
		
		if (tam <= 2)
		{
			field.value = vr;
		}
		
		if ((tam > 2) && (tam <= 5))
		{
			field.value = vr.substr(0, tam - 2) + "," + vr.substr(tam - 2, tam);
		}
		
		if ((tam >= 6) && (tam <= 8))
		{
			field.value = vr.substr(0, tam - 5) + "." + vr.substr(tam - 5, 3) + "," + vr.substr(tam - 2, tam);
		}
		
		if ((tam >= 9) && (tam <= 11))
		{
			field.value = vr.substr(0, tam - 8) + "." + vr.substr(tam - 8, 3) + "." + vr.substr(tam - 5, 3) + "," + vr.substr(tam - 2, tam);
		}

		if ((tam >= 12) && (tam <= 14))
		{
			field.value = vr.substr(0, tam - 11) + "." + vr.substr(tam - 11, 3) + "." + vr.substr(tam - 8, 3) + "." + vr.substr(tam - 5, 3) + "," + vr.substr(tam - 2, tam);
		}
		
		if ((tam >= 15) && (tam <= 17))
		{
			field.value = vr.substr(0, tam - 14) + "." + vr.substr(tam - 14, 3) + "." + vr.substring(tam - 11, 3) + "." + vr.substr(tam - 8, 3) + "." + vr.substr(tam - 5, 3) + ',' + vr.substr(tam - 2, tam);
		}
	}
	
	return retorno;
}

/**
 * Adiciona um evento a um objeto, especificando a função que irá ser executada.
 * 
 *  @param object: objeto que será adicionado o evento.
 *  @param eventType: tipo do evento.
 *  @param functionToDelegate: função que será executada ao ser disparado o evento. 
 */
function addEvent(object, eventType, functionToDelegate)
{
	removeEvent(object, eventType, functionToDelegate);
	
	if (object.addEventListener)
		object.addEventListener(eventType, functionToDelegate, true);

	else if (object.attachEvent)
		object.attachEvent("on" + eventType, functionToDelegate);

}

/**
 * Adiciona um evento a um objeto, especificando a função que irá ser executada.
 * 
 *  @param object: objeto que será adicionado o evento.
 *  @param eventType: tipo do evento.
 *  @param functionToRemove: função que será executada ao ser disparado o evento.
 */
function removeEvent(object, eventType, functionToRemove)
{
	if (object.removeEventListener)
		object.removeEventListener(eventType, functionToRemove, true);
	
	else if(object.detachEvent)
		object.detachEvent("on" + eventType, functionToRemove);

}

