	/************************************************ Máscara *****/
	// CONSTANTES
		BTN_BACKSPACE 	= 8;
		BTN_DELETE 	 	= 52;
		BTN_TAB			= 9;
		BTN_SETA_LEFT	= 37;
		BTN_SETA_RIGHT  = 39;
	//
	
	// Insere uma substring numa string e retorna a string resultada da concatenação
	function addSubstrAt(mainString, addString, positionToAdd) {
	
		var beforePos = mainString.substring(0,positionToAdd);
		var afterPos  = mainString.substring(positionToAdd,mainString.length);
		return (beforePos + addString + afterPos);
	
	}
	
	// Lê a posição do cursor do teclado em um INPUT text
	function getKeyboardCursorPosition(obj) {
		if (obj.createTextRange) { // Apenas para IE
		
			var tmpRange = document.selection.createRange().duplicate();
			tmpRange.moveEnd('character', obj.value.length)
			
			if (tmpRange.text == '') {
				return obj.value.length;
			}
			
			return obj.value.lastIndexOf(r.text)
		} else { // Firefox e outros
			return obj.selectionStart;
		}
	}
	
	// Recebe o apontador para um evento onkeypress disparado em um INPUT e retorna o código inteiro
	// correspondente na tabela de caracteres. 
	function getCharCode(e) {
		keynum = e.keyCode;
		if(keynum == 0) {
			keynum = e.charCode;
		}
		return keynum;
	}
	
	// Retorna true se a instância se a tecla disparada pelo evento onkeypress for uma tecla numérica, BACKSPACE ou DELETE
	function teclaNumerica(e,obj)	{
	
		var txt = obj.value;
		var keynum = getCharCode(e);
		var keychar;
		var numcheck;
		isException = ((keynum == BTN_BACKSPACE) || (keynum == BTN_DELETE));
		
		if ((keynum) && (!isException))	{
	      keychar = String.fromCharCode(keynum);
	      numcheck = /\d/;
		}

	   return ((isException) || (numcheck.test(keychar)));

	}
	
	// Se o código UNICODE passado pelo parâmetro "key" conter um código correspondente a uma das teclas do vetor arrExcecoes, retorna true.
	function isBotaoExcecao(key) {
		arrExcecoes = new Array(BTN_BACKSPACE,BTN_TAB);
		
		for(var item in arrExcecoes) {			
			if (key == arrExcecoes[item]) {
				return true;
			}
		}
		
		return false;
	}
	
		
	/***
	 * Deve aplicar uma máscara descrita pelo parâmetro arrRegra.
	 * cada índice 0 da segunda dimensão contém a posição anterior de onde deve ser inserido algum símbolo (ponto, traço, etc);
	 * cada índice 1 da segunda dimensão contém o símbolo que deverá ser adicionado 
	 * 
	 * o índice 0 da primeira dimensão indica se a máscara exige que sejam digitados apenas números ou não 
	 * (1 se apenas numeros, qualquer outro numero pra liberar qualquer char)
	 **/	
	function aplicarMascara(e,obj,arrRegra,tamanho_maximo) {
		
		key 	    = getCharCode(e);
		curPosition = getKeyboardCursorPosition(obj);	
		
		//
		if(isBotaoExcecao(key)) {
			return true;
		}
		
		// Verificação: estourou o tamanho máximo do campo segunda a máscara?
		if((curPosition >= tamanho_maximo) || (obj.value.length >= tamanho_maximo)){
			return false;
		}
		
		for(i=1;i<arrRegra.length;i++) {			
			precisaSerNumerico = (arrRegra[0] == 1);
			
			if((precisaSerNumerico) && (!teclaNumerica(e,obj))) {
				return false;
			} else if((curPosition==arrRegra[i][0]) && (obj.value.length < (tamanho_maximo - 1))) {
				obj.value = addSubstrAt(obj.value, arrRegra[i][1], curPosition);				 			
			} 
		}
		
	}
	
	
	function mascara_new(tipo, campo, teclaPress) {
		if (window.event)
		{
			var tecla = teclaPress.keyCode;
		} else {
			tecla = teclaPress.which;
		}
		
		var s = new String(campo.value);
		// Remove todos os caracteres à seguir: ( ) / - . e espaço, para tratar a string denovo.
		s = s.replace(/(\.|\(|\)|\/|\-| )+/g,'');
		
		tam = s.length + 1;
		
		if ( tecla != 9 && tecla != 8 ) {
			switch (tipo)
			{
			case 'CPF' :
				/*if (tam > 3 && tam < 7)
					campo.value = s.substr(0,3) + '.' + s.substr(3, tam);
				if (tam >= 7 && tam < 10)
					campo.value = s.substr(0,3) + '.' + s.substr(3,3) + '.' + s.substr(6,tam-6);
				if (tam >= 10 && tam < 12)
					campo.value = s.substr(0,3) + '.' + s.substr(3,3) + '.' + s.substr(6,3) + '-' + s.substr(9,tam-9);
				*/
				mask = "###.###.###-##";
				var i = campo.value.length;
				var saida = mask.substring(1,2);
				var texto = mask.substring(i)
				if (texto.substring(0,1) != saida){
					campo.value += texto.substring(0,1);
				}
			break;
		
			case 'CNPJ' :
				/*
				if (tam > 2 && tam < 6)
					campo.value = s.substr(0,2) + '.' + s.substr(2, tam);
				if (tam >= 6 && tam < 9)
					campo.value = s.substr(0,2) + '.' + s.substr(2,3) + '.' + s.substr(5,tam-5);
				if (tam >= 9 && tam < 13)
					campo.value = s.substr(0,2) + '.' + s.substr(2,3) + '.' + s.substr(5,3) + '/' + s.substr(8,tam-8);
				if (tam >= 13 && tam < 15)
					campo.value = s.substr(0,2) + '.' + s.substr(2,3) + '.' + s.substr(5,3) + '/' + s.substr(8,4)+ '-' + s.substr(12,tam-12);
				*/	
				mask = "##.###.###/####-##";
				var i = campo.value.length;
				var saida = mask.substring(1,2);
				var texto = mask.substring(i)
				if (texto.substring(0,1) != saida){
					campo.value += texto.substring(0,1);
				}					
					
			break;
		
			case 'TEL' :
				mask = "(##)####-####";
				var i = campo.value.length;
				var saida = mask.substring(1,2);
				var texto = mask.substring(i)
				if (texto.substring(0,1) != saida){
					campo.value += texto.substring(0,1);
				}
				//if (tam > 2 && tam < 4)
				//	campo.value = '(' + s.substr(0,2) + ')' + s.substr(2,tam);
				//if (tam >= 7 && tam < 11)
				//	campo.value = '(' + s.substr(0,2) + ')' + s.substr(2,4) + '-' + s.substr(6,tam-6);
			break;
		
			case 'DATA' :
				if (tam > 2 && tam < 4)
					campo.value = s.substr(0,2) + '/' + s.substr(2, tam);
				if (tam > 4 && tam < 11)
					campo.value = s.substr(0,2) + '/' + s.substr(2,2) + '/' + s.substr(4,tam-4);
			break;
			
			case 'CEP' :
				if (tam > 2 && tam < 5)
					campo.value = s.substr(0,2) + '.' + s.substr(2, tam);
				if (tam > 5 && tam < 8)
					campo.value = s.substr(0,2) + '.' + s.substr(2, 3) + '-' + s.substr(5,tam-5);
			break;		
	
			}
		}
	}
	
	function mascara(obj,event,tipoMascara) {
		if(!obj.type) {
			obj = getObj(obj);
		}
		
		if(!obj.type) {
			throw "Invalid Object";
		}
		tipoMascara = tipoMascara.toUpperCase();
		switch(tipoMascara) {
			case "CPF":
				arr = new Array(1,new Array(3,"."),new Array(7,"."),new Array(11,"-"));
				max = 14;
			break;
			
			case "RG":
				arr = new Array(1,new Array(2,"."),new Array(6,"."),new Array(10,"-"));
				max = 12;
			break;
			
			case "CEP":
				arr = new Array(1,new Array(2,"."),new Array(6,"-"));
				max = 10;
			break;
			
			case "TELEFONE":
				arr = new Array(1,new Array(0,"("),new Array(3,")"),new Array(8,"-"));
				max = 13;
			break;
			
			case "DATA":
				arr = new Array(1,new Array(2,"/"),new Array(5,"/"));
				max = 10;
			break;
			
			case "CNPJ":
				arr = new Array(1,new Array(2,"."),new Array(6,"."),new Array(10,"/"),new Array(15,"-"));
				max = 18;
			break;
			
			default:
				arr = false;
			break;
		}

		if(arr) {
			return aplicarMascara(event,obj,arr,max);
		} else {
			throw "Invalid Mask";
		}
		
	
	}
	