Added a method to container that allows for removing items dynamically

Change-Id: Ibcc5eee453a65943a80141ada4cebe0aed0112f6
diff --git a/dev/js/src/container/container.js b/dev/js/src/container/container.js
index 9cf5205..02d6fba 100644
--- a/dev/js/src/container/container.js
+++ b/dev/js/src/container/container.js
@@ -14,11 +14,11 @@
 
   return {
     /**
-     * 
-     * @param {Array<object>} listOfContainerItems List of items that will be placed within the container and that realise some of the functions supplied in containeritem.js
-     * @param {object} params May contain attribute containerItemClass for a base class all containerItems build upon
-     * @returns The container object
-     */
+    * 
+    * @param {Array<object>} listOfContainerItems List of items that will be placed within the container and that realise some of the functions supplied in containeritem.js
+    * @param {object} params May contain attribute containerItemClass for a base class all containerItems build upon
+    * @returns The container object
+    */
     create : function (listOfContainerItems, params) {
       var obj = Object.create(this);
       obj._init(listOfContainerItems, params);
@@ -58,8 +58,7 @@
       
       //t._el.classList.add('visible'); //Done by containermenu
 
-
-    },
+  },
 
     addItem : function (item) {
       var cItem = this._containerItemClass.create().upgradeTo(item);
@@ -90,12 +89,49 @@
         this._menu._prefix=prefItem;
       }
     },
+    
+    /**
+    * Remove a containeritem from the container by identity. Should not be used with prefix.
+    * If the active item is removed, this calls menu.next().
+    * @param {containerItemClass} item The item to be removed.
+    */
+    removeItem : function (item) {
+      if (this.items.indexOf(item) === -1){ // This is returned if indexOf cannot find the item.
+        KorAP.log(0,"Invalid item in containers removeItemByIndex: This containerItem is not contained", "container.js");
+        return;
+      };
+      if (item === this._prefix) {//CHANGE TO _cItemPrefix later!!!
+        KorAP.log(0,"Tried to remove the prefix item by calling removeItem. Please cut all connections from the menu to prefix and then\
+ the connection container._prefix before calling this function if you really want to remove the prefix.","container.js");
+        return;
+      };
+      if (item.active()) {
+        this._menu.next();
+      };
+      item._menu=undefined;
+      this._el.removeChild(item.element());
+      this.items.splice(this.items.indexOf(item) , 1);
+    },
 
     /**
-     * Exit the container unconditionally. Required so that active returns the
-     * correct result. Called when the prefix or similar resets the currently visual
-     * field.
+     * Remove a containeritem from the container by its index. Should not be used with prefix.
+     * CAUTION liveIndex, so what you see, is not the actual index within the containerItem list.
+     * This can be accessed with container.items . If the active item is removed, this calls menu.next().
+     * @param {Int} index The index of the item to be removed.
      */
+    removeItemByIndex : function (index) {
+      if (index < 0 || index >= this.length()){
+        KorAP.log(0,"Invalid index in containers removeItemByIndex: "+index, "container.js");
+        return;
+      };
+      this.removeItem(this.items[index]); //CAUTION liveIndex (what you see) != index within the list!
+    },
+
+    /**
+    * Exit the container unconditionally. Required so that active returns the
+    * correct result. Called when the prefix or similar resets the currently visual
+    * field.
+    */
     exit : function () {
       if (this.position !== undefined) {
         this.item().active(false);
@@ -114,17 +150,17 @@
     },
 
     /**
-     * @returns whether an item within the container is active (by checking this.position)
-     */
+    * @returns whether an item within the container is active (by checking this.position)
+    */
     active : function () {
       return this.position !== undefined;
     },
 
     /**
-     * Getter for items
-     * @param {Integer} index [optional] Index of to select item. If left blank this.position.
-     * @returns item at location index
-     */
+    * Getter for items
+    * @param {Integer} index [optional] Index of to select item. If left blank this.position.
+    * @returns item at location index
+    */
     item : function (index) {
       if (index === undefined) return this.items[this.position];
       return this.items[index];
@@ -149,10 +185,11 @@
         }
       }
     },
-
+    
     /**
-     * Move on to the next item in container. Returns true if we then leave the container, false otherwise.
-     */
+     * 
+    * Move on to the next item in container. Returns true if we then leave the container, false otherwise.
+    */
     next : function() {
       if (this.position !== undefined){
         this.item().active(false);
@@ -176,8 +213,8 @@
     },
 
     /**
-     * Move on to the previous item in container. Returns true if we then leave the container, false otherwise.
-     */
+    * Move on to the previous item in container. Returns true if we then leave the container, false otherwise.
+    */
     prev : function() {
       if (this.position !== undefined){
         this.item().active(false);
@@ -228,9 +265,9 @@
     },
 
     /**
-     * 
-     * @returns The number of items that are selectable. Is the actual length of the list.
-     */
+    * 
+    * @returns The number of items that are selectable. Is the actual length of the list.
+    */
     liveLength : function () {
       var ll = 0;
       for (let item of this.items){