Support for integer values in Kalamar

Change-Id: I13994db8006fbfc213621ec46095a53600f22a0d
diff --git a/dev/js/src/vc/intval.js b/dev/js/src/vc/intval.js
new file mode 100644
index 0000000..55a5829
--- /dev/null
+++ b/dev/js/src/vc/intval.js
@@ -0,0 +1,144 @@
+/**
+ * Add integer values to the virtual corpus
+ */
+"use strict";
+
+define(['util'], function () {
+
+  return {
+    /**
+     * Create new integer value helper.
+     */
+    create : function () {
+      const a = arguments;
+      let value = 0;
+
+      // Set value
+      if (a.length >= 1) {
+        if (a[0] !== undefined)
+          value = a[0];
+      };
+
+      return Object.create(this)._init(value);
+    },
+    
+
+    // Initialize the integer value
+    _init : function (value) {
+      this.value(value);
+      return this;
+    },
+
+    /**
+     * Get or set the integer value.
+     */
+    value : function (val) {
+      if (arguments.length === 1) {
+
+        if (typeof val != "number")
+          val = parseInt(val);
+
+        if (isNaN(val))
+          val = 0;
+        
+        this._value = val;
+        this._update();
+      };
+      return this._value;
+    },
+
+
+    // Update dom element
+    _update : function () {
+      if (this._el === undefined)
+        return;
+      
+      this._value = this._input.value;
+    },
+    
+
+    /**
+     * Store the integer value.
+     * This method should be overwritten.
+     * The method receives the value.
+     */
+    store : function (v) {},
+
+
+    /**
+     * Put focus on element
+     */
+    focus : function () {
+      this._el.children[0].focus();
+    },
+
+
+    /**
+     * Get the associated dom element.
+     */
+    element : function () {
+      if (this._el !== undefined)
+        return this._el;
+
+      // Create element
+      const e = this._el = document.createElement('div');
+      e.setAttribute('tabindex', 0);
+      e.style.outline = 0;
+
+      const cl = e.classList;
+      cl.add('value');
+      
+      // Add input field
+      this._input = e.addE('input');
+      this._input.setAttribute("type", "number");
+
+      if (this.value() !== undefined) {
+        this._input.value = this.value();
+      };
+
+      // If the focus is not on the text field anymore,
+      // delegate focus to
+      this._input.addEventListener(
+        'blur',
+        function (ev) {
+          const t = this;
+          if (!t._inField) {
+	          t.value(t._input.value);
+            t.store(t.value());
+          };
+          ev.halt();
+        }.bind(this)
+      );
+
+      // Workaround to check the click is in the field
+      e.addEventListener(
+        'mousedown',
+        function () {
+          this._inField = true;
+        }.bind(this)
+      );
+
+      e.addEventListener(
+        'mouseup',
+        function () {
+          this._inField = false;
+          this._input.focus();
+        }.bind(this)
+      );
+
+      this._input.addEventListener(
+        'keypress',
+        function (ev) {
+          const t = this;
+	        if (ev.keyCode == 13) {
+	          t.value(t._input.value);
+	          t.store(t.value());
+            return false;
+	        };
+        }.bind(this)
+      );
+
+      return e;
+    }
+  };
+});