  // Coleção TAYLOR LOPES
  // taylor@pop.com.br
 
 
  // Retira espços em branco do início e final da string
  // trim("Meu texto ");
  function trim(str){
    return str.replace(/^\s+|\s+$/g,"");
  }


  // Converte a primeira letra de cada palavra do texto em maiúsculo, exceto preposições
  // onblur="first_upper(this.name)"
  function first_upper(name) {
    var element = document.getElementsByName(name)[0];
    var txt = trim(element.value);
    if (txt == "")
      return "";
    var out = "";
    var word = "";
    var aux = "";
    txt = txt.toLowerCase();
    txt_invalid = "da:de:di:do:du:das:dos:e:";
    txt_array = txt.split(" ");
    for (var i = 0; i < txt_array.length; i++ ) {
      word = txt_array[i];
      if (txt_invalid.indexOf(word+":") == -1 ) {
       	aux = word.substring(0,1);
       	out += word.replace(aux, aux.toUpperCase());            
      }
      else {
        out += word;
      } 
      out += " ";        
    }
    document.getElementsByName(name)[0].value = trim(out);  
  }


  // Verifica se um email é valido
  // onblur="is_mail(this.name)"
  function is_mail(name){
    var valid;
    var element = document.getElementsByName(name)[0];
    var txt = trim(element.value);   
    if (txt == "")
      return "";     
    var filter = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
    if(filter.test(txt))
      valid = true;
    else{
      alert("Este endere\xE7o de e-mail n\xE3o \xE9 v\xE1lido!");
      setTimeout(function() { var mytext = document.getElementsByName(name)[0]; mytext.focus(); mytext.select(); } , 1);      
      valid = false;
    }
    return valid;
  }

  
  // Permite que digite apenas CEP no formato 00000-000
  // onkeypress="return only_cep(this, event, true, false);"
  function only_cep(obj, e, allowDecimal, allowNegative) {
  	var key;
  	var isCtrl = false;
  	var keychar;
  	var reg;  		
  	if(window.event) {
  		key = e.keyCode;
  		isCtrl = window.event.ctrlKey
  	}
  	else if(e.which) {
  		key = e.which;
  		isCtrl = e.ctrlKey;
  	}  	
  	if (isNaN(key)) return true;  	
  	keychar = String.fromCharCode(key);  	
  	// check for backspace or delete, or if Ctrl was pressed
  	if (key == 8 || isCtrl)	{
  		return true;
  	}    	
    var data = obj.value;
    if (data.length == 5){
      data += '-';
      obj.value = data;
    }  	
    if (data.length >= 9)
      return false;  	  	
  	reg = /\d/;
  	var isFirstN = allowNegative ? keychar == '-' && obj.value.indexOf('-') == -1 : false;
  	var isFirstD = allowDecimal ? keychar == '.' && obj.value.indexOf('.') == -1 : false;  	
  	return isFirstN || isFirstD || reg.test(keychar);
  }
  
  
  // Permite que digite apenas telefone no formato (48) 0000-0000
  // onkeypress="return only_tel(this, event, true, false);"
  function only_tel(obj, e, allowDecimal, allowNegative) {
  	var key;
  	var isCtrl = false;
  	var keychar;
  	var reg;  		
  	if(window.event) {
  		key = e.keyCode;
  		isCtrl = window.event.ctrlKey
  	}
  	else if(e.which) {
  		key = e.which;
  		isCtrl = e.ctrlKey;
  	}  	
  	if (isNaN(key)) return true;  	
  	keychar = String.fromCharCode(key);  	
  	// check for backspace or delete, or if Ctrl was pressed
  	if (key == 8 || isCtrl)	{
  		return true;
  	}    	
    var data = obj.value;
    if (data.length == 0){
      data += '(';
      obj.value = data;
    }  	
    else if (data.length == 3){
      data += ')';
      data += ' ';
      obj.value = data;
    } 
    else if (data.length == 4){
      data += ' ';
      obj.value = data;
    }               
    else if (data.length == 9){
      data += '-';
      obj.value = data;
    } 
    if (data.length >= 14)
      return false;  	  	
  	reg = /\d/;
  	var isFirstN = allowNegative ? keychar == '-' && obj.value.indexOf('-') == -1 : false;
  	var isFirstD = allowDecimal ? keychar == '.' && obj.value.indexOf('.') == -1 : false;  	
  	return isFirstN || isFirstD || reg.test(keychar);
  }  
  
  // Verifica se um telefone é valido
  // onblur="is_tel(this.name)"
  function is_tel(name){
    var valid;
    var element = document.getElementsByName(name)[0];
    var txt = trim(element.value);   
    if (txt == "")
      return "";     
    if (txt.length == 14)
      valid = true;
    else{
      alert(unescape("Este telefone n\xE3o \xE9 v\xE1lido! Utilize o formato (00) 0000-0000."));
      setTimeout(function() { var mytext = document.getElementsByName(name)[0]; mytext.focus(); mytext.select(); } , 1);      
      valid = false;
    }
    return valid;
  }  


  // Permite apenas números
  // onkeypress="return only_number(this, event, true, false);" 
  function only_number(obj, e, allowDecimal, allowNegative) {
  	var key;
  	var isCtrl = false;
  	var keychar;
  	var reg;  		
  	if(window.event) {
  		key = e.keyCode;
  		isCtrl = window.event.ctrlKey
  	}
  	else if(e.which) {
  		key = e.which;
  		isCtrl = e.ctrlKey;
  	}  	
  	if (isNaN(key)) return true;  	
  	keychar = String.fromCharCode(key);  	
  	// check for backspace or delete, or if Ctrl was pressed
  	if (key == 8 || isCtrl)	{
  		return true;
  	}  
  	reg = /\d/;
  	var isFirstN = allowNegative ? keychar == '-' && obj.value.indexOf('-') == -1 : false;
  	var isFirstD = allowDecimal ? keychar == '.' && obj.value.indexOf('.') == -1 : false;  	
  	return isFirstN || isFirstD || reg.test(keychar);
  }


  // Permite apenas data no formato dd/mm/aaaa
  // onkeypress="return only_date(this, event);"
  function only_date(inputData, e){    
    if(document.all) // Internet Explorer
      var tecla = event.keyCode;
    else //Outros Browsers
      var tecla = e.which;    
    if(tecla >= 47 && tecla < 58){ // numeros de 0 a 9 e "/" .:. 47 = / .:. 48 a  57 = 0 a 9 .:. Ver tabela Ascii
      var data = inputData.value;      
      if (data.length >= 10)
        return false;             
      if (tecla == 47 && !(data.length == 2 || data.length == 5))
        return false;           
      if (tecla == 47)
        return true;    
      if (data.length == 2 || data.length == 5){
        data += '/';
        inputData.value = data;
      }
    }
    else if(tecla == 8 || tecla == 0) // Backspace, Delete e setas direcionais(para mover o cursor, apenas para FF)
      return true;
    else
      return false;
  }


  // Verifica se uma data é valida
  // onblur="is_date(this.name)"
  function is_date(name) {
    var valid = true;
    var element = document.getElementsByName(name)[0];
    var txt = trim(element.value);   
    if (txt == "")
      return "";     
    var filter = /^(([0-2]\d|[3][0-1])\/([0]\d|[1][0-2])\/[1-2][0-9]\d{2})$/;
    var ardt = txt.split("/");
    if(!filter.test(txt))
      valid = false;      
  	else if (((ardt[1]==4)||(ardt[1]==6)||(ardt[1]==9)||(ardt[1]==11))&&(ardt[0]>30))
  		valid = false;
  	else if ( ardt[1]==2) {
  		if ((ardt[0]>28)&&((ardt[2]%4)!=0))
  			valid = false;
  		if ((ardt[0]>29)&&((ardt[2]%4)==0))
  			valid = false;
  	}
  	if (!valid) {
      alert("Esta data n\xE3o \xE9 v\xE1lida! Utilize o formato dd/mm/aaaa.");
      setTimeout(function() { var mytext = document.getElementsByName(name)[0]; mytext.focus(); mytext.select(); } , 1);      
      return false;
    }
    return true;    
  }

  // Formata número com casas decimais (tipo valor / modeda) - Exemplo de nenhum negativo e com 2 casas decimais:
  // onblur="extractNumber(this,2,false);" onkeyup="extractNumber(this,2,false);" 
  function format_num(obj, decimalPlaces, allowNegative) {
  	var temp = obj.value;  	
  	// avoid changing things if already formatted correctly
  	var reg0Str = '[0-9]*';
  	if (decimalPlaces > 0) {
  		reg0Str += '\\.?[0-9]{0,' + decimalPlaces + '}';
  	} else if (decimalPlaces < 0) {
  		reg0Str += '\\.?[0-9]*';
  	}
  	reg0Str = allowNegative ? '^-?' + reg0Str : '^' + reg0Str;
  	reg0Str = reg0Str + '$';
  	var reg0 = new RegExp(reg0Str);
  	if (reg0.test(temp)) return true;  
  	// first replace all non numbers
  	var reg1Str = '[^0-9' + (decimalPlaces != 0 ? '.' : '') + (allowNegative ? '-' : '') + ']';
  	var reg1 = new RegExp(reg1Str, 'g');
  	temp = temp.replace(reg1, '');  
  	if (allowNegative) {
  		// replace extra negative
  		var hasNegative = temp.length > 0 && temp.charAt(0) == '-';
  		var reg2 = /-/g;
  		temp = temp.replace(reg2, '');
  		if (hasNegative) temp = '-' + temp;
  	}  	
  	if (decimalPlaces != 0) {
  		var reg3 = /\./g;
  		var reg3Array = reg3.exec(temp);
  		if (reg3Array != null) {
  			// keep only first occurrence of .
  			//  and the number of places specified by decimalPlaces or the entire string if decimalPlaces < 0
  			var reg3Right = temp.substring(reg3Array.index + reg3Array[0].length);
  			reg3Right = reg3Right.replace(reg3, '');
  			reg3Right = decimalPlaces > 0 ? reg3Right.substring(0, decimalPlaces) : reg3Right;
  			temp = temp.substring(0,reg3Array.index) + '.' + reg3Right;
  		}
  	}  	
  	obj.value = temp;
  }


  //Formata um número decimal, trocando o ponto pela virgula - Formato Brasileiro. Exemplo: Entrada: 372.82 Saída: 372,82
  // format_num_br("372.82")
  function format_num_br(Num)  {
  	var txt = ((Num.toString()).replace('.','')).replace(',','.');
  	return parseFloat(txt);
  }


  // Permite apenas CPF ou CNPJ
  function only_cpf_cnpj(name)  {
    //  onblur="only_cpf_cnpj(this.name)"
    // Combinar com: onkeypress="return only_number(this, event, true, false);
    var NUM_DIGITOS_CPF  = 11;
    var NUM_DIGITOS_CNPJ = 14;
    var NUM_DGT_CNPJ_BASE = 8;
    var valid = true;
    var element = document.getElementsByName(name)[0];
    var txt = trim(element.value);   
    // Retira da string tudo que não seja número  
    txt =  String(txt).replace(/\D/g, "").replace(/^0+/, "");    
    if (txt == "")
      return false;  
    else if (txt.length <= NUM_DIGITOS_CPF)
      isCPF = true;
    else if (txt.length <= NUM_DIGITOS_CNPJ)
      isCPF = false; 
    else
      valid = false;         
    // alert(txt+" x "+txt.length+" x "+isCPF) ;    
    var maxDigitos = isCPF ? NUM_DIGITOS_CPF : NUM_DIGITOS_CNPJ;   
    // Completa com digitos a esquerda
    txt = complet(txt, maxDigitos, '0');        
    // Formata o CPF
  	if (isCPF) {  	  
  		reCpf  = /(\d{3})(\d{3})(\d{3})(\d{2})$/;
  		txt_format = txt.replace(reCpf, "$1.$2.$3-$4");  	  
  	}
  	// Formata o CNPJ 
  	else 	{
  		reCnpj = /(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})$/;
  		txt_format = txt.replace(reCnpj, "$1.$2.$3/$4-$5"); 
  	}       
    // Calcula o dígito verificador	
  	var i, j, k, soma, dv;
  	var cicloPeso = isCPF ? NUM_DIGITOS_CPF : NUM_DGT_CNPJ_BASE;
  	var calculado = txt;
  	calculado = calculado.substring(0, maxDigitos-2);
  	base = calculado;
  	var result = "";  
  	for (j = 1; j <= 2; j++)	{
  		k = 2;
  		soma = 0;
  		for (i = calculado.length-1; i >= 0; i--) {
  			soma += (calculado.charAt(i) - '0') * k;
  			k = (k-1) % cicloPeso + 2;
  		}
  		dv = 11 - soma % 11;
  		if (dv > 9) dv = 0;
  		calculado += dv;
  		result += dv
  	}  	
  	// Caso seja um CPF
  	var valid_cpf = true;
  	var valid_cnpj = true;
  	if (isCPF) {
  	  var valid_cpf = true;
    	var numero = txt;
    	var digitos = result;
    	var algUnico, i;    
    	// Valida dígitos verificadores
    	if (numero != base + digitos)
        valid_cpf = false;    
    	// Não serão considerados válidos os seguintes CPF: * 000.000.000-00, 111.111.111-11, 222.222.222-22, 333.333.333-33, 444.444.444-44, * 555.555.555-55, 666.666.666-66, 777.777.777-77, 888.888.888-88, 999.999.999-99.
    	algUnico = true;
    	for (i=1; i < NUM_DIGITOS_CPF; i++) {
    		algUnico = algUnico && (numero.charAt(i-1) == numero.charAt(i));
    	}
    	if (algUnico)
    	  valid_cpf = false;  
    } 	
    // Caso seja um CNPJ
    else {
    	var numero = txt;
    	var base = numero.substring(0, NUM_DGT_CNPJ_BASE);
    	var ordem = numero.substring(NUM_DGT_CNPJ_BASE, 12);
    	var digitos = result;
    	var algUnico;    
    	// Valida dígitos verificadores
    	if (numero != base + ordem + digitos)
        valid_cnpj = false;      
    	// Não serão considerados válidos os CNPJ com os seguintes números BÁSICOS: * 11.111.111, 22.222.222, 33.333.333, 44.444.444, 55.555.555, * 66.666.666, 77.777.777, 88.888.888, 99.999.999.
    	algUnico = numero.charAt(0) != '0';
    	for (i=1; i<NUM_DGT_CNPJ_BASE; i++) {
    		algUnico = algUnico && (numero.charAt(i-1) == numero.charAt(i));
    	}
    	if (algUnico) 
    	  valid_cnpj = false;
        // Não será considerado válido CNPJ com número de ORDEM igual a 0000. * Não será considerado válido CNPJ com número de ORDEM maior do que 0300 * e com as três primeiras posições do número BÁSICO com 000 (zeros). * Esta crítica não será feita quando o no BÁSICO do CNPJ for igual a 00.000.000.
    	if (ordem == "0000")
    	valid_cnpj = false;
    	//if (base == "00000000" || parseInt(ordem, 10) <= 300 || base.substring(0, 3) != "000")
       // valid_cnpj = false;  
    }
    if (!valid_cpf) {
      alert("Este CPF n\xE3o \xE9 v\xE1lido!"); 
      setTimeout(function() { var mytext = document.getElementsByName(name)[0]; mytext.focus(); mytext.select(); } , 1);      
      return false;      
    }
    if (!valid_cnpj) {
      alert("Este CNPJ n\xE3o \xE9 v\xE1lido!"); 
      setTimeout(function() { var mytext = document.getElementsByName(name)[0]; mytext.focus(); mytext.select(); } , 1);      
      return false;      
    }    
    if (!valid) {
      alert("Este CPF/CNPJ n\xE3o \xE9 v\xE1lido!"); 
      setTimeout(function() { var mytext = document.getElementsByName(name)[0]; mytext.focus(); mytext.select(); } , 1);      
      return false;
    }
    document.getElementsByName(name)[0].value = txt_format;  
    return true;    
  }  


  // Preenche a String à esquerda com o caractere fornecido até que ela atinja o tamanho especificado.  
  function complet(txt, pSize, pCharPad) {
  	var str = txt;
  	var dif = pSize - str.length;
  	var ch = String(pCharPad).charAt(0);
  	for (; dif>0; dif--) str = ch + str;
  	return (str);
  } 


