TEvent = function (){
        this.Event=null;
        this.Target=null;
        this.KeyCode = 0;
        this.MousePos = {X:null, Y:null};
        this.IsIE = navigator.appName.toLowerCase().indexOf('microsoft')!=-1;
}

TEvent.prototype.Update = function(NSEvent){
        this.Event =  this.IsIE ? event : NSEvent;
        this.KeyCode = this.IsIE? event.keyCode : this.Event.which;
        this.Target = this.IsIE ? this.Event.srcElement : this.Event.target;
        this.MousePos = {X:this.Event.clientX, Y:this.Event.clientY};
}

Handler = function(NSEvent){ Event.Update(NSEvent);}

Event = new TEvent;

document.onkeypress = Handler;

AZ = /[A-Z]/i;
Acentos = /[À-ÿ]/i;
Num = /[0-9]/;


CheckChar = function(Char, Rule){
      switch(Rule){
            case 'A': return Char.search(AZ)!=-1||Char.search(Num)!=-1||Char.search(Acentos)!=-1;
            case 'a': return Char.search(AZ)!=-1||Char.search(Num)!=-1;
            case '9': return Char.search(Num)!=-1;
            case 'C': return Char.search(AZ)!=-1||Char.search(Acentos)!=-1;
            case 'c': return Char.search(AZ)!=-1;
            case '*': return true;
            case Char: return true;
            default : return false;
      }
}

CheckMask = function(e){
      function Result(Status){
            if(Status && Field.OnMaskSuccess) return Field.OnMaskSuccess(e, Field, KeyCode);
            if(!Status && Field.OnMaskError) return Field.OnMaskError(e, Field, KeyCode);
            return Status;
      }
      var      IsIE = navigator.appName.toLowerCase().indexOf('microsoft')!=-1,
            Field =  IsIE ? event.srcElement : e.target,
            KeyCode = IsIE ? event.keyCode : e.which,
            Mask = Field.getAttribute('Mask'),
            Char = String.fromCharCode(KeyCode);
      if(KeyCode==8 || KeyCode==0) return Result(true);
      if(M=Mask.match(/^(.)\^(.*)$/)) {
            if(M[1]=='L') return Result(M[2].indexOf(Char)!=-1);
            else if(M[1]=='E') return Result(M[2].indexOf(Char)==-1);
            else return Result(CheckChar(Char,M[1]) || M[2].indexOf(Char)!=-1);
      }
      if(Field.value.length>Mask.length-1) return Result(false);
      var MaskChar = Mask.charAt(Field.value.length);
      if(MaskChar.match(/[A|9|C|L|\*]/i)) return Result(CheckChar(Char, MaskChar));
      if (CheckChar(Char, Mask.charAt(Field.value.length+1))) {
            Field.value+=MaskChar;
            return Result(true);
      }
      if(CheckChar(Char, MaskChar)) return Result(true);
      return Result(false);
}

ApplyMask = function(Field, DefMask, DefSubType){
      var SubType=DefSubType||String(Field.getAttribute('SubType')||''),
            Mask=DefMask||String(Field.getAttribute('Mask')||''),
            Limit = false;
      switch(SubType.toUpperCase()) {
            case 'NUMBER': Limit=false; Mask='9^'+Mask; break;
            case 'ALPHA+': Limit=false; Mask='A^'+Mask; break;
            case 'ALPHA': Limit=false; Mask='a^'+Mask; break;
            case 'CHAR+': Limit=false; Mask='C^'+Mask; break;
            case 'CHAR': Limit=false; Mask='c^'+Mask; break;
            case 'LIMIT': Limit=false; Mask='L^'+Mask; break;
            case 'EXCEPT': Limit=false; Mask='E^'+Mask; break;
            case 'DATE': Limit=true; Mask='99/99/9999'; break;
            case 'TIME': Limit=true; Mask='99:99:99'; break;
            case 'PHONE': Limit=true; Mask='(99)9999-9999'; break;
            case 'CPF': Limit=true; Mask='999.999.999-99'; break;
            case 'CNPJ': Limit=true; Mask='99.999.999/9999-99'; break;
            case 'MONEY': Limit=false; Field.OnMaskSuccess = CheckMoney; ApplyMask(Field,'.,','Number'); return; break;
      }
      if(!Mask && !SubType) return false;
      if(Limit) Field.maxLength = Mask.length;
      Field.setAttribute('Mask',Mask);
      Field.setAttribute('SubType',SubType);
      if(Field.getAttribute && Field.getAttribute('Mask'))
            Field.onkeypress = function(e){ return CheckMask(e?e:event); };
}

CheckMoney = function(e, FloatPoint){
        var FloatPoint = FloatPoint || 2;
        Event.Update(e);
        var Field = Event.Target;
        if(Event.KeyCode!=44 && Event.KeyCode!=46) return true;
        if(Event.KeyCode==44)
                if(Event.IsIE) event.keyCode=46;
                else return false;
        if(Field.value.indexOf('.')!=-1 || IsNull(Field.value)) return false;
        return true;
}

MakeError = function(Msg, Input){
        Msg=('! ! ! Atenção ! ! !\n|'+Msg).split('|');
        if(Msg[2]) { Msg[1]='Erro: '+Msg[1]; Msg[2]='Solução: '+Msg[2]; }
        alert(Msg.join('\n'));
        with(Input) {
		if(Input.type.toLowerCase()=='hidden') return false;
		focus(); if(Input.type.toLowerCase()=='text') select();
	}
        return false;
}

IsNull = function(Str){return (Str==null || Str=='' || Str.split(' ').length-1==Str.length);}

IsEmpty = function(){
        for(var i=0; i<arguments.length; i++)
                if (IsNull(arguments[i].value))
                         return MakeError('Campo obrigatório não foi preenchido: '+arguments[i].name,arguments[i]);
        return true;
}

IsCPF = function(Input){
        return Input.value.match(/[0-9]{3}\.?[0-9]{3}\.?[0-9]{3}\-?[0-9]{2}/) ? true : MakeError('CPF Inválido', Input);
}

IsCNPJ = function(Input){
        return Input.value.match(/^[0-9]{2,3}\.?[0-9]{3}\.?[0-9]{3}\/?[0-9]{4}-?[0-9]{2}$/) ? true : MakeError('CNPJ Inválido',Input);
}

IsEmail = function(Input){
        return Input.value.match(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) ? true : MakeError('E-mail Inválido',Input);
}

IsPhone = function(Input){
        return Input.value.match(/^(\((xx)?[0-9]{2}\))?[0-9]{3,4}-?[0-9]{3,4}$/) ? true : MakeError('Número de telefone inválido',Input);
}

IsTime = function(Input){
        function Error(Msg){ return MakeError(Msg,Input); }
        var Time = Input.value, TimeRegEx = /^([0-9]{2}):([0-9]{2}):([0-9]{2})$/;
        if(!(Matches = Time.match(TimeRegEx))) return Error("Formato de hora inválido|Preencha novamente o campo no formato HH/MM/SS");
        var Hora = Matches[1], Min = Matches[2], Seg = Matches[3];
        if(Hora>23 || Hora<0) return Error('Hora inválida|As horas vão de 00 até 23');
        if(Min>59 || Min<0) return Error('Minuto inválido|Os minutos vão de 00 até 59');
        if(Seg>59 || Seg<0) return Error('Segundo inválido|Os segundos vão de 00 até 59');
}

IsData = function(Input){
        function Error(Msg){ return MakeError(Msg,Input); }
        var Data = Input.value, DataRegEx = /^([0-9]{2})[\/]([0-9]{2})[\/]([0-9]{4})$/;
        if(!(Matches = Data.match(DataRegEx))) return Error("Formato de data inválido|Preencha novamente o campo no formato DD/MM/AAAA");
        var Dia = Matches[1], Mes = Matches[2], Ano = Matches[3];
        if(Dia<1 || Dia>31) return Error("Dia inválido|Não existem dias menores que 1 ou maiores que 31");
        if(Mes<1 || Mes>12) return Error("Mês inválido|Não existe mês menor que 1 ou maiores que 12");
        if ((Mes==4 || Mes==6 || Mes==9 || Mes==11) && Dia>30) return Error("Dia inválido|Nos meses 4, 6, 9 e 11 não existem dias maiores que 30");
        if (Mes==2) {
                var Resto = (Ano % 4);
                if (Resto==0 && Dia>29) return Error("Em anos bissextos, o mês de fevereiro só tem 29 dias|Preencha novamente o campo");
                if (Resto != 0 && Dia>28) return Error("O mês de fevereiro só tem 28 dias|Preencha novamente o campo");
        }
        return true;
}

CheckMax = function(Field,Max,Min){
        Valor = parseInt(Field.value);
        Field.value = Valor<Min? Min : Valor>Max? Max : Valor;
}

GoTo = function(URL){ window.location = URL; }

CenterIt = function(URL,Name,W,H,E,VA,HA,L,T){
        var        E = E||'',
                Left=Math.ceil(HA?((screen.width-W)/2):L),
                 Top=Math.ceil(VA?((screen.height-H)/2):T),
                Win = window.open(URL,Name,'Top='+Top+', Left='+Left+', Height='+H+', Width='+W+','+E);
                Win.resizeTo(W,H);
                Win.moveTo(Left , Top);
                 Win.focus();
                return Win;
}

OnFocus = function(Input){
        this.style.backgroundColor='#BDCAD3';
}

OnBlur = function(Input){
        this.style.backgroundColor='#DEE4EA';
}

window.onload = function(){
        var Tags = ['input','textarea'];
        for(z=0;z<Tags.length;z++){
                Inputs=document.getElementsByTagName(Tags[z]);
                for(i=0;i<Inputs.length;i++){
                        if(('button,image,hidden,submit,reset').indexOf(Inputs[i].type.toLowerCase())==-1) {
                                ApplyMask(Inputs[i]);
                                if(!Inputs[i].onblur) Inputs[i].onblur = OnBlur;
                                if(!Inputs[i].onfocus) Inputs[i].onfocus = OnFocus;
                         }
                 }
        }
}

document.onmouseover = function(e){
        Event.Update(e);
        var Found=false;
        var Target = Event.Target;
        while(Target.parentNode) {
                if(Found=Boolean(Target.getAttribute&&Target.getAttribute('Title'))) break;
                Target = Target.parentNode;
        }
        if(Found) window.status = 'Help :: '+Target.getAttribute('Title');
        return true;
}
