Add pagination info service

Change-Id: I462f05581256575e9b52f474515cb8cb5e533d3b
diff --git a/dev/js/runner/all.html b/dev/js/runner/all.html
index c1fc29c..e60e3a8 100644
--- a/dev/js/runner/all.html
+++ b/dev/js/runner/all.html
@@ -54,7 +54,8 @@
         'spec/stateSpec',
         'spec/pipeSpec',
         'spec/sessionSpec',
-        'spec/tutSpec'
+        'spec/tutSpec',
+        'spec/pageInfoSpec'
       ],
       function () {
         window.onload();
diff --git a/dev/js/spec/pageInfoSpec.js b/dev/js/spec/pageInfoSpec.js
new file mode 100644
index 0000000..4082bb4
--- /dev/null
+++ b/dev/js/spec/pageInfoSpec.js
@@ -0,0 +1,31 @@
+define(['pageInfo'], function (pageInfoClass) {
+
+  describe('KorAP.PageInfo', function () {
+    it('should be initializable', function () {
+      let pi = pageInfoClass.create();
+      expect(pi.total()).toEqual(0);
+      expect(pi.count()).toEqual(0);
+      expect(pi.page()).toEqual(0);
+    });
+
+    it('should be read the correct values', function () {
+
+      // Create pagination element for pagination information
+      let p = document.createElement('div');
+      p.setAttribute('id', 'pagination')
+      p.setAttribute('data-page',3);
+      p.setAttribute('data-total',30);
+      p.setAttribute('data-count',25);
+
+      document.body.appendChild(p);
+      
+      pi = pageInfoClass.create();
+      expect(pi.total()).toEqual(30);
+      expect(pi.count()).toEqual(25);
+      expect(pi.page()).toEqual(3);
+
+      // Recreate initial state
+      document.body.removeChild(p);
+    });
+  });
+});
diff --git a/dev/js/spec/pluginSpec.js b/dev/js/spec/pluginSpec.js
index 966d123..edffa59 100644
--- a/dev/js/spec/pluginSpec.js
+++ b/dev/js/spec/pluginSpec.js
@@ -623,7 +623,7 @@
       KorAP.Pipe = temp;
     });
 
-    it('should reply to query information requests', function () {
+    it('should reply to query information requests (queryform)', function () {
       var manager = pluginServerClass.create();
       var id = manager.addService({"name":'Service', "src":'about:blank'});
       expect(id).toMatch(/^id-/);
@@ -660,9 +660,41 @@
       expect(data.value["q"]).toEqual("[orth=Baum]");
       expect(data.value["ql"]).toEqual("poliqarp");
       expect(data.value["cq"]).toEqual("title = /[^b]ee.+?/");
+
       // Recreate initial state
       KorAP.vc = temp;
       document.body.removeChild(f);
     });
+
+    it('should reply to query information requests (pagination)', function () {
+      var manager = pluginServerClass.create();
+      var id = manager.addService({"name":'Service', "src":'about:blank'});
+      expect(id).toMatch(/^id-/);
+      
+      // Create pagination element for pagination information
+      let p = document.createElement('div');
+      p.setAttribute('id', 'pagination')
+      p.setAttribute('data-page',3);
+      p.setAttribute('data-total',30);
+      p.setAttribute('data-count',25);
+
+      document.body.appendChild(p);
+
+      let data = {
+        "originID" : id,
+        "action" : "get",
+        "key" : "Pagination"
+      };
+      manager._receiveMsg({
+        "data" : data
+      });
+      manager.destroy();
+      expect(data.value["count"]).toEqual(25);
+      expect(data.value["page"]).toEqual(3);
+      expect(data.value["total"]).toEqual(30);
+
+      // Recreate initial state
+      document.body.removeChild(p);
+    });
   });
 });
diff --git a/dev/js/src/pageInfo.js b/dev/js/src/pageInfo.js
new file mode 100644
index 0000000..3f8f9a9
--- /dev/null
+++ b/dev/js/src/pageInfo.js
@@ -0,0 +1,21 @@
+"use strict";
+
+define(function () {
+  return {
+    create : function () {
+      const o = Object.create(this);
+      const p = document.getElementById('pagination');
+      o.ds = p ? p.dataset : {};
+      return o;
+    },
+    page : function () {
+      return parseInt(this.ds["page"] || 0);
+    },
+    total : function () {
+      return parseInt(this.ds["total"] || 0);
+    },
+    count : function () {
+      return parseInt(this.ds["count"] || 0);
+    }
+  }
+});
diff --git a/dev/js/src/plugin/server.js b/dev/js/src/plugin/server.js
index 817c0c9..d5295f7 100644
--- a/dev/js/src/plugin/server.js
+++ b/dev/js/src/plugin/server.js
@@ -9,7 +9,7 @@
  */
 "use strict";
 
-define(['plugin/widget', 'plugin/service', 'state', 'util'], function (widgetClass, serviceClass, stateClass) {
+define(['plugin/widget', 'plugin/service', 'state', 'pageInfo', 'util'], function (widgetClass, serviceClass, stateClass, pageInfoClass) {
 
   KorAP.Panel = KorAP.Panel || {};
 
@@ -475,7 +475,7 @@
           };
         }
 
-        // Get Query information from from
+        // Get Query information from form
         else if (d.key == 'QueryForm') {
           let doc = document;
           let v = d["value"] = {};
@@ -502,6 +502,15 @@
           v["q"] = p.get('q');
           v["ql"] = p.get('ql');
           v["cq"] = p.get('cq');
+        }
+
+        // Get pagination information
+        else if (d.key == 'Pagination') {
+          const pi = pageInfoClass.create();
+          let v = d["value"] = {};
+          v["page"] = pi.page();
+          v["total"] = pi.total();
+          v["count"] = pi.count();
         };
 
         // data needs to be mirrored