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]);
      }
}


AZ = /[A-Z]/i;
Acentos = /[À-ÿ]/i;
Num = /[0-9]/;
IsNull = function(Str){return (Str==null || Str=='' || Str.split('').length-1==Str.length);}

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, Field, KeyCode){
      var      IsIE = navigator.appName.toLowerCase().indexOf('microsoft')!=-1,
            FloatPoint = Field.getAttribute('FloatPoint') || 2;
      if(KeyCode!=44 && KeyCode!=46) {
            if((FracPart=Field.value.match(/\.(.*)/)) && (FloatPoint <= FracPart[1].length)) {
                  Field.value = Field.value.match(/(.*)\./)[1] + String.fromCharCode(KeyCode) + FracPart[0];
                  return false;
            }
            return true;
      }
      if(KeyCode==44)
            if(IsIE) event.keyCode=46;
            else { alert('Utilize o ponto (".") como separador decimal'); return false; }
      if(Field.value.indexOf('.')!=-1 || IsNull(Field.value)) return
false;
      return true;
}

