angular.module("ui.mask",[]).value("uiMaskConfig",{maskDefinitions:{"9":/\d/,A:/[a-zA-Z]/,"*":/[a-zA-Z0-9]/},clearOnBlur:!0,clearOnBlurPlaceholder:!1,escChar:"\\",eventsToHandle:["input","keyup","click","focus"],addDefaultPlaceholder:!0,allowInvalidValue:!1}).provider("uiMask.Config",function(){var n={};this.maskDefinitions=function(t){return n.maskDefinitions=t};this.clearOnBlur=function(t){return n.clearOnBlur=t};this.clearOnBlurPlaceholder=function(t){return n.clearOnBlurPlaceholder=t};this.eventsToHandle=function(t){return n.eventsToHandle=t};this.addDefaultPlaceholder=function(t){return n.addDefaultPlaceholder=t};this.allowInvalidValue=function(t){return n.allowInvalidValue=t};this.$get=["uiMaskConfig",function(t){var r=t;for(var i in n)angular.isObject(n[i])&&!angular.isArray(n[i])?angular.extend(r[i],n[i]):r[i]=n[i];return r}]}).directive("uiMask",["uiMask.Config",function(n){function t(n){return n===document.activeElement&&(!document.hasFocus||document.hasFocus())&&!!(n.type||n.href||~n.tabIndex)}return{priority:100,require:"ngModel",restrict:"A",compile:function(){var i=angular.copy(n);return function(n,r,u,f){function pt(n){return angular.isDefined(n)?(si(n),!l)?kt():(ri(),ui(),!0):kt()}function wt(n){n&&(h=n,!l||r.val().length===0&&angular.isDefined(u.placeholder)||r.val(v(a(r.val()))))}function ti(){return pt(u.uiMask)}function bt(n){return l?(o=a(n||""),c=et(o),f.$setValidity("mask",c),!o.length)?undefined:c||s.allowInvalidValue?v(o):undefined:n}function ii(n){return l?(o=a(n||""),c=et(o),f.$viewValue=o.length?v(o):"",f.$setValidity("mask",c),c||s.allowInvalidValue?ft?f.$viewValue:o:void 0):n}function kt(){return l=!1,fi(),angular.isDefined(it)?r.attr("placeholder",it):r.removeAttr("placeholder"),angular.isDefined(at)?r.attr("maxlength",at):r.removeAttr("maxlength"),r.val(f.$modelValue),f.$viewValue=f.$modelValue,!1}function ri(){o=ut=a(f.$modelValue||"");lt=rt=v(o);c=et(o);u.maxlength&&r.attr("maxlength",e[e.length-1]*2);!it&&s.addDefaultPlaceholder&&r.attr("placeholder",h);for(var n=f.$modelValue,t=f.$formatters.length;t--;)n=f.$formatters[t](n);f.$viewValue=n||"";f.$render()}function ui(){p||(r.bind("blur",dt),r.bind("mousedown mouseup",k),r.bind("keydown",gt),r.bind(s.eventsToHandle.join(" "),y),p=!0)}function fi(){p&&(r.unbind("blur",dt),r.unbind("mousedown",k),r.unbind("mouseup",k),r.unbind("keydown",gt),r.unbind("input",y),r.unbind("keyup",y),r.unbind("click",y),r.unbind("focus",y),p=!1)}function et(n){return n.length?n.length>=tt:!0}function a(n){var f="",s=r[0],i=nt.slice(),u=w,c=u+g(s),t,e,o="";return n=n.toString(),t=0,e=n.length-h.length,angular.forEach(ct,function(i){var r=i.position;r>=u&&r<c||(r>=u&&(r+=e),n.substring(r,r+i.value.length)===i.value&&(o+=n.slice(t,r),t=r+i.value.length))}),n=o+n.slice(t),angular.forEach(n.split(""),function(n){i.length&&i[0].test(n)&&(f+=n,i.shift())}),f}function v(n){var t="",i=e.slice();return angular.forEach(h.split(""),function(r,u){n.length&&u===i[0]?(t+=n.charAt(0)||"_",n=n.substr(1),i.shift()):t+=r}),t}function ei(n){var t=angular.isDefined(u.uiMaskPlaceholder)?u.uiMaskPlaceholder:u.placeholder,i;return angular.isDefined(t)&&t[n]?t[n]:(i=angular.isDefined(u.uiMaskPlaceholderChar)&&u.uiMaskPlaceholderChar?u.uiMaskPlaceholderChar:"_",i.toLowerCase()==="space"?" ":i[0])}function oi(){var r=h.split(""),t,n,i;return e&&!isNaN(e[0])&&angular.forEach(e,function(n){r[n]="_"}),t=r.join(""),n=t.replace(/[_]+/g,"_").split("_"),n=n.filter(function(n){return n!==""}),i=0,n.map(function(n){var r=t.indexOf(n,i);return i=r+1,{value:n,position:r}})}function si(n){var t=0;if(e=[],nt=[],h="",angular.isString(n)){tt=0;var i=!1,u=0,f=n.split(""),r=!1;angular.forEach(f,function(n,f){r?(r=!1,h+=n,t++):s.escChar===n?r=!0:s.maskDefinitions[n]?(e.push(t),h+=ei(f-u),nt.push(s.maskDefinitions[n]),t++,i||tt++,i=!1):n==="?"?(i=!0,u++):(h+=n,t++)})}e.push(e.slice().pop()+1);ct=oi();l=e.length>1?!0:!1}function dt(){if((s.clearOnBlur||s.clearOnBlurPlaceholder&&o.length===0&&u.placeholder)&&(w=0,b=0,c&&o.length!==0||(lt="",r.val(""),n.$apply(function(){f.$pristine||f.$setViewValue("")}))),o!==ot){var t=r.val(),i=o===""&&t&&angular.isDefined(u.uiMaskPlaceholderChar)&&u.uiMaskPlaceholderChar==="space";i&&r.val("");hi(r[0]);i&&r.val(t)}ot=o}function hi(n){var t;if(angular.isFunction(window.Event)&&!n.fireEvent)try{t=new Event("change",{view:window,bubbles:!0,cancelable:!1})}catch(i){t=document.createEvent("HTMLEvents");t.initEvent("change",!1,!0)}finally{n.dispatchEvent(t)}else"createEvent"in document?(t=document.createEvent("HTMLEvents"),t.initEvent("change",!1,!0),n.dispatchEvent(t)):n.fireEvent&&n.fireEvent("onchange")}function k(n){n.type==="mousedown"?r.bind("mouseout",st):r.unbind("mouseout",st)}function st(){b=g(this);r.unbind("mouseout",st)}function gt(n){var i=n.which===8,t=ni(this)-1||0,u=n.which===90&&n.ctrlKey;if(i){while(t>=0){if(d(t)){ht(this,t+1);break}t--}vt=t===-1}u&&(r.val(""),n.preventDefault())}function y(t){var u,o,st;if(t=t||{},u=t.which,o=t.type,u!==16&&u!==91){var l=r.val(),nt=rt,y,tt=!1,s=a(l),ct=ut,i=ni(this)||0,it=w||0,lt=i-it,c=e[0],p=e[s.length]||e.slice().shift(),k=b||0,pt=g(this)>0,at=k>0,yt=l.length>nt.length||k&&l.length>nt.length-k,ft=l.length<nt.length||k&&l.length===nt.length-k,wt=u>=37&&u<=40&&t.shiftKey,bt=u===37,et=u===8||o!=="keyup"&&ft&&lt===-1,kt=u===46||o!=="keyup"&&ft&&lt===0&&!at,ot=(bt||et||o==="click")&&i>c;if(b=g(this),!wt&&(!pt||o!=="click"&&o!=="keyup"&&o!=="focus")){if(et&&vt){r.val(h);n.$apply(function(){f.$setViewValue("")});ht(this,it);return}if(o==="input"&&ft&&!at&&s===ct){while(et&&i>c&&!d(i))i--;while(kt&&i<p&&e.indexOf(i)===-1)i++;st=e.indexOf(i);s=s.substring(0,st)+s.substring(st+1);s!==ct&&(tt=!0)}for(y=v(s),rt=y,ut=s,!tt&&l.length>y.length&&(tt=!0),r.val(y),tt&&n.$apply(function(){f.$setViewValue(y)}),yt&&i<=c&&(i=c+1),ot&&i--,i=i>p?p:i<c?c:i;!d(i)&&i>c&&i<p;)i+=ot?-1:1;(ot&&i<p||yt&&!d(it))&&i++;w=i;ht(this,i)}}}function d(n){return e.indexOf(n)>-1}function ni(n){if(!n)return 0;if(n.selectionStart!==undefined)return n.selectionStart;if(document.selection&&t(r[0])){n.focus();var i=document.selection.createRange();return i.moveStart("character",n.value?-n.value.length:0),i.text.length}return 0}function ht(n,i){if(!n)return 0;if(n.offsetWidth!==0&&n.offsetHeight!==0)if(n.setSelectionRange)t(r[0])&&(n.focus(),n.setSelectionRange(i,i));else if(n.createTextRange){var u=n.createTextRange();u.collapse(!0);u.moveEnd("character",i);u.moveStart("character",i);u.select()}}function g(n){return n?n.selectionStart!==undefined?n.selectionEnd-n.selectionStart:window.getSelection?window.getSelection().toString().length:document.selection?document.selection.createRange().text.length:0:0}var l=!1,p=!1,e,nt,h,ct,tt,o,lt,c,it=u.placeholder,at=u.maxlength,rt,ut,w,b,vt,yt=f.$isEmpty,ft,s,ot;f.$isEmpty=function(n){return l?yt(a(n||"")):yt(n)};ft=!1;u.$observe("modelViewValue",function(n){n==="true"&&(ft=!0)});u.$observe("allowInvalidValue",function(n){s.allowInvalidValue=n===""?!0:!!n;bt(f.$modelValue)});s={};u.uiOptions?(s=n.$eval("["+u.uiOptions+"]"),s=angular.isObject(s[0])?function(n,t){for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(t[i]===undefined?t[i]=angular.copy(n[i]):angular.isObject(t[i])&&!angular.isArray(t[i])&&(t[i]=angular.extend({},n[i],t[i])));return t}(i,s[0]):i):s=i;u.$observe("uiMask",pt);angular.isDefined(u.uiMaskPlaceholder)?u.$observe("uiMaskPlaceholder",wt):u.$observe("placeholder",wt);angular.isDefined(u.uiMaskPlaceholderChar)&&u.$observe("uiMaskPlaceholderChar",ti);f.$formatters.unshift(bt);f.$parsers.unshift(ii);ot=r.val();r.bind("mousedown mouseup",k);Array.prototype.indexOf||(Array.prototype.indexOf=function(n){var u,r,t,i;if(this===null)throw new TypeError;if((u=Object(this),r=u.length>>>0,r===0)||(t=0,arguments.length>1&&(t=Number(arguments[1]),t!==t?t=0:t!==0&&t!==Infinity&&t!==-Infinity&&(t=(t>0||-1)*Math.floor(Math.abs(t)))),t>=r))return-1;for(i=t>=0?t:Math.max(r-Math.abs(t),0);i<r;i++)if(i in u&&u[i]===n)return i;return-1})}}}}])