Browse Source

numeric alias enhancements

Robin Herbots 9 years ago
parent
commit
8350914be4
5 changed files with 130 additions and 207 deletions
  1. 1 0
      CHANGELOG.md
  2. 27 42
      js/inputmask.js
  3. 64 145
      js/inputmask.numeric.extensions.js
  4. 2 2
      qunit/config.js
  5. 36 18
      qunit/tests_numeric.js

+ 1 - 0
CHANGELOG.md

@@ -7,6 +7,7 @@ All notable changes to this project will be documented in this file.
 - VIN mask #1199
 
 ### Updates
+- Can not change integer part when it is "0" #1192
 - change funtionality of postValidation => result may be true|false
 - improve getmetadata
 - patchValueProperty - enable native value property patch on IE10/IE11

+ 27 - 42
js/inputmask.js

@@ -805,8 +805,8 @@
 				return (before !== -1 && (closestTo - before) > 1) || after < closestTo ? before : after;
 			}
 
-			function setValidPosition(pos, validTest, fromSetValid) {
-				if (opts.insertMode && getMaskSet().validPositions[pos] !== undefined && fromSetValid === undefined) {
+			function setValidPosition(pos, validTest, fromSetValid, isSelection) {
+				if (isSelection || (opts.insertMode && getMaskSet().validPositions[pos] !== undefined && fromSetValid === undefined)) {
 					//reposition & revalidate others
 					var positionsClone = $.extend(true, {}, getMaskSet().validPositions),
 						lvp = getLastValidPosition(),
@@ -1277,8 +1277,17 @@
 			}
 
 			function isValid(pos, c, strict, fromSetValid) { //strict true ~ no correction or autofill
+				function isSelection(posObj) {
+					return isRTL ? (posObj.begin - posObj.end) > 1 || ((posObj.begin - posObj.end) === 1 && opts.insertMode) :
+						(posObj.end - posObj.begin) > 1 || ((posObj.end - posObj.begin) === 1 && opts.insertMode);
+				}
 				strict = strict === true; //always set a value to strict to prevent possible strange behavior in the extensions
 
+				var maskPos = pos;
+				if (pos.begin != undefined) { //position was a position object - used to handle a delete by typing over a selection
+					maskPos = isRTL && !isSelection(pos) ? pos.end : pos.begin;
+				}
+
 				function _isValid(position, c, strict, fromSetValid) {
 					var rslt = false;
 					$.each(getTests(position), function(ndx, tst) {
@@ -1359,7 +1368,7 @@
 
 							if (!setValidPosition(validatedPos, $.extend({}, tst, {
 									"input": casing(elem, test)
-								}), fromSetValid)) {
+								}), fromSetValid, isSelection(pos))) {
 								rslt = false;
 							}
 							return false; //break from $.each
@@ -1515,14 +1524,14 @@
 				var buffer = getBuffer();
 
 				//find previous valid
-				for (var pndx = pos - 1; pndx > -1; pndx--) {
+				for (var pndx = maskPos - 1; pndx > -1; pndx--) {
 					if (getMaskSet().validPositions[pndx]) {
 						break;
 					}
 				}
 				////fill missing nonmask and valid placeholders
 				pndx++;
-				for (; pndx < pos; pndx++) {
+				for (; pndx < maskPos; pndx++) {
 					//console.log("missing " + pndx + " " + buffer[pndx] + " ismask " + isMask(pndx) + " plchldr " + getPlaceholder(pndx) + " nrt " + getTests(pndx).len);
 					if (getMaskSet().validPositions[pndx] === undefined && (((!isMask(pndx) || buffer[pndx] !== getPlaceholder(pndx)) && getTests(pndx).length > 1) || (buffer[pndx] === opts.radixPoint || buffer[pndx] === "0" && $.inArray(opts.radixPoint, buffer) < pndx))) //special case for decimals ~ = placeholder but yet valid input
 					{
@@ -1531,13 +1540,14 @@
 					}
 				}
 
-				var maskPos = pos,
-					result = false,
+				var result = false,
 					positionsClone = $.extend(true, {}, getMaskSet().validPositions); //clone the currentPositions
 
-				//if (fromSetValid && maskPos >= getMaskLength()) {
-				//		resetMaskSet(true); //masklenght can be altered on the process => reset to get the actual length
-				//}
+				if (isSelection(pos)) {
+					handleRemove(undefined, Inputmask.keyCode.DELETE, pos, true);
+					maskPos = getMaskSet().p;
+				}
+
 				if (maskPos < getMaskLength()) {
 					result = _isValid(maskPos, c, strict, fromSetValid);
 					if ((!strict || fromSetValid === true) && result === false) {
@@ -1562,7 +1572,7 @@
 					}
 				}
 				if (result === false && opts.keepStatic) { //try fuzzy alternator logic
-					result = alternate(pos, c, strict, fromSetValid);
+					result = alternate(maskPos, c, strict, fromSetValid);
 				}
 				if (result === true) {
 					result = {
@@ -1573,6 +1583,10 @@
 					result = opts.postValidation(getBuffer(true), result, opts) ? result : false;
 				}
 
+				if (result.pos === undefined) {
+					result.pos = maskPos;
+				}
+
 				if (result === false) {
 					resetMaskSet(true);
 					getMaskSet().validPositions = $.extend(true, {}, positionsClone); //revert validation changes
@@ -1897,11 +1911,6 @@
 				return complete;
 			}
 
-			function isSelection(begin, end) {
-				return isRTL ? (begin - end) > 1 || ((begin - end) === 1 && opts.insertMode) :
-					(end - begin) > 1 || ((end - begin) === 1 && opts.insertMode);
-			}
-
 			var EventRuler = {
 				on: function(input, eventName, eventHandler) {
 					var ev = function(e) {
@@ -2266,28 +2275,10 @@
 							} : caret(input),
 							forwardPosition, c = String.fromCharCode(k);
 
-						//should we clear a possible selection??
-						var isSlctn = isSelection(pos.begin, pos.end);
-						if (isSlctn) {
-							getMaskSet().undoPositions = $.extend(true, {}, getMaskSet().validPositions); //init undobuffer for recovery when not valid
-							handleRemove(input, Inputmask.keyCode.DELETE, pos, true);
-							pos.begin = getMaskSet().p;
-							if (!opts.insertMode) { //preserve some space
-								opts.insertMode = !opts.insertMode;
-								setValidPosition(pos.begin, strict);
-								opts.insertMode = !opts.insertMode;
-							}
-							isSlctn = !opts.multi;
-						}
-
 						getMaskSet().writeOutBuffer = true;
-						var p = isRTL && !isSlctn ? pos.end : pos.begin;
-						var valResult = isValid(p, c, strict);
+						var valResult = isValid(pos, c, strict);
 						if (valResult !== false) {
-							if (valResult !== true) {
-								p = valResult.pos !== undefined ? valResult.pos : p; //set new position from isValid
-								c = valResult.c !== undefined ? valResult.c : c; //set new char from isValid
-							}
+							var p = valResult.pos; //set new position from isValid
 							resetMaskSet(true);
 							if (valResult.caret !== undefined) {
 								forwardPosition = valResult.caret;
@@ -2313,13 +2304,7 @@
 										if (isComplete(buffer) === true) $input.trigger("complete");
 									}, 0);
 								}
-							} else if (isSlctn) {
-								getMaskSet().buffer = undefined;
-								getMaskSet().validPositions = getMaskSet().undoPositions;
 							}
-						} else if (isSlctn) {
-							getMaskSet().buffer = undefined;
-							getMaskSet().validPositions = getMaskSet().undoPositions;
 						}
 
 						if (opts.showTooltip) { //update tooltip

+ 64 - 145
js/inputmask.numeric.extensions.js

@@ -118,7 +118,7 @@ Optional extensions on the jquery.inputmask base
 				insertMode: true,
 				autoUnmask: false,
 				unmaskAsNumber: false,
-				postFormat: function(buffer, pos, reformatOnly, opts) { //this needs to be removed // this is crap
+				postFormat: function(buffer, pos, opts) { //this needs to be removed // this is crap
 					// console.log(buffer);
 					if (opts.numericInput === true) {
 						buffer = buffer.reverse();
@@ -137,31 +137,16 @@ Optional extensions on the jquery.inputmask base
 
 					var needsRefresh = false,
 						charAtPos = buffer[pos];
-					if (opts.groupSeparator === "" || (opts.numericInput !== true &&
-							($.inArray(opts.radixPoint, buffer) !== -1 && pos > $.inArray(opts.radixPoint, buffer)) ||
-							new RegExp("[" + Inputmask.escapeRegex(opts.negationSymbol.front) + "\+]").test(charAtPos))) {
-						if (suffixStripped) {
-							for (i = 0, l = opts.suffix.length; i < l; i++) {
-								buffer.push(opts.suffix.charAt(i));
-							}
-						}
-						//console.log("return input " + buffer);
-						return {
-							pos: pos
-						};
-					}
 
 					var cbuf = buffer.slice();
 					if (charAtPos === opts.groupSeparator) {
 						cbuf.splice(pos--, 1);
 						charAtPos = cbuf[pos];
 					}
-					if (reformatOnly) {
-						if (charAtPos !== opts.radixPoint) cbuf[pos] = "?";
-					} else cbuf.splice(pos, 0, "?"); //set position indicator
+					if (charAtPos !== opts.radixPoint && charAtPos !== opts.negationSymbol.front && charAtPos !== opts.negationSymbol.back) cbuf[pos] = "?";
 					var bufVal = cbuf.join(""),
 						bufValOrigin = bufVal;
-					if (bufVal.length > 0 && opts.autoGroup || (reformatOnly && bufVal.indexOf(opts.groupSeparator) !== -1)) {
+					if (bufVal.length > 0 && opts.autoGroup || bufVal.indexOf(opts.groupSeparator) !== -1) {
 						var escapedGroupSeparator = Inputmask.escapeRegex(opts.groupSeparator);
 						needsRefresh = bufVal.indexOf(opts.groupSeparator) === 0;
 						bufVal = bufVal.replace(new RegExp(escapedGroupSeparator, "g"), "");
@@ -170,7 +155,7 @@ Optional extensions on the jquery.inputmask base
 						if (bufVal !== (opts.prefix + "?0") && bufVal.length >= (opts.groupSize + opts.prefix.length)) {
 							//needsRefresh = true;
 							var reg = new RegExp("([-\+]?[\\d\?]+)([\\d\?]{" + opts.groupSize + "})");
-							while (reg.test(bufVal)) {
+							while (reg.test(bufVal) && opts.groupSeparator !== "") {
 								bufVal = bufVal.replace(reg, "$1" + opts.groupSeparator + "$2");
 								bufVal = bufVal.replace(opts.groupSeparator + opts.groupSeparator, opts.groupSeparator);
 							}
@@ -185,9 +170,8 @@ Optional extensions on the jquery.inputmask base
 						buffer[i] = bufVal.charAt(i);
 					}
 					var newPos = $.inArray("?", buffer);
-					if (newPos === -1 && charAtPos === opts.radixPoint) newPos = $.inArray(opts.radixPoint, buffer);
-					if (reformatOnly) buffer[newPos] = charAtPos;
-					else buffer.splice(newPos, 1);
+					if (newPos === -1) newPos = $.inArray(charAtPos, buffer);
+					buffer[newPos] = charAtPos;
 
 					if (!needsRefresh && suffixStripped) {
 						for (i = 0, l = opts.suffix.length; i < l; i++) {
@@ -209,56 +193,75 @@ Optional extensions on the jquery.inputmask base
 					};
 				},
 				onBeforeWrite: function(e, buffer, caretPos, opts) {
-					if (e && (e.type === "blur" || e.type === "checkval")) {
-						//handle minvalue
-						var maskedValue = buffer.join(""),
-							processValue = maskedValue.replace(opts.prefix, "");
+					if (e && (e.type === "blur" || e.type === "checkval" || e.type === "keydown")) {
+						var maskedValue = opts.numericInput ? buffer.slice().reverse().join("") : buffer.join(""),
+							processValue = maskedValue.replace(opts.prefix, ""),
+							minmaxed = false;
 						processValue = processValue.replace(opts.suffix, "");
 						processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), "");
-						if (opts.radixPoint === ",") processValue = processValue.replace(Inputmask.escapeRegex(opts.radixPoint), ".");
+						if (opts.radixPoint === ",") processValue = processValue.replace(opts.radixPoint, ".");
+						//handle negation symbol
+						var isNegative = processValue.match(new RegExp("[-" + Inputmask.escapeRegex(opts.negationSymbol.front) + "]", "g")),
+							isNegative = isNegative !== null && isNegative.length === 1;
+						processValue = processValue.replace(new RegExp("[-" + Inputmask.escapeRegex(opts.negationSymbol.front) + "]", "g"), "");
+						processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.negationSymbol.back) + "$"), "");
+						processValue = processValue === opts.negationSymbol.front ? processValue + "0" : processValue;
 
 						if (isFinite(processValue)) {
-							if (isFinite(opts.min) && parseFloat(processValue) < parseFloat(opts.min)) {
-								return $.extend(true, {
-									"refreshFromBuffer": true,
-									"buffer": (opts.prefix + opts.min).split("")
-								}, opts.postFormat((opts.prefix + opts.min).split(""), 0, true, opts));
+							var floatValue = parseFloat(processValue),
+								signedFloatValue = isNegative ? floatValue * -1 : floatValue;
+							if (opts.min !== null && isFinite(opts.min)) {
+								if (signedFloatValue < parseFloat(opts.min)) {
+									floatValue = Math.abs(opts.min);
+									isNegative = opts.min < 0;
+									minmaxed = true;
+								}
 							}
-						}
-						if (opts.numericInput !== true) {
-							var tmpBufSplit = opts.radixPoint !== "" ? buffer.join("").split(opts.radixPoint) : [buffer.join("")],
-								matchRslt = tmpBufSplit[0].match(opts.regex.integerPart(opts)),
-								matchRsltDigits = tmpBufSplit.length === 2 ? tmpBufSplit[1].match(opts.regex.integerNPart(opts)) : undefined;
-							if (matchRslt) {
-								if ((matchRslt[0] === opts.negationSymbol.front + "0" || matchRslt[0] === opts.negationSymbol.front || matchRslt[0] === "+") && (matchRsltDigits === undefined || matchRsltDigits[0].match(/^0+$/))) {
-									buffer.splice(matchRslt.index, 1);
+							if (!minmaxed && opts.max !== null && isFinite(opts.max)) {
+								if (signedFloatValue > parseFloat(opts.max)) {
+									floatValue = Math.abs(opts.max);
+									isNegative = opts.max < 0;
+									minmaxed = true;
 								}
-								var radixPosition = $.inArray(opts.radixPoint, buffer);
-								if (radixPosition !== -1) {
-									if (isFinite(opts.digits) && !opts.digitsOptional) {
-										for (var i = 1; i <= opts.digits; i++) {
-											if (buffer[radixPosition + i] === undefined || buffer[radixPosition + i] === opts.placeholder.charAt(0)) {
-												buffer[radixPosition + i] = "0";
-											}
-										}
-										return {
-											"refreshFromBuffer": maskedValue !== buffer.join(""),
-											"buffer": buffer
-										};
-									} else if (radixPosition === buffer.length - opts.suffix.length - 1) {
-										buffer.splice(radixPosition, 1);
-										return {
-											"refreshFromBuffer": true,
-											"buffer": buffer
-										};
+							}
+
+							processValue = floatValue.toString().replace(".", opts.radixPoint).split('');
+							if (isFinite(opts.digits)) {
+								var radixPosition = $.inArray(opts.radixPoint, processValue);
+								var rpb = $.inArray(opts.radixPoint, maskedValue);
+								if (radixPosition === -1) {
+									processValue.push(opts.radixPoint);
+									radixPosition = processValue.length - 1;
+								}
+								for (var i = 1; i <= opts.digits; i++) {
+									if (!opts.digitsOptional && (processValue[radixPosition + i] === undefined || processValue[radixPosition + i] === opts.placeholder.charAt(0))) {
+										processValue[radixPosition + i] = "0";
+									} else if (rpb != -1 && maskedValue[rpb + i] != undefined) {
+										processValue[radixPosition + i] = processValue[radixPosition + i] || maskedValue[rpb + i];
 									}
 								}
+
+								if (processValue[processValue.length - 1] == opts.radixPoint) {
+									delete processValue[processValue.length - 1];
+								}
+							}
+
+							if ((floatValue.toString() !== processValue && floatValue.toString() + "." !== processValue) || isNegative) {
+								if (isNegative && (floatValue !== 0 || e.type !== "blur")) {
+									processValue.unshift(opts.negationSymbol.front);
+									processValue.push(opts.negationSymbol.back);
+								}
+								processValue = (opts.prefix + processValue.join('')).split("");
+								if (opts.numericInput) processValue = processValue.reverse();
+								var rslt = opts.postFormat(processValue, opts.numericInput ? caretPos : caretPos - 1, opts);
+								if (rslt.buffer)
+									rslt.refreshFromBuffer = rslt.buffer.join('') != buffer.join('');
+								return rslt;
 							}
 						}
 					}
-
 					if (opts.autoGroup) {
-						var rslt = opts.postFormat(buffer, opts.numericInput ? caretPos : caretPos - 1, true, opts);
+						var rslt = opts.postFormat(buffer, opts.numericInput ? caretPos : caretPos - 1, opts);
 						rslt.caret = caretPos <= opts.prefix.length ? rslt.pos : rslt.pos + 1;
 						return rslt;
 					}
@@ -427,27 +430,6 @@ Optional extensions on the jquery.inputmask base
 					}
 					return true;
 				},
-				postValidation: function(buffer, currentResult, opts) {
-					//handle maxvalue
-					var isValid = true,
-						maskedValue = opts.numericInput ? buffer.slice().reverse().join("") : buffer.join(""),
-						processValue = maskedValue.replace(opts.prefix, "");
-					processValue = processValue.replace(opts.suffix, "");
-					processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), "");
-					if (opts.radixPoint === ",") processValue = processValue.replace(Inputmask.escapeRegex(opts.radixPoint), ".");
-					//handle negation symbol
-					processValue = processValue.replace(new RegExp("^" + Inputmask.escapeRegex(opts.negationSymbol.front)), "-");
-					processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.negationSymbol.back) + "$"), "");
-					processValue = processValue === opts.negationSymbol.front ? processValue + "0" : processValue;
-
-					if (isFinite(processValue)) {
-						if (opts.max !== null && isFinite(opts.max)) {
-							isValid = parseFloat(processValue) <= parseFloat(opts.max);
-						}
-					}
-
-					return isValid;
-				},
 				definitions: {
 					"~": {
 						validator: function(chrs, maskset, pos, strict, opts) {
@@ -562,7 +544,7 @@ Optional extensions on the jquery.inputmask base
 					var maskedValue = buffer.join(""),
 						bufClone = buffer.slice();
 					//verify separator positions
-					opts.postFormat(bufClone, 0, true, opts);
+					opts.postFormat(bufClone, 0, opts);
 					if (bufClone.join("") !== maskedValue) return false;
 
 					var processValue = maskedValue.replace(opts.prefix, "");
@@ -620,69 +602,6 @@ Optional extensions on the jquery.inputmask base
 						positionInput === opts.groupSeparator ||
 						positionInput === opts.negationSymbol.front ||
 						positionInput === opts.negationSymbol.back;
-
-					return canClear;
-					if (canClear && isFinite(positionInput)) {
-						var matchRslt,
-							radixPos = $.inArray(opts.radixPoint, maskset.buffer);
-
-						//inject radixpoint
-						var radixInjection = false;
-						if (maskset.validPositions[radixPos] === undefined) {
-							maskset.validPositions[radixPos] = {
-								input: opts.radixPoint
-							};
-							radixInjection = true;
-						}
-
-						if (!strict && maskset.buffer) {
-							matchRslt = maskset.buffer.join("").substr(0, position).match(opts.regex.integerNPart(opts));
-							var pos = position + 1,
-								isNull = matchRslt == null || parseInt(matchRslt["0"].replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), "")) === 0;
-							if (isNull) {
-								while (maskset.validPositions[pos] && (maskset.validPositions[pos].input === opts.groupSeparator || maskset.validPositions[pos].input === "0")) {
-									delete maskset.validPositions[pos];
-									pos++;
-								}
-							}
-						}
-
-						var buffer = [];
-						//build new buffer from validPositions
-						for (var vp in maskset.validPositions) {
-							if (maskset.validPositions[vp].input !== undefined) buffer.push(maskset.validPositions[vp].input);
-						}
-						//remove radix Injection
-						if (radixInjection) {
-							delete maskset.validPositions[radixPos];
-						}
-
-						if (radixPos > 0) {
-							var bufVal = buffer.join("");
-							matchRslt = bufVal.match(opts.regex.integerNPart(opts));
-							if (matchRslt) {
-								if (position <= radixPos) {
-									if (matchRslt["0"].indexOf("0") === 0) {
-										canClear = matchRslt.index !== position || opts.placeholder === "0";
-									} else {
-										var intPart = parseInt(matchRslt["0"].replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), "")),
-											radixPart = parseInt(bufVal.split(opts.radixPoint)[1]);
-										if (intPart < 10 && maskset.validPositions[position] && (opts.placeholder !== "0" || radixPart > 0)) {
-											maskset.validPositions[position].input = "0";
-											maskset.p = opts.prefix.length + 1;
-											canClear = false;
-										}
-									}
-								} else if (matchRslt["0"].indexOf("0") === 0) {
-									if (bufVal.length === 3) {
-										maskset.validPositions = {};
-										canClear = false;
-									}
-								}
-							}
-						}
-					}
-
 					return canClear;
 				},
 				onKeyDown: function(e, buffer, caretPos, opts) {

+ 2 - 2
qunit/config.js

@@ -4,9 +4,9 @@ require.config({
 		"jquery": "../node_modules/jquery/dist/jquery",
 		"jqlite": "../node_modules/jqlite/jqlite",
 		"qunit": "../node_modules/qunitjs/qunit/qunit",
-		// "inputmask.dependencyLib": "../dist/inputmask/inputmask.dependencyLib.jquery",
+		"inputmask.dependencyLib": "../dist/inputmask/inputmask.dependencyLib.jquery",
 		// "inputmask.dependencyLib": "../extra/dependencyLibs/inputmask.dependencyLib",
-		"inputmask.dependencyLib": "../extra/dependencyLibs/inputmask.dependencyLib.jqlite",
+		// "inputmask.dependencyLib": "../extra/dependencyLibs/inputmask.dependencyLib.jqlite",
 		"inputmask": "../dist/inputmask/inputmask"
 		// "inputmask": "../js/inputmask"
 	}

+ 36 - 18
qunit/tests_numeric.js

@@ -364,7 +364,7 @@ define([
 		$("#testmask").SendKey(Inputmask.keyCode.BACKSPACE);
 		$("#testmask").SendKey(Inputmask.keyCode.BACKSPACE);
 		$("#testmask").SendKey(Inputmask.keyCode.BACKSPACE);
-		testmask.blur();
+		$(testmask).trigger("blur");
 		setTimeout(function() {
 			assert.equal(testmask.value, "12,345", "Result " + testmask.value);
 			done();
@@ -393,7 +393,7 @@ define([
 		assert.equal(testmask.value, "12,345.789", "Result " + testmask.value);
 
 	});
-	qunit.test("inputmask(\"decimal\", { autoGroup: true, groupSeparator: \",\" }\") - input 12345.123 + replace .123 => .789", function(assert) {
+	qunit.test("inputmask(\"decimal\", { autoGroup: true, groupSeparator: \",\" }\") - input 12345.123 + select replace .123 => .789", function(assert) {
 		var $fixture = $("#qunit-fixture");
 		$fixture.append('<input type="text" id="testmask" />');
 		var testmask = document.getElementById("testmask");
@@ -808,7 +808,7 @@ define([
 
 		testmask.focus();
 		$("#testmask").Type("123.1");
-		testmask.blur();
+		$(testmask).trigger("blur");
 		setTimeout(function() {
 			assert.equal(testmask.value, "123.1", "Result " + testmask.value);
 			done();
@@ -827,7 +827,7 @@ define([
 
 		testmask.focus();
 		$("#testmask").Type("123.1");
-		testmask.blur();
+		$(testmask).trigger("blur");
 		setTimeout(function() {
 			assert.equal(testmask.value, "123.100", "Result " + testmask.value);
 			done();
@@ -863,7 +863,7 @@ define([
 
 		testmask.focus();
 		$("#testmask").Type("-0");
-		testmask.blur();
+		$(testmask).trigger("blur");
 		setTimeout(function() {
 			assert.equal(testmask.value, "", "Result " + testmask.value);
 			done();
@@ -905,7 +905,8 @@ define([
 	});
 
 	qunit.test("inputmask(\"decimal\") - -0 - ManRueda", function(assert) {
-		var $fixture = $("#qunit-fixture");
+		var done = assert.async(),
+			$fixture = $("#qunit-fixture");
 		$fixture.append('<input type="text" id="testmask" />');
 		var testmask = document.getElementById("testmask");
 		Inputmask('decimal', {
@@ -918,10 +919,11 @@ define([
 		}).mask(testmask);
 
 		$("#testmask").val("-0");
-		testmask.blur();
-
-		assert.equal(testmask.value, "0", "Result " + testmask.value);
-
+		$(testmask).trigger("blur");
+		setTimeout(function() {
+			assert.equal(testmask.value, "0", "Result " + testmask.value);
+			done();
+		}, 0);
 	});
 
 	qunit.test("inputmask(\"integer\") - -5.000,77 - DrSammyD", function(assert) {
@@ -933,7 +935,7 @@ define([
 		}).mask(testmask);
 
 		$("#testmask").val("-5.000,77");
-		testmask.blur();
+		$(testmask).trigger("blur");
 
 		assert.equal(testmask.value, "-5000", "Result " + testmask.value);
 
@@ -1074,7 +1076,7 @@ define([
 		}).mask(testmask);
 
 		$("#testmask").val(8100000.00);
-		testmask.blur();
+		$(testmask).trigger("blur");
 
 		assert.equal(testmask.value, "810.000,00", "Result " + testmask.value);
 
@@ -1304,7 +1306,7 @@ define([
 		}).mask(testmask);
 
 		testmask.focus();
-		testmask.blur();
+		$(testmask).trigger("blur");
 		setTimeout(function() {
 			assert.equal($("#testmask")[0].inputmask._valueGet(), "$ 1,000.00", "Result " + $("#testmask")[0].inputmask._valueGet());
 			done();
@@ -1321,11 +1323,14 @@ define([
 		}).mask(testmask);
 
 		testmask.focus();
-		$("#testmask").trigger("click");
+		$("#testmask").click();
 		setTimeout(function() {
 			$("#testmask").Type("1234");
-			assert.equal($("#testmask")[0].inputmask._valueGet(), "$ 1,000.00", "Result " + $("#testmask")[0].inputmask._valueGet());
-			done();
+			$("#testmask").trigger("blur");
+			setTimeout(function() {
+				assert.equal($("#testmask")[0].inputmask._valueGet(), "$ 1,000.00", "Result " + $("#testmask")[0].inputmask._valueGet());
+				done();
+			}, 0);
 		}, 5);
 	});
 
@@ -1598,7 +1603,7 @@ define([
 		var testmask = document.getElementById("testmask");
 		Inputmask("currency").mask(testmask);
 		$("#testmask").Type("123");
-		var isValid  =Inputmask("currency").isValid(testmask.value);
+		var isValid = Inputmask("currency").isValid(testmask.value);
 		assert.equal(isValid, true, "Result " + isValid);
 	});
 	qunit.test("currency alias - $ 99,999,999.00 - isvalid - ivodopyanov", function(assert) {
@@ -1607,7 +1612,20 @@ define([
 		var testmask = document.getElementById("testmask");
 		Inputmask("currency").mask(testmask);
 		$("#testmask").Type("$ 99,999,999.00");
-		var isValid  =Inputmask("currency").isValid(testmask.value);
+		var isValid = Inputmask("currency").isValid(testmask.value);
 		assert.equal(isValid, true, "Result " + isValid);
 	});
+
+	qunit.test("numeric alias - digits 2 type 0.12 - gharlan", function(assert) {
+		var $fixture = $("#qunit-fixture");
+		$fixture.append('<input type="text" id="testmask" />');
+		var testmask = document.getElementById("testmask");
+		Inputmask("numeric", {
+			digits: 2
+		}).mask(testmask);
+		$("#testmask").Type("0.12");
+		$.caret(testmask, 0, 1);
+		$("#testmask").Type("1");
+		assert.equal($("#testmask")[0].inputmask._valueGet(), "1.12", "Result " + $("#testmask")[0].inputmask._valueGet());
+	});
 });