            function tween(id, start, end, millisec, delay, effect) {
            	if (!effect) {
            		changeH(end, id);
            		return;
            	}
            	
                //speed for each frame
                var speed = Math.round(millisec / 100);
                var timer = 0;

                //determine the direction for the blending, if start and end are the same nothing happens
                if(start > end) {
                    for(i = start; i >= end; i--) {
                    	time = (timer++ * speed)+delay;
                        setTimeout("changeH(" + i + ",'" + id + "')",time);
                    }
                } else if(start < end) {
                    for(i = start; i <= end; i++) {
                    	time = (timer++ * speed)+delay;
                        setTimeout("changeH(" + i + ",'" + id + "')",time);
                    }
                }
                
                if (time > movetime)
                	movetime = time;
                
            }

           function changeH(h, id) {
              document.getElementById(id).style.height = h+"px";              
            }

            function abaControl(aba, nivel, effect) {
            	if (!moving || !effect) {
            		moving = true;
	            	move(aba, nivel, effect);

	            	if (effect) { 
		            	//contrai os pais para nao ficar buraco vazio abaixo
		            	fim = 0;
		            	for (var i=nivel-1; i>=0; i--) {
		            		fim += menuQtd[last[i]];
		            		tween("menu"+last[i], document.getElementById("menu"+last[i]).offsetHeight, fim, speed, 0, effect);
		            	}
	            	}
	            	setTimeout("moving=false", movetime);
	            	setTimeout("movetime=0", movetime);
            	}
            	
            }
            
            function move(aba, nivel, effect) {
              speed = 150;
              delay = 0;
              
              //fecha a ultima aba aberta no mesmo nivel
              if (last[nivel]) {
            	  
            	//calcula a demora para esconder (assim nao corta na metade do slide)
                delay = document.getElementById("menu"+last[nivel]).offsetHeight * Math.round(speed / 100);

                tween("menu"+last[nivel], document.getElementById("menu"+last[nivel]).offsetHeight, 0, speed, 0, effect);
//                setTimeout('document.getElementById("label'+last[nivel]+'").style.borderBottom = "none"', 0);
//                setTimeout('document.getElementById("menu'+last[nivel]+'").style.display = "none"', delay);
              }
              
              //fecha as abas abertas dentro da arvore da aba
              if (last[nivel+1])
                move(last[nivel+1], nivel+1, effect);
              
              if (aba != last[nivel]) {
        	    //esta abrindo outra aba
//                setTimeout('document.getElementById("label'+aba+'").style.borderBottom = "1px solid black"', 0);
//                setTimeout('document.getElementById("menu'+aba+'").style.display = "block"', 0);
                tween("menu"+aba, 0, menuQtd[aba], speed, 0, effect);
                last[nivel] = aba;

                //expande os pais para nao ter overflow hidden
                total = 0;
                for (var i=nivel; i>=0; i--) {
                  total += menuQtd[last[i]];
                  tween("menu"+last[i], document.getElementById("menu"+last[i]).offsetHeight, total, speed, 0, effect);
                }
                
              } else {
            	//esta fechando a aba
            	  
            	  /*
	              total = 0;
	              for (var i=nivel-1; i>=0; i--) {
	                total += menuQtd[last[i]];
	              }

                  //contrai o pai para nao ficar buraco vazio abaixo
	              tween("menu"+last[0], document.getElementById("menu"+last[0]).offsetHeight, total, speed, 0, effect);
	              */
            	  
            	  last[nivel] = null;
              }
              

              
            }
            
            
            
            var incoming = false;
            function ajax(url, funcao, theForm, divStatus) {
              //testa se ja existe uma requisicao ajax em tramite
              if (incoming)
                return;

                var aux = document.getElementById(divStatus).innerHTML;
                document.getElementById(divStatus).innerHTML = "<img src='tela/ajax.gif' align='absmiddle'> &nbsp; carregando...";
                req = null;
                if (window.XMLHttpRequest) {
                    req = new XMLHttpRequest();
                // Procura por uma versão ActiveX (IE)
                } else if (window.ActiveXObject) {
                    if(!(req = new ActiveXObject("Microsoft.XMLHTTP")))
                      req = new ActiveXObject("Msxm12.XMLHTTP");
                }

                if (req) {
                  req.onreadystatechange = function() {
                    if (req.readyState == 4 || req.readyState == "complete") {
                        incoming = false;
                        if (req.status == 200) {
                          //volta o conteudo anterior do div da msg
//                          document.getElementById(divStatus).innerHTML = aux;
                          eval(funcao + "('" + req.responseText + "');");
                        } else {
//                        	document.getElementById(divStatus).innerHTML = aux;
                            alert("Houve um problema ao obter os dados");
                        }
                    }
                  };

                  if (!theForm) {
                    req.open('GET',url,true);
                    req.send(null);
                  } else {
                    var dados = '';
                    if (theForm.elements) {
                      for (e=0;e<theForm.elements.length;e++) {
                          if (theForm.elements[e].name!= '') {
                        	  if (theForm.elements[e].type == "radio" && !theForm.elements[e].checked)
                                  continue;
                        	  
                              var name = theForm.elements[e].name;
                              dados += (dados=='')?'':'&'
                              dados += name+'='+escape(theForm.elements[e].value);
                          }
                      }
                    } else {
                      dados = formulario;
                    }

                    req.open('POST',url,true);
                    req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

                    req.send(dados);
                  }
                  incoming = true;

                } else {
                  alert("Seu navegador não suporta AJAX");
                }

            }            
            
            



            // Valida CNPJ
            function validaCNPJ(cnpj)
            {
              if (isNaN(cnpj)) { return false; }
              var i;
              var c = cnpj.substr(0, 12);
              var dv = cnpj.substr(12, 2);
              var d1 = 0;
              for (i = 0; i < 12; i++)
              {
                d1 += c.charAt(11 - i) * (2 + (i % 8));
              }
              if (d1 == 0) { return false; }
              d1 = 11 - (d1 % 11);
              if (d1 > 9) { d1 = 0; }
              if (dv.charAt(0) != d1) { return false; }
              d1 *= 2;
              for (i = 0; i < 12; i++)
              {
                d1 += c.charAt(11 - i) * (2 + ((i + 1) % 8));
              }
              d1 = 11 - (d1 % 11);
              if (d1 > 9) { d1 = 0; }
              if (dv.charAt(1) != d1) { return false; }

              return true;
            }

            // Valida CPF
            function validaCPF(CPF)
            {
              var posicao, i, soma, dv, dv_informado;
              var digito = new Array(10); //cria uma array de 11 posições para armazenar o CPF
              dv_informado = CPF.substr(9, 2); //armazena os dois últimos dígito do CPF
              for (i=0; i<=8; i++) { //desmembra o número do CPF na array digito
                digito[i] = CPF.substr( i, 1);
              }

              //calcula o valor do 10° dígito da verificação
              posicao = 10;
              soma = 0;
              for (i=0; i<=8; i++) {
                soma = soma + digito[i] * posicao;
                posicao = posicao - 1;
              }
              digito[9] = soma % 11;
              if (digito[9] < 2)
              {
                digito[9] = 0;
              } else {
                digito[9] = 11 - digito[9];
              }

              //calcula o valor do 11° dígito da verificação
              posicao = 11;
              soma = 0;
              for (i=0; i<=9; i++) {
                soma = soma + digito[i] * posicao;
                posicao = posicao - 1;
              }
              digito[10] = soma % 11;
              if (digito[10] < 2) {
                digito[10] = 0;
              } else {
                digito[10] = 11 - digito[10];
              }

              //verifica se os dígitos verificadores conferem
              dv = digito[9] * 10 + digito[10];
              if (dv != dv_informado ||
                CPF == 00000000000 ||
                CPF == 11111111111 ||
                CPF == 22222222222 ||
                CPF == 33333333333 ||
                CPF == 44444444444 ||
                CPF == 55555555555 ||
                CPF == 66666666666 ||
                CPF == 77777777777 ||
                CPF == 88888888888 ||
                CPF == 99999999999) {
                return false;
              }

              return true;
            }





        function numinput(evento) {
          var strCheck = '0123456789';
          var whichCode = (evento.which) ? evento.which : evento.keyCode;
          key = String.fromCharCode(whichCode);
          if (!isNaN(key))
            return true;
          if ((whichCode > 32 && whichCode < 41) || whichCode == 8 || whichCode == 13 || whichCode == 46 || whichCode == 0)
            return true;

          key = String.fromCharCode(whichCode);
          if (strCheck.indexOf(key) == -1) return false;
        }

        function numseq(campo) {
          return campo.value.replace(/\D/g,'');
        }

        function formatar(mascara, valor){
        	retorno = "";
        	x = qtd = 0;
        	str_len = valor.length;
        	mask_len = mascara.length - 1;
        	dados = valor;
        	for (i=0; i < mask_len; i++) {
        		str = mascara.substr(i,1);
        		if (str != "#")
        			dados = dados.replace(str, "");
        		else
        			qtd++;
        	}
        	qtd++;
        	if (dados.length > qtd)
        		dados = dados.substr(0,qtd);

        	for (i = 0; i < str_len; i++) {
        		while (true) {
        			if (mascara.substr(x,1) != "#" && x < mascara.length) {
        				retorno += mascara.substr(x,1);
        				x++;
        				continue;
        			} else {
        				retorno += dados.substr(i,1);
        				x++;
        				break;
        			}
        		}
        	}

        	return retorno;
        }


        function formatnum (campo) {
          campo.value = number_format(numseq(campo)/100, 2, ',', '.');
          return;
        	
        	
          seqnum = numseq(campo);
          retorno = '';
          milhar = '';

          if (seqnum.substr(0,2) == '00')
            seqnum = seqnum.substr(2);

          if(seqnum.substr(0,1) == '0')
            seqnum = seqnum.substr(1);

          len = seqnum.length;
            if (len == 0) campo.value = '';
            if (len == 1) campo.value = '0,0' + seqnum;
            if (len == 2) campo.value = '0,' + seqnum;
            if (len > 2) {
                decimal = ',' + seqnum.substr(len-2);

                for (i=3; i <= len; i++) {
                    if ((i % 3) == 0)
                        milhar += '.';
                    milhar += seqnum.charAt(len-i);
                }

                len = milhar.length;
                for (i=0; i < len; i++)
                    retorno += milhar.charAt(len-i);

                campo.value = retorno+decimal;
            }
        }


        function addFields(campos, local) {
            var newFields = document.getElementById(campos).cloneNode(true);
            newFields.id = '';
            newFields.value = '';
            newFields.style.display = 'block';

            //zera inputs
            var fields = newFields.getElementsByTagName("input");
            for (var i=0;i<fields.length;i++) {
                fields[i].value = '';
            }
            
            //zera selects
            var fields = newFields.getElementsByTagName("select");
            for (var i=0;i<fields.length;i++) {
                fields[i].selectedIndex = 0;
            }
            
            var insertHere = document.getElementById(local);
            insertHere.parentNode.insertBefore(newFields,insertHere);

        }


        function validaData(ini) {
          if (ini.length != 10)
            return false;

          barras = ini.split("/");

          data = new Date();
          data.setFullYear(barras[2], barras[1]-1, barras[0]);

          if (data.getMonth()+1 != barras[1] || data.getDate() != barras[0])
            return false;

          return data;
        }

        function validaDataHora(ini) {
          if (ini.length != 19)
            return false;

          barras = ini.split("/");

          hora = barras[2].substring(7,9);
          min = barras[2].substring(11,13);


          barras[2] = barras[2].substring(0,4);

          data = new Date();
          data.setFullYear(barras[2], barras[1]-1, barras[0]);

          if (data.getMonth()+1 != barras[1] || data.getDate() != barras[0]
             || hora < 0 || hora > 23 || min < 0 || min > 59 )
            return false;

          return data;
        }

        function textarealimit(field,MaxLength) {
          if (MaxLength !=0) {
             if (field.value.length > MaxLength)  {
              field.value = field.value.substring(0, MaxLength);
              alert("Número de caracteres excedidos! O limite máximo é de "+MaxLength+" caracteres.");
            }
          }
          document.getElementById("contador").value = field.value.length+'/'+MaxLength;
        }



        function number_format(number, decimals, dec_point, thousands_sep) {
            // Formats a number with grouped thousands  
            // 
            // version: 1004.2314
            // discuss at: http://phpjs.org/functions/number_format    // +   original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
            // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
            // +     bugfix by: Michael White (http://getsprink.com)
            // +     bugfix by: Benjamin Lupton
            // +     bugfix by: Allan Jensen (http://www.winternet.no)    // +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
            // +     bugfix by: Howard Yeend
            // +    revised by: Luke Smith (http://lucassmith.name)
            // +     bugfix by: Diogo Resende
            // +     bugfix by: Rival    // +      input by: Kheang Hok Chin (http://www.distantia.ca/)
            // +   improved by: davook
            // +   improved by: Brett Zamir (http://brett-zamir.me)
            // +      input by: Jay Klehr
            // +   improved by: Brett Zamir (http://brett-zamir.me)    // +      input by: Amir Habibi (http://www.residence-mixte.com/)
            // +     bugfix by: Brett Zamir (http://brett-zamir.me)
            // +   improved by: Theriault
            // *     example 1: number_format(1234.56);
            // *     returns 1: '1,235'    // *     example 2: number_format(1234.56, 2, ',', ' ');
            // *     returns 2: '1 234,56'
            // *     example 3: number_format(1234.5678, 2, '.', '');
            // *     returns 3: '1234.57'
            // *     example 4: number_format(67, 2, ',', '.');    // *     returns 4: '67,00'
            // *     example 5: number_format(1000);
            // *     returns 5: '1,000'
            // *     example 6: number_format(67.311, 2);
            // *     returns 6: '67.31'    // *     example 7: number_format(1000.55, 1);
            // *     returns 7: '1,000.6'
            // *     example 8: number_format(67000, 5, ',', '.');
            // *     returns 8: '67.000,00000'
            // *     example 9: number_format(0.9, 0);    // *     returns 9: '1'
            // *    example 10: number_format('1.20', 2);
            // *    returns 10: '1.20'
            // *    example 11: number_format('1.20', 4);
            // *    returns 11: '1.2000'    // *    example 12: number_format('1.2000', 3);
            // *    returns 12: '1.200'
            var n = !isFinite(+number) ? 0 : +number, 
                prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
                sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,        dec = (typeof dec_point === 'undefined') ? '.' : dec_point,
                s = '',
                toFixedFix = function (n, prec) {
                    var k = Math.pow(10, prec);
                    return '' + Math.round(n * k) / k;        };
            // Fix for IE parseFloat(0.55).toFixed(0) = 0;
            s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');
            if (s[0].length > 3) {
                s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);    }
            if ((s[1] || '').length < prec) {
                s[1] = s[1] || '';
                s[1] += new Array(prec - s[1].length + 1).join('0');
            }    return s.join(dec);
        }            
