/**
* Função para executar mascaramento
*
* @author Bruno Meneses <bruno.meneses@goldenlight.biz>
* @version 0.5
* @copyright  Copyright © 2009, GOLDEN LIGHT BUSINESS todos os direitos reservados.
*
* @comment Inclua este arquivo dentro de uma página e chame conforme abaixo:
* $(document).ready(function(){
*    $('input[name=bruno]').GoldenMask('Data');
*});
* @tipos  Data, Hora, Cnpj, Cep, Cpf, Site, Moeda, Telefone
*/
(function($) {
	$.fn.extend({
		GoldenMask: function(tipo) {

            return this.keyup(
                function() {
                    var valor = $(this).val();

                        Start(valor, tipo, $(this));

                        function Start(valor, tipo, obj){
                            StartMascara(valor, tipo, obj);
                        }


                        function StartMascara(valor, tipo, obj){

                            tipo = tipo.toLowerCase();
                            sleep(20);

                            if(tipo == 'data'){
                                obj.val(Data(valor,obj));
                            }
                            else if(tipo == 'hora'){
                                obj.val(Hora(valor,obj));
                            }
                            else if(tipo == 'cnpj'){
                                obj.val(Cnpj(valor,obj));
                            }
                            else if(tipo == 'cpf'){
                                obj.val(Cpf(valor,obj));
                            }
                            else if(tipo == 'cep'){
                                obj.val(Cep(valor,obj));
                            }
                            else if(tipo == 'site'){
                                obj.val(Site(valor,obj));
                            }
                            else if(tipo == 'moeda'){
                                obj.val(Moeda(valor,obj));
                            }
                            else if(tipo == 'telefone'){
                                obj.val(Telefone(valor,obj));
                            }
				else if(tipo == 'ddd'){
                                obj.val(Ddd(valor,obj));
                            }
				else if(tipo == 'ddi'){
                                obj.val(Ddi(valor,obj));
                            }
				else if(tipo == 'numero'){
                                obj.val(Numero(valor,obj));
                            }
                        }

                        function Data(v,obj){
                                v=v.replace(/\D/g,"")
                                v=v.replace(/(\d{2})(\d)/,"$1/$2")
                                v=v.replace(/(\d{2})(\d)/,"$1/$2")
                                return Calcula(v,10,obj);
                        }

                        function Hora(v,obj){
                                v=v.replace(/\D/g,"");
                                v=v.replace(/(\d{2})(\d)/,"$1:$2");
                                return Calcula(v,5,obj);
                        }

                        function Cnpj(v,obj){
                            v=v.replace(/\D/g,"")
                            v=v.replace(/^(\d{2})(\d)/,"$1.$2")
                            v=v.replace(/^(\d{2})\.(\d{3})(\d)/,"$1.$2.$3")
                            v=v.replace(/\.(\d{3})(\d)/,".$1/$2")
                            v=v.replace(/(\d{4})(\d)/,"$1-$2")
                            return Calcula(v,18,obj);
                        }

                        function Cep(v,obj){
                            //v=v.replace(/D/g,"");
                            //v=v.replace(/^(\d{5})(\d)/,"$1-$2")
				v=v.replace(/\D/g,"");
				v=v.replace(/^(\d{5})(\d)/,"$1-$2");
                            return Calcula(v,9,obj);
                        }

                        function Cpf(v,obj){
                            v=v.replace(/\D/g,"")
                            v=v.replace(/(\d{3})(\d)/,"$1.$2")
                            v=v.replace(/(\d{3})(\d)/,"$1.$2")

                            v=v.replace(/(\d{3})(\d{1,2})$/,"$1-$2")
                            return Calcula(v,14,obj);
                        }

                        function Moeda(v,obj){
                            v=v.replace(/\D/g,"") //Remove tudo o que não é dígito
                            v=v.replace(/^([0-9]{3}\.?){3}-[0-9]{2}$/,"$1.$2");
                            v=v.replace(/(\d)(\d{2})$/,"$1.$2") //Coloca ponto antes dos 2 últimos digitos
                            return Calcula(v,14,obj);
                        }

                        function Site(v){
                            v=v.replace(/^http:\/\/?/,"")
                            dominio=v
                            caminho=""
                            if(v.indexOf("/")>-1)
                                dominio=v.split("/")[0]
                                caminho=v.replace(/[^\/]*/,"")
                                dominio=dominio.replace(/[^\w\.\+-:@]/g,"")
                                caminho=caminho.replace(/[^\w\d\+-@:\?&=%\(\)\.]/g,"")
                                caminho=caminho.replace(/([\?&])=/,"$1")
                                if(caminho!="")dominio=dominio.replace(/\.+$/,"")
                                v="http://"+dominio+caminho
                            return v;
                        }

                        function Telefone(v,obj){
				//v=v.replace(/\D/g,"");
				//return Calcula(v,8,obj);
				return v.replace(/\D/g,"");
                        }

			   function Ddd(v,obj){
				v=v.replace(/\D/g,"");
                            return Calcula(v,2,obj);
                        }

			   function Ddi(v,obj){
				v=v.replace(/\D/g,"");
                            return Calcula(v,3,obj);
                        }

			   function Numero(v){
                            return v.replace(/\D/g,"");
                        }

                        function Calcula(v, num,obj){

                            obj.attr('maxlength', num);

                            if(v.length > num){
                                var ultCarac   = v.substring(v.length,v.length-1);
                                return v.replace(ultCarac, '');
                            }
                            else{
                                return v;
                            }
                        }

                        function sleep(milliseconds) {
                          var start = new Date().getTime();
                          for (var i = 0; i < 1e7; i++) {
                            if ((new Date().getTime() - start) > milliseconds){
                              break;
                            }
                          }
                        }
                }
            )
      }
   })
})(jQuery);