Add support for response pipes

Change-Id: I86905bb22ffa70b86476f0de6fa8343f687dc740
diff --git a/dev/js/spec/pipeSpec.js b/dev/js/spec/pipeSpec.js
index 93bf172..e1f47a0 100644
--- a/dev/js/spec/pipeSpec.js
+++ b/dev/js/spec/pipeSpec.js
@@ -94,12 +94,19 @@
       let e = p.element();
       expect(e.tagName).toEqual("INPUT");
       expect(e.getAttribute("type")).toEqual("text");
+      expect(e.getAttribute("name")).toEqual("pipe");
       p.append('service1');
       expect(e.getAttribute("value")).toEqual("service1");
       p.append('service2');
       expect(e.getAttribute("value")).toEqual("service1,service2");
       p.remove('service1');
       expect(e.getAttribute("value")).toEqual("service2");
+
+      p = pipeClass.create("response-pipe");
+      e = p.element();
+      expect(e.tagName).toEqual("INPUT");
+      expect(e.getAttribute("type")).toEqual("text");
+      expect(e.getAttribute("name")).toEqual("response-pipe");
     });
   });
 });
diff --git a/dev/js/src/api.js b/dev/js/src/api.js
index 3b3b821..effa9f8 100644
--- a/dev/js/src/api.js
+++ b/dev/js/src/api.js
@@ -41,11 +41,11 @@
     }
 
     docFragment += '/' + match.matchID;
-    url += '/' + docFragment;
+    url += '/' + docFragment + '?';
 
     // { spans: true, layer:x, foundry : y}
     if (param['spans'] == true) {
-      url += '?spans=true';
+      url += 'spans=true';
       docFragment += ' +spans ';
       if (param['foundry'] !== undefined) {
 	      url += '&foundry=' + param['foundry'];
@@ -61,8 +61,11 @@
     else {
       // TODO
       docFragment += ' -spans';
-      url += '?spans=false';
-    }
+      url += 'spans=false';
+    };
+
+    if (KorAP.ResponsePipe != null)
+      url += '&response-pipe=' + KorAP.ResponsePipe.toString();
 
     KorAP.API.getJSON(url, cb, "MatchInfo: " + docFragment);
   };
@@ -81,8 +84,12 @@
     }
     else {
       url += '?fields=@all'; // TODO: Maybe '*'?
-    }
+    };
 
+    if (KorAP.ResponsePipe != null)
+      url += '&response-pipe=' + KorAP.ResponsePipe.toString();
+
+    
     KorAP.API.getJSON(url, cb, "TextInfo: " + doc.textSigle);
   };
 
diff --git a/dev/js/src/init.js b/dev/js/src/init.js
index 706d898..b5c3baf 100644
--- a/dev/js/src/init.js
+++ b/dev/js/src/init.js
@@ -586,6 +586,13 @@
             pipeE.removeAttribute("name");
         };
 
+        if (KorAP.ResponsePipe != null) {
+          const pipeE = KorAP.ResponsePipe.element();
+          if (pipeE.value == "")
+            pipeE.removeAttribute("name");
+        };
+
+	
         // This would preferably set the query to be "disabled",
         // but in that case the query wouldn't be submitted
         // at all.
@@ -696,8 +703,13 @@
             d.head.appendChild(KorAP.Plugin.element());
 
             // Add pipe form
-            KorAP.Pipe = pipeClass.create();
-            d.getElementById("searchform").appendChild(KorAP.Pipe.element());
+            KorAP.Pipe = pipeClass.create("pipe");
+            let searchF = d.getElementById("searchform");
+	    searchF.appendChild(KorAP.Pipe.element());
+
+            // Add pipe form
+            KorAP.ResponsePipe = pipeClass.create("response-pipe");
+            searchF.appendChild(KorAP.ResponsePipe.element());
 
             try {
               
diff --git a/dev/js/src/pipe.js b/dev/js/src/pipe.js
index 7f0f6be..f10853e 100644
--- a/dev/js/src/pipe.js
+++ b/dev/js/src/pipe.js
@@ -1,12 +1,13 @@
 /**
  * Create a pipe object, that holds a list of services
  * meant to transform the KQ passed before it's finally
- * passed to the search engine.
+ * passed to the search engine or to transform the response
+ * afterwards.
  *
  * @author Nils Diewald
  */
 "use strict";
-define(function () {
+define(['util'], function () {
   const notNullRe = new RegExp("[a-zA-Z0-9]");
 
   // Trim and check
@@ -23,8 +24,9 @@
     /**
      * Constructor
      */
-    create : function () {
+    create : function (name) {
       const obj = Object.create(this);
+      obj._name = (name == undefined) ? 'pipe' : name;
       obj._pipe = [];
       return obj;
     },
@@ -81,6 +83,13 @@
       return this._pipe.join(',');
     },
 
+    /**
+     * Return the pipe as a an URI compliant string.
+     */
+    toUriString : function () {
+      return encodeURIComponent(this.toString());
+    },
+
 
     /**
      * Update the pipe value.
@@ -100,7 +109,7 @@
       if (e == null) {
         e = this.e = document.createElement('input');
         e.setAttribute("type","text");
-        e.setAttribute("name","pipe");
+        e.setAttribute("name",this._name);
         e.classList.add("pipe");
       };
       return e;
diff --git a/dev/js/src/plugin/server.js b/dev/js/src/plugin/server.js
index bdc4873..f8c9855 100644
--- a/dev/js/src/plugin/server.js
+++ b/dev/js/src/plugin/server.js
@@ -479,12 +479,24 @@
 
       // Modify pipes
       case 'pipe':
-        if (KorAP.Pipe != undefined) {
-          if (d.job == 'del') {
-            KorAP.Pipe.remove(d.service);
-          } else {
-            KorAP.Pipe.append(d.service);
-          };
+	let j = d.job;
+        if (
+	  ((j == 'del-after' || j == 'add-after') &&
+	   KorAP.ResponsePipe == undefined) ||
+	    KorAP.Pipe == undefined) {
+	  
+	  KorAP.log(0,"No Pipe established");
+	  break;
+	};
+
+	if (j == 'del') {
+          KorAP.Pipe.remove(d.service);
+	} else if (j == 'del-after') {
+	  KorAP.ResponsePipe.remove(d.service);
+        } else if (j == 'add-after') {
+	  KorAP.ResponsePipe.append(d.service);
+	} else {
+          KorAP.Pipe.append(d.service);
         };
         break;