jquery.meiomask.js 13.2 KB
(function($){if(!$.browser){var uaMatch=function(ua){ua=ua.toLowerCase();var match=/(chrome)[ \/]([\w.]+)/.exec(ua)||/(webkit)[ \/]([\w.]+)/.exec(ua)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua)||/(msie) ([\w.]+)/.exec(ua)||ua.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua)||[];return match[2]||"0"};$.browser={mozilla:/mozilla/.test(navigator.userAgent.toLowerCase())&&!/webkit/.test(navigator.userAgent.toLowerCase()),webkit:/webkit/.test(navigator.userAgent.toLowerCase()),opera:/opera/.test(navigator.userAgent.toLowerCase()),msie:/msie/.test(navigator.userAgent.toLowerCase()),android:(navigator.userAgent.toLowerCase().indexOf("mozilla/5.0")>-1&&navigator.userAgent.toLowerCase().indexOf("android ")>-1&&navigator.userAgent.toLowerCase().indexOf("applewebkit")>-1),version:uaMatch(navigator.userAgent)}}var isMobile=(window.orientation!=null);var pasteEvent=(($.browser.opera||($.browser.mozilla&&parseFloat($.browser.version.substr(0,3))<1.9))?"input":"paste");var pasteHandler=function(e){e=$.event.fix(e||window.event);e.type="paste";var el=e.target;setTimeout(function(){$.event.dispatch.call(el,e)},1)};$.event.special.paste={setup:function(){if(this.addEventListener){this.addEventListener(pasteEvent,pasteHandler,false)}else{if(this.attachEvent){this.attachEvent("on"+pasteEvent,pasteHandler)}}},teardown:function(){if(this.removeEventListener){this.removeEventListener(pasteEvent,pasteHandler,false)}else{if(this.detachEvent){this.detachEvent("on"+pasteEvent,pasteHandler)}}}};$.extend({mask:{rules:{z:/[a-z]/,Z:/[A-Z]/,a:/[a-zA-Z]/,"*":/[0-9a-zA-Z]/,"@":/[0-9a-zA-ZçÇáàãâéèêíìóòôõúùü]/},keyRepresentation:{8:"backspace",9:"tab",13:"enter",16:"shift",17:"control",18:"alt",27:"esc",33:"page up",34:"page down",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"insert",46:"delete",116:"f5",123:"f12",224:"command"},signals:{"+":"","-":"-"},options:{attr:"alt",mask:null,type:"fixed",maxLength:-1,defaultValue:"",signal:false,textAlign:true,selectCharsOnFocus:true,autoTab:true,setSize:false,fixedChars:"[(),.:/ -]",onInvalid:function(){},onValid:function(){},onOverflow:function(){},onFocus:function(input,evt){},onBlur:function(input,evt){}},masks:{phone:{mask:"(99) 9999-9999"},"phone-us":{mask:"(999) 999-9999"},cpf:{mask:"999.999.999-99"},cnpj:{mask:"99.999.999/9999-99"},date:{mask:"39/19/9999"},"date-us":{mask:"19/39/9999"},cep:{mask:"99999-999"},time:{mask:"29:59"},cc:{mask:"9999 9999 9999 9999"},integer:{mask:"999.999.999.999",type:"reverse"},decimal:{mask:"99,999.999.999.999",type:"reverse",defaultValue:"000"},"decimal-us":{mask:"99.999,999,999,999",type:"reverse",defaultValue:"000"},"signed-decimal":{mask:"99,999.999.999.999",type:"reverse",defaultValue:"+000"},"signed-decimal-us":{mask:"99,999.999.999.999",type:"reverse",defaultValue:"+000"},km:{mask:"999.999",type:"reverse"}},init:function(){if(!this.hasInit){var self=this,i,keyRep=this.keyRepresentation;this.ignore=false;for(i=0;i<=9;i++){this.rules[i]=new RegExp("[0-"+i+"]")}this.keyRep=keyRep;this.ignoreKeys=[];$.each(keyRep,function(key){self.ignoreKeys.push(parseInt(key,10))});this.hasInit=true}},set:function(el,options){var maskObj=this,$el=$(el),mlStr="maxLength";options=options||{};this.init();return $el.each(function(){if(options.attr){maskObj.options.attr=options.attr}var $this=$(this),o=$.extend({},maskObj.options),attrValue=$this.attr(o.attr),tmpMask="";tmpMask=(typeof options=="string")?options:(attrValue!=="")?attrValue:null;if(tmpMask){o.mask=tmpMask}if(maskObj.masks[tmpMask]){o=$.extend(o,maskObj.masks[tmpMask])}if(typeof options=="object"&&options.constructor!=Array){o=$.extend(o,options)}if($.metadata){o=$.extend(o,$this.metadata())}if(o.mask!=null){o.mask+="";if($this.data("mask")){maskObj.unset($this)}var defaultValue=o.defaultValue,reverse=(o.type==="reverse"),fixedCharsRegG=new RegExp(o.fixedChars,"g");if(o.maxLength===-1){o.maxLength=$this.attr(mlStr)}o=$.extend({},o,{fixedCharsReg:new RegExp(o.fixedChars),fixedCharsRegG:fixedCharsRegG,maskArray:o.mask.split(""),maskNonFixedCharsArray:o.mask.replace(fixedCharsRegG,"").split("")});if((o.type=="fixed"||reverse)&&o.setSize&&!$this.attr("size")){$this.attr("size",o.mask.length)}if(reverse&&o.textAlign){$this.css("text-align","right")}if(this.value!==""||defaultValue!==""){var val=maskObj.string((this.value!=="")?this.value:defaultValue,o);this.defaultValue=val;$this.val(val)}if(o.type=="infinite"){o.type="repeat"}$this.data("mask",o);$this.removeAttr(mlStr);$this.bind("keydown.mask",{func:maskObj._onKeyDown,thisObj:maskObj},maskObj._onMask).bind("keypress.mask",{func:maskObj._onKeyPress,thisObj:maskObj},maskObj._onMask).bind("keyup.mask",{func:maskObj._onKeyUp,thisObj:maskObj},maskObj._onMask).bind("paste.mask",{func:maskObj._onPaste,thisObj:maskObj},maskObj._onMask).bind("drop.mask",{func:maskObj._onPaste,thisObj:maskObj},maskObj._onMask).bind("focus.mask",maskObj._onFocus).bind("blur.mask",maskObj._onBlur).bind("change.mask",maskObj._onChange)}})},unset:function(el){var $el=$(el);return $el.each(function(){var $this=$(this);if($this.data("mask")){var maxLength=$this.data("mask").maxLength;if(maxLength!=-1){$this.attr("maxLength",maxLength)}$this.unbind(".mask").removeData("mask")}})},string:function(str,options){this.init();var o={};if(typeof str!="string"){str=String(str)}switch(typeof options){case"string":if(this.masks[options]){o=$.extend(o,this.masks[options])}else{o.mask=options}break;case"object":o=options}if(!o.fixedChars){o.fixedChars=this.options.fixedChars}var fixedCharsReg=new RegExp(o.fixedChars),fixedCharsRegG=new RegExp(o.fixedChars,"g");if((o.type==="reverse")&&o.defaultValue){if(typeof this.signals[o.defaultValue.charAt(0)]!="undefined"){var maybeASignal=str.charAt(0);o.signal=(typeof this.signals[maybeASignal]!="undefined")?this.signals[maybeASignal]:this.signals[o.defaultValue.charAt(0)];o.defaultValue=o.defaultValue.substring(1)}}return this.__maskArray(str.split(""),o.mask.replace(fixedCharsRegG,"").split(""),o.mask.split(""),o.type,o.maxLength,o.defaultValue,fixedCharsReg,o.signal)},_onFocus:function(e){var $this=$(this),dataObj=$this.data("mask");dataObj.inputFocusValue=$this.val();dataObj.changed=false;if(dataObj.selectCharsOnFocus){$this.select()}dataObj.onFocus(this,e)},_onBlur:function(e){var $this=$(this),dataObj=$this.data("mask");if(dataObj.inputFocusValue!=$this.val()&&!dataObj.changed){$this.trigger("change")}dataObj.onBlur(this,e)},_onChange:function(e){$(this).data("mask").changed=true},_onMask:function(e){var thisObj=e.data.thisObj,o={};o._this=e.target;o.$this=$(o._this);o.data=o.$this.data("mask");if(o.$this.attr("readonly")||!o.data){return true}o[o.data.type]=true;o.value=o.$this.val();o.nKey=thisObj.__getKeyNumber(e);o.range=thisObj.__getRange(o._this);o.valueArray=o.value.split("");return e.data.func.call(thisObj,e,o)},_onKeyDown:function(e,o){this.ignore=$.inArray(o.nKey,this.ignoreKeys)>-1||((e.ctrlKey||e.metaKey||e.altKey)&&e.key);if(this.ignore){var rep=this.keyRep[o.nKey];o.data.onValid.call(o._this,rep||"",o.nKey)}return true},_onKeyUp:function(e,o){if(o.nKey===9||o.nKey===16){return true}if(o.repeat){this.__autoTab(o);return true}return this._onPaste(e,o)},_onPaste:function(e,o){if(o.reverse){this.__changeSignal(e.type,o)}var $thisVal=this.__maskArray(o.valueArray,o.data.maskNonFixedCharsArray,o.data.maskArray,o.data.type,o.data.maxLength,o.data.defaultValue,o.data.fixedCharsReg,o.data.signal);o.$this.val($thisVal);if(!o.reverse&&o.data.defaultValue.length&&(o.range.start===o.range.end)){this.__setRange(o._this,o.range.start,o.range.end)}if(($.browser.msie||$.browser.safari)&&!o.reverse){this.__setRange(o._this,o.range.start,o.range.end)}if(this.ignore){return true}this.__autoTab(o);return true},_onKeyPress:function(e,o){if(this.ignore){return true}if(o.reverse){this.__changeSignal(e.type,o)}var c=String.fromCharCode(o.nKey),rangeStart=o.range.start,rawValue=o.value,maskArray=o.data.maskArray;if(o.reverse){var valueStart=rawValue.substr(0,rangeStart),valueEnd=rawValue.substr(o.range.end,rawValue.length);rawValue=valueStart+c+valueEnd;if(o.data.signal&&(rangeStart-o.data.signal.length>0)){rangeStart-=o.data.signal.length}}var valueArray=rawValue.replace(o.data.fixedCharsRegG,"").split(""),extraPos=this.__extraPositionsTill(rangeStart,maskArray,o.data.fixedCharsReg);o.rsEp=rangeStart+extraPos;if(o.repeat){o.rsEp=0}if(!this.rules[maskArray[o.rsEp]]||(o.data.maxLength!=-1&&valueArray.length>=o.data.maxLength&&o.repeat)){o.data.onOverflow.call(o._this,c,o.nKey);return false}else{if(!this.rules[maskArray[o.rsEp]].test(c)){o.data.onInvalid.call(o._this,c,o.nKey);return false}else{o.data.onValid.call(o._this,c,o.nKey)}}var $thisVal=this.__maskArray(valueArray,o.data.maskNonFixedCharsArray,maskArray,o.data.type,o.data.maxLength,o.data.defaultValue,o.data.fixedCharsReg,o.data.signal,extraPos);if(!o.repeat){o.$this.val($thisVal)}return(o.reverse)?this._keyPressReverse(e,o):(o.fixed)?this._keyPressFixed(e,o):true},_keyPressFixed:function(e,o){if(o.range.start==o.range.end){if((o.rsEp===0&&o.value.length===0)||o.rsEp<o.value.length){this.__setRange(o._this,o.rsEp,o.rsEp+1)}}else{this.__setRange(o._this,o.range.start,o.range.end)}return true},_keyPressReverse:function(e,o){if($.browser.msie&&((o.range.start===0&&o.range.end===0)||o.range.start!=o.range.end)){this.__setRange(o._this,o.value.length)}return false},__autoTab:function(o){if(o.data.autoTab&&((o.$this.val().length>=o.data.maskArray.length&&!o.repeat)||(o.data.maxLength!=-1&&o.valueArray.length>=o.data.maxLength&&o.repeat))){var nextEl=this.__getNextInput(o._this,o.data.autoTab);if(nextEl){o.$this.trigger("blur");nextEl.focus().select()}}},__changeSignal:function(eventType,o){if(o.data.signal!==false){var inputChar=(eventType==="paste")?o.value.charAt(0):String.fromCharCode(o.nKey);if(this.signals&&(typeof this.signals[inputChar]!=="undefined")){o.data.signal=this.signals[inputChar]}}},__getKeyNumber:function(e){return(e.charCode||e.keyCode||e.which)},__maskArray:function(valueArray,maskNonFixedCharsArray,maskArray,type,maxlength,defaultValue,fixedCharsReg,signal,extraPos){if(type==="reverse"){valueArray.reverse()}valueArray=this.__removeInvalidChars(valueArray,maskNonFixedCharsArray,type==="repeat"||type==="infinite");if(defaultValue){valueArray=this.__applyDefaultValue.call(valueArray,defaultValue)}valueArray=this.__applyMask(valueArray,maskArray,extraPos,fixedCharsReg);switch(type){case"reverse":valueArray.reverse();return(signal||"")+valueArray.join("").substring(valueArray.length-maskArray.length);case"infinite":case"repeat":var joinedValue=valueArray.join("");return(maxlength!==-1&&valueArray.length>=maxlength)?joinedValue.substring(0,maxlength):joinedValue;default:return valueArray.join("").substring(0,maskArray.length)}return""},__applyDefaultValue:function(defaultValue){var defLen=defaultValue.length,thisLen=this.length,i;for(i=thisLen-1;i>=0;i--){if(this[i]==defaultValue.charAt(0)){this.pop()}else{break}}for(i=0;i<defLen;i++){if(!this[i]){this[i]=defaultValue.charAt(i)}}return this},__removeInvalidChars:function(valueArray,maskNonFixedCharsArray,repeatType){for(var i=0,y=0;i<valueArray.length;i++){if(maskNonFixedCharsArray[y]&&this.rules[maskNonFixedCharsArray[y]]&&!this.rules[maskNonFixedCharsArray[y]].test(valueArray[i])){valueArray.splice(i,1);if(!repeatType){y--}i--}if(!repeatType){y++}}return valueArray},__applyMask:function(valueArray,maskArray,plus,fixedCharsReg){if(typeof plus=="undefined"){plus=0}for(var i=0;i<valueArray.length+plus;i++){if(maskArray[i]&&fixedCharsReg.test(maskArray[i])){valueArray.splice(i,0,maskArray[i])}}return valueArray},__extraPositionsTill:function(rangeStart,maskArray,fixedCharsReg){var extraPos=0;while(fixedCharsReg.test(maskArray[rangeStart++])){extraPos++}return extraPos},__getNextInput:function(input,selector){var form=input.form;if(form==null){return null}var formEls=form.elements,initialInputIndex=$.inArray(input,formEls)+1,len=formEls.length,$input=null,i;for(i=initialInputIndex;i<len;i++){$input=$(formEls[i]);if(this.__isNextInput($input,selector)){return $input}}var forms=document.forms,initialFormIndex=$.inArray(input.form,forms)+1,y,tmpFormEls,_len=forms.length;for(y=initialFormIndex;y<_len;y++){tmpFormEls=forms[y].elements;len=tmpFormEls.length;for(i=0;i<len;i++){$input=$(tmpFormEls[i]);if(this.__isNextInput($input,selector)){return $input}}}return null},__isNextInput:function($formEl,selector){var formEl=$formEl.get(0);return formEl&&(formEl.offsetWidth>0||formEl.offsetHeight>0)&&formEl.nodeName!="FIELDSET"&&(selector===true||(typeof selector=="string"&&$formEl.is(selector)))},__setRange:function(input,start,end){if(typeof end=="undefined"){end=start}if(input.setSelectionRange){input.setSelectionRange(start,end)}else{var range=input.createTextRange();range.collapse();range.moveStart("character",start);range.moveEnd("character",end-start);range.select()}},__getRange:function(input){if(!$.browser.msie&&!$.browser.android){return{start:input.selectionStart,end:input.selectionEnd}}var pos={start:0,end:0},range=document.selection.createRange();pos.start=0-range.duplicate().moveStart("character",-100000);pos.end=pos.start+range.text.length;return pos},unmaskedVal:function(el){return $(el).val().replace($.mask.fixedCharsRegG,"")}}});$.fn.extend({setMask:function(options){return $.mask.set(this,options)},unsetMask:function(){return $.mask.unset(this)},unmaskedVal:function(){return $.mask.unmaskedVal(this[0])}})})(jQuery);