| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222 |
- (function(root, factory) {
- if (typeof define === 'function' && define.amd) {
- define(factory);
- } else if (typeof exports === 'object') {
- module.exports = factory();
- } else {
- root.VMasker = factory();
- }
- }(this, function() {
- var DIGIT = "9",
- ALPHA = "A",
- ALPHANUM = "S",
- BY_PASS_KEYS = [9, 16, 17, 18, 36, 37, 38, 39, 40, 91, 92, 93],
- isAllowedKeyCode = function(keyCode) {
- for (var i = 0, len = BY_PASS_KEYS.length; i < len; i++) {
- if (keyCode == BY_PASS_KEYS[i]) {
- return false;
- }
- }
- return true;
- },
- mergeMoneyOptions = function(opts) {
- opts = opts || {};
- opts = {
- delimiter: opts.delimiter || ".",
- lastOutput: opts.lastOutput,
- precision: opts.hasOwnProperty("precision") ? opts.precision : 2,
- separator: opts.separator || ",",
- showSignal: opts.showSignal,
- suffixUnit: opts.suffixUnit && (" " + opts.suffixUnit.replace(/[\s]/g,'')) || "",
- unit: opts.unit && (opts.unit.replace(/[\s]/g,'') + " ") || "",
- zeroCents: opts.zeroCents
- };
- opts.moneyPrecision = opts.zeroCents ? 0 : opts.precision;
- return opts;
- },
- // Fill wildcards past index in output with placeholder
- addPlaceholdersToOutput = function(output, index, placeholder) {
- for (; index < output.length; index++) {
- if(output[index] === DIGIT || output[index] === ALPHA || output[index] === ALPHANUM) {
- output[index] = placeholder;
- }
- }
- return output;
- }
- ;
- var VanillaMasker = function(elements) {
- this.elements = elements;
- };
- VanillaMasker.prototype.unbindElementToMask = function() {
- for (var i = 0, len = this.elements.length; i < len; i++) {
- this.elements[i].lastOutput = "";
- this.elements[i].onkeyup = false;
- this.elements[i].onkeydown = false;
- if (this.elements[i].value.length) {
- this.elements[i].value = this.elements[i].value.replace(/\D/g, '');
- }
- }
- };
- VanillaMasker.prototype.bindElementToMask = function(maskFunction) {
- var that = this,
- onType = function(e) {
- e = e || window.event;
- var source = e.target || e.srcElement;
- if (isAllowedKeyCode(e.keyCode)) {
- setTimeout(function() {
- that.opts.lastOutput = source.lastOutput;
- source.value = VMasker[maskFunction](source.value, that.opts);
- source.lastOutput = source.value;
- if (source.setSelectionRange && that.opts.suffixUnit) {
- source.setSelectionRange(source.value.length, (source.value.length - that.opts.suffixUnit.length));
- }
- }, 0);
- }
- }
- ;
- for (var i = 0, len = this.elements.length; i < len; i++) {
- this.elements[i].lastOutput = "";
- this.elements[i].onkeyup = onType;
- if (this.elements[i].value.length) {
- this.elements[i].value = VMasker[maskFunction](this.elements[i].value, this.opts);
- }
- }
- };
- VanillaMasker.prototype.maskMoney = function(opts) {
- this.opts = mergeMoneyOptions(opts);
- this.bindElementToMask("toMoney");
- };
- VanillaMasker.prototype.maskNumber = function() {
- this.opts = {};
- this.bindElementToMask("toNumber");
- };
-
- VanillaMasker.prototype.maskAlphaNum = function() {
- this.opts = {};
- this.bindElementToMask("toAlphaNumeric");
- };
- VanillaMasker.prototype.maskPattern = function(pattern) {
- this.opts = {pattern: pattern};
- this.bindElementToMask("toPattern");
- };
- VanillaMasker.prototype.unMask = function() {
- this.unbindElementToMask();
- };
- var VMasker = function(el) {
- if (!el) {
- throw new Error("VanillaMasker: There is no element to bind.");
- }
- var elements = ("length" in el) ? (el.length ? el : []) : [el];
- return new VanillaMasker(elements);
- };
- VMasker.toMoney = function(value, opts) {
- opts = mergeMoneyOptions(opts);
- if (opts.zeroCents) {
- opts.lastOutput = opts.lastOutput || "";
- var zeroMatcher = ("("+ opts.separator +"[0]{0,"+ opts.precision +"})"),
- zeroRegExp = new RegExp(zeroMatcher, "g"),
- digitsLength = value.toString().replace(/[\D]/g, "").length || 0,
- lastDigitLength = opts.lastOutput.toString().replace(/[\D]/g, "").length || 0
- ;
- value = value.toString().replace(zeroRegExp, "");
- if (digitsLength < lastDigitLength) {
- value = value.slice(0, value.length - 1);
- }
- }
- var number = value.toString().replace(/[\D]/g, ""),
- clearDelimiter = new RegExp("^(0|\\"+ opts.delimiter +")"),
- clearSeparator = new RegExp("(\\"+ opts.separator +")$"),
- money = number.substr(0, number.length - opts.moneyPrecision),
- masked = money.substr(0, money.length % 3),
- cents = new Array(opts.precision + 1).join("0")
- ;
- money = money.substr(money.length % 3, money.length);
- for (var i = 0, len = money.length; i < len; i++) {
- if (i % 3 === 0) {
- masked += opts.delimiter;
- }
- masked += money[i];
- }
- masked = masked.replace(clearDelimiter, "");
- masked = masked.length ? masked : "0";
- var signal = "";
- if(opts.showSignal === true) {
- signal = value < 0 || (value.startsWith && value.startsWith('-')) ? "-" : "";
- }
- if (!opts.zeroCents) {
- var beginCents = number.length - opts.precision,
- centsValue = number.substr(beginCents, opts.precision),
- centsLength = centsValue.length,
- centsSliced = (opts.precision > centsLength) ? opts.precision : centsLength
- ;
- cents = (cents + centsValue).slice(-centsSliced);
- }
- var output = opts.unit + signal + masked + opts.separator + cents;
- return output.replace(clearSeparator, "") + opts.suffixUnit;
- };
- VMasker.toPattern = function(value, opts) {
- var pattern = (typeof opts === 'object' ? opts.pattern : opts),
- patternChars = pattern.replace(/\W/g, ''),
- output = pattern.split(""),
- values = value.toString().replace(/\W/g, ""),
- charsValues = values.replace(/\W/g, ''),
- index = 0,
- i,
- outputLength = output.length,
- placeholder = (typeof opts === 'object' ? opts.placeholder : undefined)
- ;
-
- for (i = 0; i < outputLength; i++) {
- // Reached the end of input
- if (index >= values.length) {
- if (patternChars.length == charsValues.length) {
- return output.join("");
- }
- else if ((placeholder !== undefined) && (patternChars.length > charsValues.length)) {
- return addPlaceholdersToOutput(output, i, placeholder).join("");
- }
- else {
- break;
- }
- }
- // Remaining chars in input
- else{
- if ((output[i] === DIGIT && values[index].match(/[0-9]/)) ||
- (output[i] === ALPHA && values[index].match(/[a-zA-Z]/)) ||
- (output[i] === ALPHANUM && values[index].match(/[0-9a-zA-Z]/))) {
- output[i] = values[index++];
- } else if (output[i] === DIGIT || output[i] === ALPHA || output[i] === ALPHANUM) {
- if(placeholder !== undefined){
- return addPlaceholdersToOutput(output, i, placeholder).join("");
- }
- else{
- return output.slice(0, i).join("");
- }
- }
- }
- }
- return output.join("").substr(0, i);
- };
- VMasker.toNumber = function(value) {
- return value.toString().replace(/(?!^-)[^0-9]/g, "");
- };
-
- VMasker.toAlphaNumeric = function(value) {
- return value.toString().replace(/[^a-z0-9 ]+/i, "");
- };
- return VMasker;
- }));
|