/**
 * @author marcos.regis
 * Contém funções necessárias para tratamento de campos
 * de formulário
 */



	/**
	* Formata um campo usando ##/##/####
	* @param object obj
	*/
	function formataData(obj,idAlvo){
		var data = (obj.value).replace(/\D/g,"");
		obj.value = ( data.replace( /^(\d{2})(\d{1,2})?(\d{1,4})?$/,"$1/$2/$3")).replace(/\D+$/,"");
		if(idAlvo){
			objAlvo = document.getElementById(idAlvo);
			if (obj.getAttribute('maxlength') <= obj.value.length){
				objAlvo.focus();
			}
		}		 
		return;
	}
	

    /**
     * Permite apenas caracteres numéricos ou que estejam
     * na lista de permissões (quarto parâmetro) de acordo com o tipo
     * de mascara passado
     * @param {Event} e o evento (pressionamento de tecla)
     * @param {Object} obj (o campo a ser mascarado)
     * @param {String} tipo ( o tipo de máscara)
     * @param {String} chars ( lista de caracteres que serão permitidos )
     * @return boolean 
     */
	function soNums(e,obj,tipo,chars){ 		
		var kc = document.all?null:e.keyCode;
		if (kc>0) return true;  
		if (obj.getAttribute('maxlength')) {
			if (obj.value.length >= obj.getAttribute('maxlength')) 
				return false;
		}
        var evt= (e.keyCode?e.keyCode:e.charCode);
        var tecla= String.fromCharCode(evt);    // pegando a tecla digitada
        var pos =  getPosCursor(obj);
        var nextStr=obj.value.substring(0,pos)+tecla+obj.value.substring(pos);
        var returnStr =obj.value;
		if(chars && chars.indexOf(tecla)>-1){
			return true;
		}
        if(tipo){
        	switch(tipo){
				case 'moeda':
					if(tecla==',' && returnStr.indexOf(',')>-1 ){
						return false;
					}

					// campo vazio e digitado virgula ou ponto
					if(/^[\.,]$/.test(nextStr)){
						obj.value ='0,00';
						return false;
					}

					// campo vazio e digitado virgula ou ponto
					if(/^\d$/.test(nextStr)){
						obj.value ='0,0'+nextStr;
						return false;
					}

					// mascaras validas
					if(/^(\d{1,3}|\d{1,3}.\d{3}|\d{1,3}.\d{3}.\d{3}),\d{2}$/.test(nextStr)){
						return true;
					}
					// formatando
					var a =nextStr.replace(/\D/g,'');
					a = a.replace(/(\d)(\d{2})$/g,"$1,$2");
					a = a.replace(/^0+(\d+)/g,"$1");
					var b = Array();
					while(a.length>0){
						b.push(a.match(/\d{1,3}(?:,\d{0,2})?$/));
						a = a.replace(/\d{1,3}(,\d{0,2})?$/,"");
					}
					b.reverse();
					obj.value= b.join('.');
					return false;
					
					break;
				
				case 'data':        			        			
        			if(obj.value.length>=10) return false;
        			if (/^(\d{1,2}\/?|\d{1,2}\/\d{1,2}\/?|\d{1,2}\/\d{1,2}\/\d{1,4})$/.test(nextStr)){
        				return true;
        			}else if(/\d/.test(tecla) && /^(\d{2}|\d{1,2}\/\d{2})$/.test(obj.value)){        				
        				returnStr +='/';        				 
        			}       			
        			
        			var validString = /^(\d{1,2}\/?|\d{1,2}\/\d{1,2}\/?|\d{1,2}\/\d{1,2}\/\d{1,4})$/.test(returnStr+tecla);        			
        			break;
				
				case 'cnpj':
					// se já está no tamanho máximo de um cnpj, ignora pressionamento da tecla        		
					if(obj.value.length>=18) return false;
					// posições válidas
					if (/^(\d{1,2}|\d{2}\.\d{0,3}|\d{2}\.\d{3}\.\d{0,3}|\d{2}\.\d{3}\.\d{3}\/\d{0,4}|\d{2}\.\d{3}\.\d{3}\/\d{4}\-\d{0,2})$/.test(nextStr))
						return true;

					// formatações					
					if(/^(\d{3}|\d{2}\.\d{4})/.test(nextStr)){
						returnStr +='.';
						var validString=true;	
					}else if(/^(\d{2}\.\d{3}\.\d{4}(\d{1,4}|\d{4}\-{0,2})?$)/.test(nextStr)){
						returnStr +='/';
						var validString=true;							
					}else if(/^(\d{2}\.\d{3}\.\d{3}\/\d{5}(\d{1,2})?)$/.test(nextStr)){
						returnStr +='-';
						var validString=true;							
					}else if(/\d/.test(tecla) && !/(\d{2}\.\d{4}|\/\d{5})/.test(nextStr))
						return true;
					break;
					
				case 'cep':
					// se já está no tamanho máximo de um cep brasileiro, ignora pressionamento da tecla        		
					if(obj.value.length>=9) return false;
					// posições válidas
					if (/^(\d{1,5}|\d{5}\-\d{0,3})$/.test(nextStr))
						return true;
					
					// formatações
					if(/^\d{6}$/.test(nextStr)){
						returnStr +='-';
						var validString=true;						
					}else if(/\d/.test(tecla) && !/^\d{6}/.test(nextStr)) return true;					
					break;
        		case 'hms': 
        			if(obj.value.length>=8) return false;
        			if (/^(\d{1,2}:?|\d{2}:\d{1,2}:?|\d{2}:\d{2}:\d{1,2})$/.test(nextStr)){
        				return true;
        			}else if(/\d/.test(tecla) && /^(\d{2}|\d{2}:\d{2})$/.test(obj.value)){        				
        				returnStr +=':';        				 
        			}       			
        			var validString = /^(\d{1,2}:?|\d{2}:\d{1,2}:?|\d{2}:\d{2}:\d{1,2})$/.test(returnStr+tecla);        			
        			break;        			

				case 'hm':
        			if(obj.value.length>=5) return false;
        			if (/^(\d{1,2}:?|\d{2}:\d{1,2})$/.test(nextStr)){
        				return true;
        			}else if(/\d/.test(tecla) && /^\d{2}$/.test(obj.value)){        				
        				returnStr +=':';        				 
        			}       			
        			var validString = /^(\d{1,2}:?|\d{2}:\d{1,2})$/.test(returnStr+tecla);        			
        			break;

				case 'tel':
					if(obj.value.length>=17) return false;					
					// apenas digitos do número
					if(/^(\d{1,4}\-?|\d{4}\-\d{1,4})$/.test(nextStr)){
						return true;
					}
					
					// código de área + número
					if(/^(\(\d{2}\)\s\d{1,4}|\(\d{2}\)\s\d{4}\-?|\(\d{2}\)\s\d{4}\-\d{1,4})$/.test(nextStr)){
						return true;
					}
					
					// codigo de país + código de área + número
					if(/^(\d{2}\s\(|\d{2}\s\(\d{1,2}|\d{2}\s\(\d{2}\)\s\d{1,4}|\d{2}\s\(\d{2}\)\s\d{4}\-\d{0,4})$/.test(nextStr)){
						return true;
					}

					// posições válidas
					if(/^(\(\d{2}\)\s?|\(\d{2}\)\s\d{4}\-|\d{2}\s\(|\d{2}\s\(\d{2}\)\s?)$/.test(nextStr)){
						return true;
					}
															
					if(/^(\d{5}|(\d{2}\s)?\(\d{2}\)\s\d{5})$/.test(nextStr)){
						returnStr +='-';        				 
						var validString=true;
					}else if(/^\d{2}\s$/.test(nextStr)){
						returnStr ='('+returnStr+')';        				 
						var validString=true;						
					}else if(/^\(\d{2}\)\s?\d{2}\s$/.test(nextStr)){
						returnStr =returnStr.replace(/\((\d{2})\)\s(\d{2})/,'$1 ($2)');        				 
						var validString=true;						
					}else if(/^(\d{2}\s)?\(\d{3}$/.test(nextStr)){
						returnStr +=') ';        				 
						var validString=true;
					}else if(/^\d{2}\(\d{2}\)\d$/.test(nextStr)){
						returnStr +=' ';        				 
						var validString=true;						
					}
					
        			break;

				case 'tel2':
					if(obj.value.length>=14) return false;					
	
					// adicionando o parentese de inicio 
					if(/^\d$/.test(nextStr)){
						returnStr +='(';        				 
						var validString=true;
					}else
		
					// fechando o parentese do codigo de area
					if(/^\(\d{3}$/.test(nextStr)){
						returnStr +=') ';        				 
						var validString=true;
					}
								
					else if(/^\(\d{2}\)\s?\d{5}$/.test(nextStr)){
						returnStr +='-';        				 
						var validString=true;					
					}
					
					// código de área + número
					if(/^(\(\d{1,2}|\(\d{2}\)\s?\d{1,4}|\(\d{2}\)\s?\d{4}\-?|\(\d{2}\)\s?\d{4}\-\d{1,4})$/.test(nextStr)){
						return true;
					}
					

					// posições válidas
					if(/^(\(\d{2}\)\s?|\(\d{2}\)\s?\d{4}\-|\(|\(\d{2}\))$/.test(nextStr)){
						return true;
					}
																				
        			break;
			
				case 'ag':
					if(obj.value.length>=6) return false;
					// código da agencia
					if(/^(\d{1,4}\-?|\d{4}\-\d)$/.test(nextStr)){
						return true;
					}
					if(/^\d{5}$/.test(nextStr)){
						returnStr +='-';        				 
						var validString=true;					
					}
					break;
					
				case 'tx_aa':
					if(obj.value.length>=9) return false;
					if( (tecla=='.' || tecla==',') && obj.value.indexOf('.')>0){
						return false;
					}
					if (/^(\d{1,3}\.?|\d{1,3}\.\d{1,5})$/.test(nextStr)){
						return true;
					}
					if(/^\d{4}$/.test(nextStr)){
						returnStr +='.';        				 
						var validString=true;						
					}
					if(tecla==',' && obj.value.indexOf('.')<1){
						obj.value+='.';
						return false;
					}
					break;
					
				case 'cpf':
					// se já está no tamanho máximo de um cpf, ignora pressionamento da tecla        		
					if(obj.value.length>=14) return false;
					// posições válidas
					if (/^(\d{1,3}|\d{3}\.\d{0,3}|\d{3}\.\d{3}\.\d{0,3}|\d{3}\.\d{3}\.\d{3}\-\d{0,2}|\d{3}\.\d{3}\.\d{3}\-\d{2})$/.test(nextStr))
						return true;

					// formatações					
					if(/^(\d{4}|\d{3}\.\d{4})/.test(nextStr)){
						returnStr +='.';
						var validString=true;	
					}else if(/^(\d{3}\.\d{3}\.\d{4}$)/.test(nextStr)){
						returnStr +='-';
						var validString=true;							
					}else if(/\d/.test(tecla) && !/(\d{3}\.\d{4}|\-\d{2})/.test(nextStr))
						return true;
					break;					
				
				// usando o quarto argumento como uma lista de caracteres válidos
				case 'lista':
					if (chars.indexOf(tecla)>-1){
						return true;
					}
					break;
				
        	}
        }else{
			return /\d/.test(tecla);
		}        
        if (validString){    // se a tecla estiver na lista de permissão permite-a
        	obj.value = returnStr;
        	return true;
        }
        return false;
    }	
    
	/**
	* Formata um campo usando ##:##:##
	* @param object obj Objeto que está ativando a função
	* @param string idAlvo Id do objeto para ser focado após ter completado o preenchimento
	*/
	function formataHora(obj,idAlvo){
		var data = (obj.value).replace(/\D/g,"");
		obj.value = ( data.replace( /^(\d{2})(\d{1,2})?(\d{1,2})?$/,"$1:$2:$3")).replace(/\D+$/,"");
		if(idAlvo){
			objAlvo = document.getElementById(idAlvo);
			if (obj.getAttribute('maxlength') <= obj.value.length){
				objAlvo.focus();
			}
		}		 
		return true;
	}    
	
	/**
	* Retorna a posição atual do cursor em um texto
	* @param {object} obj
	* @return {int} Ínidice da posição do cursor no texto 
	*/
	function getPosCursor(obj){
		var pos=-1
		if(document.all){			
            var txt = obj.value;
            var len = txt.length;
            var erg = txt.split("\n");            
            range_sel = document.selection.createRange();
            range_obj = obj.createTextRange();
            range_obj.moveToBookmark(range_sel.getBookmark());
            range_obj.moveEnd('character',obj.value.length);
            pos = len - range_obj.text.length;			
		}else{
			pos = obj.selectionStart;
		}
		return pos;
	}
	
	/**
	 * Focaliza um objeto após ter atingido o limite
	 * de comprimento do campo
	 * @param {Object} origem
	 * @param {String} id do objeto que receberá o foco
	 */
	function foca(origem,destino){
		try{
			if(origem.value.length>=origem.getAttribute('maxlength')){
				$(destino).focus();
				self.status=e.description;
			}
		}catch(e){
			return;
		}
		return;
	}

     /**
     * Valida uma data passada
     * @param string dia
     * @param string mes
     * @param string ano
     * @return Bool TRUE em caso de data válida, do contrário FALSE
     */
     function parseDate(dia,mes,ano){
     	var dateRegExp =/^(19|20)\d\d-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01])$/;
        if (!dateRegExp.test(ano+"-"+mes+"-"+dia)) return false; // formato inválido
        if (dia == 31 && ( /^0?[469]$/.test(mes) || mes == 11) ) {
            return false; // dia 31 de um mes de 30 dias
        }else if (dia >= 30 && mes == 2) {
            return false; // mais de 29 dias em fevereiro
        }else if (mes == 2 && dia == 29 && !(ano % 4 == 0 && (ano % 100 != 0 || ano % 400 == 0))) {
            return false; // dia 29 de fevereiro de um ano nao bissexto
        }else {
            return true; // Data válida
        }
    }

     /**
     * Valida uma hora passada
     * @param int h Hora
     * @param int m Minuto
     * @param int s Segundo
     * @return Bool TRUE em caso de horário válido, do contrário FALSE
     */    
    function parseHorario(h,m,s){
    	if(!s) s='00';
		var horarioRegExp = /^(0?\d|1\d|2[0-3]):[0-5]?\d:[0-5]?\d$/;
        return horarioRegExp.test(h+":"+m+":"+s);
    }
	
	/*
	 * Valida um endereço de e-mail passado
	 * @param string email endereço de e-mail a ser validado
	 * @return Bool True/False
	 */
	function isValidEmail(email){
		return /^\w+([\.-_]?\w+)*@\w+([\.-_]?\w+)*(\.\w{2,3})+$/.test(email);
	}
	
	/**
	* Valida um CNPJ passado
	* @param {string} CNPJ CNPJ a ser validado
	* @return {bool}
	*/
	function validaCNPJ(CNPJ) {
		if (CNPJ=="") return true;
		CNPJ = CNPJ.replace(/\D/g,'');
		if (/^(\d)\1+$/.test(CNPJ) || CNPJ.length!=14) {
	    	return false;
		}		
		var a = new Array();
		var b = new Number;
		var c = [6,5,4,3,2,9,8,7,6,5,4,3,2];
		for (var i=0; i<12; i++){
			a[i] = CNPJ.charAt(i);
			b += a[i] * c[i+1];
		}
		var x,y;
		if ((x = b % 11) < 2) { a[12] = 0 } else { a[12] = 11-x }
		b = 0;
		for (y=0; y<13; y++) {
			b += (a[y] * c[y]);
		}
		if ((x = b % 11) < 2) { a[13] = 0; } else { a[13] = 11-x; }
		if ((CNPJ.charAt(12) != a[12]) || (CNPJ.charAt(13) != a[13])){
			return false;
		}
		return true;
	}


	/**
	* Valida um CPF passado
	* @param {string} CPF CPF a ser validado
	* @return {bool}
	*/
	function validaCPF(CPF) {
		if (CPF=="") return true;
		CPF = CPF.replace(/\D/g,'');
		if (/^(\d)\1+$/.test(CPF) || CPF.length!=11) {
	    	return false;
		}	
	    var c = CPF.substr(0,9);
	    var dv = CPF.substr(9,2);
	    var d1 = 0;
	    for (var i=0; i<9; i++) {
	        d1 += c.charAt(i)*(10-i);
	     }
	    if (d1 == 0) return false;
	    d1 = 11 - (d1 % 11);
	    if (d1 > 9) d1 = 0;
	    if (dv.charAt(0) != d1){
	        return false;
	    }
	    d1 *= 2;
	    for (var i = 0; i < 9; i++)    {
	         d1 += c.charAt(i)*(11-i);
	    }
	    d1 = 11 - (d1 % 11);
	    if (d1 > 9) d1 = 0;
	    if (dv.charAt(1) != d1){
	        return false;
	    }
	    return true;
	}
		
	/**
	 * Valida um formulário baseado em atributos específicos definidos
	 * nos campos a serem validados. Os atributos necessários são:
	 * obr [obrigatorio], tipo, nome
	 * @param {Object} form O formulário que terá os campos validados segundo
	 * o seu tipo
	 * @return Bool TRUE/FALSE
	 */
	function formValidador(form){
		for (var i=0;i<form.elements;i++){
			alert(form.elements[i].name);	
		}
	}
	
	/**
	 * Substitui document.getElementById()
	 * 
	 * @param {String} id ID do objeto a ser instanciado
	 * @return Instancia de objeto
	 */
	function $(id){
		return document.getElementById(id);
	}	
	
	/**
	 * Foca um campo de um formulário alterando o seu background
	 * para uma cor passada ou a cor magenta( padrão )
	 * Adicionando um evento que é disparado assim que o elemento é
	 * alterado
	 * @param {Object} obj
	 */
	function focaCampoErro(obj,color){
		
		try {
			if(!color){
					color = '#FFAAAA';
			}
			var old_bg= obj.style.backgroundColor;
			obj.style.backgroundColor=color;
			if(obj.attachEvent){
					obj.attachEvent('onfocus',function () {obj.style.backgroundColor = old_bg})
			}else{
					obj.addEventListener('focus',function () {this.style.backgroundColor = old_bg},false);
			}
			
		} catch (e) {
			alert(e.description);
		}
	}	
	
	
	/**
	* Ordena os resultados passando o índice que deseja ser a base da ordenação
	* @param int indice do campo a ser ordenado
	*/
	function ordena(index){
		try{
			if($('o').value==parseInt(index)){
				$('d').value=($('d').value!=1?1:'');
			}else{
				$('o').value=parseInt(index);
			}
			var form = $('formPesq')?$('formPesq'): ($('frmPesq')?$('frmPesq'):false );
			if (form) {
				form.method='get';
				form.submit();
			}else{
				var forms = document.getElementsByTagName('form');
				for(var i=0;i<forms.length;i++){
					forms[i].method='get';
					forms[i].submit();
				}
			}
		}catch(e){
			alert(e.getMessage());
			return false;
		}
		return;
	}
	
	/**
	* Centraliza um elemento na janela
	*
	* @param {string} idElement o id do Elemento a ser centralizado
	*/
	function centerElement(element){		
		var w = element.offsetWidth;
		var h = element.offsetHeight;
		var _x = (document.documentElement && document.documentElement.scrollLeft) ? document.documentElement.scrollLeft : document.body.scrollLeft;
		var _y = (document.documentElement && document.documentElement.scrollTop) ? document.documentElement.scrollTop : document.body.scrollTop;
		
		cleft=Math.ceil(screen.availWidth/2) + _x; // ponto x central
		ctop=Math.ceil(screen.availHeight/2) + _y; // ponto y central
		
		var l =cleft - Math.ceil(w/2);    // valor para a posição na horizontal
		var t =ctop - Math.ceil(h/2);    // valor para a posição na vertical
		
 		element.style.top=t+'px';
 		element.style.left=l+'px';
	}		
